<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jayendran Arumugam</title>
    <description>The latest articles on DEV Community by Jayendran Arumugam (@jayendran).</description>
    <link>https://dev.to/jayendran</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F388531%2Ff5f9e819-fedf-4333-a3f4-c9995ca7ef13.jpg</url>
      <title>DEV Community: Jayendran Arumugam</title>
      <link>https://dev.to/jayendran</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jayendran"/>
    <language>en</language>
    <item>
      <title>My Journey with Hacktoberfest 2021 ! 🎉</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Fri, 15 Oct 2021 07:41:30 +0000</pubDate>
      <link>https://dev.to/jayendran/my-journey-with-hacktoberfest-2021--58d9</link>
      <guid>https://dev.to/jayendran/my-journey-with-hacktoberfest-2021--58d9</guid>
      <description>&lt;h3&gt;
  
  
  2020 Journey
&lt;/h3&gt;

&lt;p&gt;So, this is my second Hacktoberfest participation. On 2020 I participated for the first time and it was a great &lt;a href="https://www.linkedin.com/posts/jayendran-arumugam-%E2%98%81%E2%98%81-76906a100_hacktoberfest-learning-azurefunctions-activity-6723131304029892608-_BgF/" rel="noopener noreferrer"&gt;experience towards Open source platforms&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc3tgonmr71ypalf51vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc3tgonmr71ypalf51vn.png" alt="2020 Hacktoberfest"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3mmeii0id34dnaji3qot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3mmeii0id34dnaji3qot.png" alt="Dev badge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the same thrill, here I almost completed my 2021 hacktoberfest 😍 &lt;em&gt;- Just waiting for standard 14 days review waiting period to get over.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2021 Story so far
&lt;/h3&gt;

&lt;p&gt;Before October I did my &lt;a href="https://www.linkedin.com/posts/jayendran-arumugam-%E2%98%81%E2%98%81-76906a100_enabling-advancedfilteringonarraysenabled-activity-6824004345256927232-hQnN" rel="noopener noreferrer"&gt;first contribution&lt;/a&gt; to azure terraform&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/hashicorp" rel="noopener noreferrer"&gt;
        hashicorp
      &lt;/a&gt; / &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm" rel="noopener noreferrer"&gt;
        terraform-provider-azurerm
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Terraform provider for Azure Resource Manager
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;a href="https://terraform.io" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fhashicorp%2Fterraform-provider-azurerm.github%2Ftf.png" alt="Terraform logo" title="Terraform" height="50"&gt;
&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Terraform Provider for Azure (Resource Manager)&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;The AzureRM Terraform Provider allows managing resources within Azure Resource Manager.&lt;/p&gt;
&lt;p&gt;When using version 4.0 of the AzureRM Provider we recommend using the latest version of Terraform Core (&lt;a href="https://developer.hashicorp.com/terraform/install" rel="nofollow noopener noreferrer"&gt;the latest version can be found here&lt;/a&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.terraform.io" rel="nofollow noopener noreferrer"&gt;Terraform Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs" rel="nofollow noopener noreferrer"&gt;AzureRM Provider Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/tree/main/examples" rel="noopener noreferrer"&gt;AzureRM Provider Usage Examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://terraform-azure.slack.com" rel="nofollow noopener noreferrer"&gt;Slack Workspace for Contributors&lt;/a&gt; (&lt;a href="https://join.slack.com/t/terraform-azure/shared_invite/enQtNDMzNjQ5NzcxMDc3LWNiY2ZhNThhNDgzNmY0MTM0N2MwZjE4ZGU0MjcxYjUyMzRmN2E5NjZhZmQ0ZTA1OTExMGNjYzA4ZDkwZDYxNDE" rel="nofollow noopener noreferrer"&gt;Request Invite&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage Example&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-hcl notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. Specify the version of the AzureRM Provider to use&lt;/span&gt;
&lt;span class="pl-en"&gt;terraform&lt;/span&gt; {
  &lt;span class="pl-en"&gt;required_providers&lt;/span&gt; {
    &lt;span class="pl-v"&gt;&lt;span class="pl-smi"&gt;azurerm&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;/span&gt;{
      source &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;hashicorp/azurerm&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
      version &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;=3.0.1&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
    }
  }
}
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. Configure the AzureRM Provider&lt;/span&gt;
&lt;span class="pl-en"&gt;provider&lt;/span&gt; &lt;span class="pl-smi"&gt;"azurerm"&lt;/span&gt; {
  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; The AzureRM Provider supports authenticating using via the Azure CLI, a Managed Identity&lt;/span&gt;
  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; and a Service Principal. More information on the authentication methods supported by&lt;/span&gt;
  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; the AzureRM Provider can be found here:&lt;/span&gt;
  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs#authenticating-to-azure&lt;/span&gt;

  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; The features block allows changing the behaviour of the Azure&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hashicorp/terraform-provider-azurerm" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;which made me a special impression towards their community members and maintainers. So, I thought of using this hacktoberfest opportunity to contribute more to azure terraform.&lt;/p&gt;

&lt;p&gt;Unfortunately my knowledge with &lt;a href="https://golang.org/" rel="noopener noreferrer"&gt;Go language&lt;/a&gt; is not that good😕 &lt;strong&gt;But&lt;/strong&gt; I don’t want that to stop my interest towards contribution. So, I went to their issues and start searching for the &lt;code&gt;good first issues&lt;/code&gt; and &lt;code&gt;documentation&lt;/code&gt; labels.&lt;/p&gt;

&lt;p&gt;Then I started fixing the issues by raising a couple of small PRs, which was merged quickly 🎉. Then I found a great step-back 😱, &lt;a href="https://dev.to/jayendran/comment/1ihgh"&gt;unfortunately azure terraform repo is not participated in the Hacktoberfest event&lt;/a&gt; 😔. But the maintainers helped me to get my PR's eligible for Hacktoberfest 🤗. See the community love ♥ &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw10zylwee50whbtgadlr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw10zylwee50whbtgadlr.jpg" alt="Terraform Slack Channel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This motivates me to complete my final 2 PR's 😍&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxah1aflo9pa3tr45rxrs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxah1aflo9pa3tr45rxrs.png" alt="Terraform Slack Channel2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is my 4 simple PR's which fixes 4 simple existing issues&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13675" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Fixing #13481
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#13675&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F25414541%3Fv%3D4" alt="jayendranarumugam avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;jayendranarumugam&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13675" rel="noopener noreferrer"&gt;&lt;time&gt;Oct 09, 2021&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Fixing #13481&lt;/p&gt;
&lt;p&gt;This should be required field as per &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/blob/main/internal/services/batch/batch_pool_resource.go#L415" rel="noopener noreferrer"&gt;https://github.com/hashicorp/terraform-provider-azurerm/blob/main/internal/services/batch/batch_pool_resource.go#L415&lt;/a&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13675" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13643" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Fix for #13380
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#13643&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F25414541%3Fv%3D4" alt="jayendranarumugam avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;jayendranarumugam&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13643" rel="noopener noreferrer"&gt;&lt;time&gt;Oct 06, 2021&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Fix for &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/issues/13380" rel="noopener noreferrer"&gt;https://github.com/hashicorp/terraform-provider-azurerm/issues/13380&lt;/a&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13643" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13599" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Fix 10822
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#13599&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F25414541%3Fv%3D4" alt="jayendranarumugam avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;jayendranarumugam&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13599" rel="noopener noreferrer"&gt;&lt;time&gt;Oct 04, 2021&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Fix the case sensitive bug in docs
Fix &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/issues/10822" rel="noopener noreferrer"&gt;https://github.com/hashicorp/terraform-provider-azurerm/issues/10822&lt;/a&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13599" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13592" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        fixing issue #13563
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#13592&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F25414541%3Fv%3D4" alt="jayendranarumugam avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;jayendranarumugam&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13592" rel="noopener noreferrer"&gt;&lt;time&gt;Oct 03, 2021&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Added the missing id references&lt;/p&gt;
&lt;p&gt;Fix for &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/issues/13563" rel="noopener noreferrer"&gt;https://github.com/hashicorp/terraform-provider-azurerm/issues/13563&lt;/a&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hashicorp/terraform-provider-azurerm/pull/13592" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;One of the interesting fact is I'm the only one who complete 4 PR's that were labeled &lt;code&gt;hacktoberfest-accepted&lt;/code&gt; on the &lt;a href="https://github.com/hashicorp/terraform-provider-azurerm/issues?q=label%3Ahacktoberfest-accepted+" rel="noopener noreferrer"&gt;&lt;code&gt;terraform-provider-azurerm&lt;/code&gt;&lt;/a&gt; project 😁&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F082pynz7t5pikkev0w0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F082pynz7t5pikkev0w0g.png" alt="hacktoberfest-accepted label"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With all this I got the official mail of completion 🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flijeecinrqmo3ua78qds.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flijeecinrqmo3ua78qds.jpg" alt="Completion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfpfm0mugtm4upejucuo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfpfm0mugtm4upejucuo.jpg" alt="progress"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Completion 🎉🎉
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0h6frlwcl54hr1dbsqy8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0h6frlwcl54hr1dbsqy8.png" alt="Final Completion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Swags 🤩
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fky5gw32h8caqedvzi7ry.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fky5gw32h8caqedvzi7ry.jpg" alt="prizes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Get your limited edition Hacktoberfest 2021 Badge
&lt;/h3&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/devteam" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg" alt="The DEV Team"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F129358%2F06481982-9611-4195-8f28-aacfac13b582.jpeg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/devteam/hacktoberfest-2021-is-here-4a3l" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Hacktoberfest 2021 is Here 🎃&lt;/h2&gt;
      &lt;h3&gt;Christina Gorton for The DEV Team ・ Oct 1 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#hacktoberfest&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#meta&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#contributorswanted&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ypp3goa4rn860sq344y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ypp3goa4rn860sq344y.png" alt="Dev Post"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>terraform</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Securing Azure SignalR +Azure App Service - Part 4</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Sun, 25 Jul 2021 10:00:10 +0000</pubDate>
      <link>https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-4-1h75</link>
      <guid>https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-4-1h75</guid>
      <description>&lt;p&gt;After a huge gap I can now officially complete this series with my final part 4. In this part I'm going to discuss about the infra and configuration part of azure signalr using terraform.&lt;/p&gt;

&lt;p&gt;The reason for this gap between other parts and this one is because at the time of writing the earlier parts, &lt;a href="https://github.com/terraform-providers/terraform-provider-azurerm/issues/11777"&gt;the terraform don't have support for the Azure signalr NAC&lt;/a&gt;.However with the &lt;a href="https://github.com/terraform-providers/terraform-provider-azurerm/blob/v2.69.0/CHANGELOG.md"&gt;recent terraform release v2.69.0 of the Terraform Provider&lt;/a&gt; we got a separate resource called &lt;a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/signalr_service_network_acl"&gt;&lt;code&gt;azurerm_signalr_service_network_acl&lt;/code&gt;&lt;/a&gt; to do so. Thanks to &lt;a href="https://github.com/neil-yechenwei"&gt;neil-yechenwei&lt;/a&gt; for his &lt;a href="https://github.com/terraform-providers/terraform-provider-azurerm/pull/12434"&gt;PR&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;On a side note, this particular &lt;em&gt;TF version v2.69.0&lt;/em&gt; is also special for me. Because I did my &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:6824004345256927232/"&gt;first ever contribution&lt;/a&gt; 🎉 to terraform in this release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating and Configuring Azure signalr using Terraform
&lt;/h2&gt;

&lt;p&gt;In this post we are going to Re-creating the infra and configuration of azure signalr which I already showcased in the &lt;a href="https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-1-bko"&gt;Part 1&lt;/a&gt; and &lt;a href="https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-2-2mf1"&gt;Part 2&lt;/a&gt;.Having said that the only difference is earlier I did from azure portal, now we are going to automate everything programmatically using Terraform. 😎&lt;/p&gt;

&lt;h3&gt;
  
  
  Resource Group
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_resource_group"&lt;/span&gt; &lt;span class="s2"&gt;"resourcegroup"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SecureSignalRRG"&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Central US"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Azure SignalR
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_signalr_service"&lt;/span&gt; &lt;span class="s2"&gt;"securesignalr"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"securesignalrservice1"&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resourcegroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resourcegroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;

  &lt;span class="nx"&gt;sku&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Standard_S1"&lt;/span&gt;
    &lt;span class="nx"&gt;capacity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  VNet
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_virtual_network"&lt;/span&gt; &lt;span class="s2"&gt;"vnet"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"vnet-cus"&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resourcegroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resourcegroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
  &lt;span class="nx"&gt;address_space&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.2.0.0/16"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Private Subnet
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"privateendpointsubnet"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                 &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"private-endpoint-subnet"&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resourcegroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;virtual_network_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_virtual_network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;address_prefixes&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10.2.1.0/27"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;enforce_private_link_endpoint_network_policies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SignalR Private Endpoint
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_private_endpoint"&lt;/span&gt; &lt;span class="s2"&gt;"signalrprivateendpt"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"signalrprivateEndpoint"&lt;/span&gt;
  &lt;span class="nx"&gt;resource_group_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resourcegroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_resource_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resourcegroup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_id&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;privateendpointsubnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;

  &lt;span class="nx"&gt;private_service_connection&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;                           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"psc-signalr"&lt;/span&gt;
    &lt;span class="nx"&gt;is_manual_connection&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="nx"&gt;private_connection_resource_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_signalr_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;securesignalr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
    &lt;span class="nx"&gt;subresource_names&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"signalr"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;As of now (25-July-2021) the &lt;code&gt;subresource_names&lt;/code&gt; for the azure signalr from &lt;a href="https://docs.microsoft.com/en-us/azure/private-link/private-endpoint-overview#private-link-resource"&gt;official docs&lt;/a&gt; is having &lt;a href="https://i.stack.imgur.com/lnCpu.png"&gt;some typo&lt;/a&gt; where its says &lt;code&gt;signalR&lt;/code&gt; . But it’s actually &lt;code&gt;signalr&lt;/code&gt; which I came to know from &lt;a href="https://stackoverflow.com/a/67668532/7073340"&gt;my original question in StackOverflow&lt;/a&gt;.To fix this I actually raised a &lt;a href="https://github.com/MicrosoftDocs/azure-docs/pull/75760"&gt;PR&lt;/a&gt;, until this PR merged please be caution on the subresource name&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Azure SignalR NAC
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_signalr_service_network_acl"&lt;/span&gt; &lt;span class="s2"&gt;"securesignalrnac"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;signalr_service_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_signalr_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;securesignalr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;default_action&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Deny"&lt;/span&gt;

  &lt;span class="nx"&gt;public_network&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;allowed_request_types&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ClientConnection"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;private_endpoint&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;id&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_private_endpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signalrprivateendpt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
    &lt;span class="nx"&gt;allowed_request_types&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ServerConnection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"RESTAPI"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I hope this series helps you to understand the basics and internals of Azure SignalR. Thanks for reading 🤗&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azuresignalr</category>
      <category>security</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Securing Azure SignalR +Azure App Service - Part 3</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Wed, 02 Jun 2021 09:53:36 +0000</pubDate>
      <link>https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-3-2gih</link>
      <guid>https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-3-2gih</guid>
      <description>&lt;p&gt;Hope everyone is safe and well 😊&lt;/p&gt;

&lt;p&gt;I thought of discussing azure signalr using terraform in this part, but today I found a very interesting things from azure signalr authentication which is not yet officially documented by Microsoft. So, I'm going to discuss that in this part. &lt;/p&gt;

&lt;h1&gt;
  
  
  Using Managed Identity
&lt;/h1&gt;

&lt;p&gt;Now a days its common and best practice to use managed identity as much as you can to avoid using the &lt;em&gt;keys/connection string/password&lt;/em&gt; in your application or event vault. So, I also would want to use managed identity for authentication from my azure app service to the Azure SignalR resource. This has been explained so well at &lt;a href="https://docs.microsoft.com/en-us/azure/azure-signalr/howto-use-managed-identity" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9i6ykfwthf3y3cyem68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9i6ykfwthf3y3cyem68.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I thought it would be super simple to implement this in my POC until I hit one road block, let’s see what is the problem and how can we solve that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enabling Managed Identity for my POC
&lt;/h2&gt;

&lt;p&gt;If you have followed this series from the beginning, you already noticed that I was doing a POC where I am trying to securely connect my azure signalr from my azure web app. If you missed the earlier parts, no worries please check this &lt;a href="https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-1-bko"&gt;Part 1&lt;/a&gt; and &lt;a href="https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-2-2mf1"&gt;Part 2&lt;/a&gt; before going further into this part.&lt;/p&gt;

&lt;p&gt;As of now my architecture will look like &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa57e54yt2km0sp96npdu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa57e54yt2km0sp96npdu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And my azure signalr NAC will look like&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6o7hw5ift2ytg6vq5pt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6o7hw5ift2ytg6vq5pt.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have securely connected my azure signal from my azure web app, but my &lt;em&gt;authentication is still using the connection string with accesskey&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;The typical azure signalr connection string will look like this.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Endpoint=https://&amp;lt;resource-name&amp;gt;.service.signalr.net;AccessKey=AsNsXs1UdfdfdererereNXa7VOVvPmZnHqnm2iCG6WTom31nXE=;Version=1.0;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In order to enable the managed identity, I followed the above MS doc and did like the steps like below&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;I need to enabled the &lt;code&gt;system assigned&lt;/code&gt; identity for my azure web app &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ke0iis5b8qqt0btrztw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ke0iis5b8qqt0btrztw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign the above &lt;code&gt;system assigned&lt;/code&gt; identity as &lt;strong&gt;SignalR App Server&lt;/strong&gt; role in my azure signalr IAM. &lt;em&gt;Please note that this role is still in &lt;u&gt;Preview&lt;u&gt;&lt;/u&gt;&lt;/u&gt;&lt;/em&gt; &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcilbdaq861whd0f77j09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcilbdaq861whd0f77j09.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update my connection by replacing the &lt;code&gt;accesskey&lt;/code&gt; with &lt;code&gt;AuthType=aad&lt;/code&gt;. So, my new connection string will be&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Endpoint=https://&amp;lt;resource-name&amp;gt;.service.signalr.net;AuthType=aad;Version=1.0;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  The problem that I hit
&lt;/h2&gt;

&lt;p&gt;After enabling the managed identity when I tried to test my app I got &lt;em&gt;500 Internal Server Error&lt;/em&gt; for the negotiate connection &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1ix52jvhfaizbous2di.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1ix52jvhfaizbous2di.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;hmm.. not much useful error/information to debug further. So, I have enabled the &lt;em&gt;Application Insights&lt;/em&gt; to see where the failure is occurring.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qm3konqrg1hywe764e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qm3konqrg1hywe764e1.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi7f21zmogz0zlqqwpfk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi7f21zmogz0zlqqwpfk.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the actual error is &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Failed in authorizing AccessKey for 'https://xxxxx-signalr-01.service.signalr.net', will retry in 3 seconds.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The real 403 Forbidden endpoint is. &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

https://signalrsevice.service.signalr.net:443/api/v1/auth/accessKey?serverId=xxxx


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Stack trace:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;Microsoft.Azure.SignalR.Common.AzureSignalRRuntimeException:&lt;br&gt;
at Microsoft.Azure.SignalR.AadAccessKey+&amp;lt;UpdateAccessKeyAsync&amp;gt;d_&lt;em&gt;23.MoveNext (Microsoft.Azure.SignalR.Common, Version=1.8.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60)&lt;br&gt;
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)&lt;br&gt;
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)&lt;br&gt;
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)&lt;br&gt;
at System.Runtime.CompilerServices.TaskAwaiter.GetResult (System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)&lt;br&gt;
at Microsoft.Azure.SignalR.AccessKeySynchronizer+&amp;lt;UpdateAccessKeyAsync&amp;gt;d&lt;/em&gt;&lt;em&gt;13.MoveNext (Microsoft.Azure.SignalR.Common, Version=1.8.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60)&lt;br&gt;
Inner exception System.Net.Http.HttpRequestException handled at Microsoft.Azure.SignalR.AadAccessKey+&amp;lt;UpdateAccessKeyAsync&amp;gt;d&lt;/em&gt;_23.MoveNext:&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Let us understand the error&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;If you read the error properly you will understand what is going wrong. &lt;/p&gt;

&lt;p&gt;From the forbidden endpoint it seems that azure signalr is trying to call a &lt;strong&gt;REST API&lt;/strong&gt; to Azure AD to get the token (for Managed identity) behind the screen&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://signalrsevice.service.signalr.net:443/api/v1/auth/accessKey?serverId=xxxx" rel="noopener noreferrer"&gt;https://signalrsevice.service.signalr.net:443/api/v1/auth/accessKey?serverId=xxxx&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Joining the dots / Fixing the Issue
&lt;/h3&gt;

&lt;p&gt;So let’s step back and think about our NAC control configuration&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6o7hw5ift2ytg6vq5pt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6o7hw5ift2ytg6vq5pt.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this we have allowed only &lt;em&gt;Server Connection&lt;/em&gt; from our private endpoint, there are a couple of other connections also visible in the dropdown. such as &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API&lt;/li&gt;
&lt;li&gt;TRACE API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp57kstyutvdynmwnuj8q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp57kstyutvdynmwnuj8q.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perfect, lets enable the &lt;em&gt;REST API&lt;/em&gt; connection also from our private endpoint. Now our NAC will look like &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof3qgkx06qwfa20flieu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fof3qgkx06qwfa20flieu.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s it, I have waited for 30min, and my application is working as expected.&lt;/p&gt;

&lt;h4&gt;
  
  
  Interesting fact
&lt;/h4&gt;

&lt;p&gt;The documentation about &lt;em&gt;REST API&lt;/em&gt; and &lt;em&gt;TRACE API&lt;/em&gt; is still not available public or under development phase. So, it is kind of difficult to get the relevant information for now about these two API’s.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn055n5vfov87na1gk9nj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn055n5vfov87na1gk9nj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Permanent fix from Microsoft
&lt;/h3&gt;

&lt;p&gt;I reached out to azure signalr team about this, and I got the response like &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We would get rid of API calls in AAD authenticating process, which means if our customer’s use our future SDK, they will not have to enable REST API explicitly. &lt;br&gt;
We will make it internally in our server connection, instead of sending a rest API. This change would take 1-2 months and the newly released SDK will be like 1.9.x. it will be documented in future release. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Overall Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flycm1l676owb1yr4wgjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flycm1l676owb1yr4wgjo.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azuresignalr</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Securing Azure SignalR +Azure App Service - Part 2</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Sun, 30 May 2021 09:33:06 +0000</pubDate>
      <link>https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-2-2mf1</link>
      <guid>https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-2-2mf1</guid>
      <description>&lt;p&gt;In the &lt;a href="https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-1-bko"&gt;previous part&lt;/a&gt;, we saw the basics of azure signalr connections. In this part we are going to see how to secure the connection between azure signalr and web app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let us secure our Azure SignalR Service
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Azure SignalR Security features
&lt;/h3&gt;

&lt;p&gt;By the design itself Azure signalr service has a public endpoint that is accessible through the internet, and it currently does not support deploying directly into a virtual network and allowing IP address because of this you cannot leverage certain networking features with the offering's resources such as network security groups, route tables, or other network dependent appliances such as an Azure Firewall. &lt;/p&gt;

&lt;p&gt;However, it allows you to create &lt;em&gt;private endpoints&lt;/em&gt; to secure the traffic between resources in your virtual network and Azure SignalR Service.&lt;/p&gt;

&lt;p&gt;You can also use Service tags and configure network security group rules to restrict inbound/outbound traffic to Azure SignalR Service.&lt;/p&gt;

&lt;p&gt;Since in our POC we are using Azure Web app, which is internal to azure, so we are going to leverage the private endpoint to secure the internal connectivity and restricting the entire public internet access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Default network access control(NAC) will looks like below
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eUU4KhY6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ef9r1quzpwoihwbb3lq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eUU4KhY6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ef9r1quzpwoihwbb3lq.png" alt="image" width="719" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we are opening/allowing the &lt;em&gt;Server and Client Connection&lt;/em&gt; to the open internet(entire public).The rest of connections like &lt;em&gt;Rest API and Trace API&lt;/em&gt; will be denied by the &lt;em&gt;Default Action&lt;/em&gt; setting&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By the way the Trace / REST API are a new connection still in development phase, as of now there is no official docs from Microsoft yet&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We are going to update this default setting as per our POC configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture Design
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZeH69gOZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a57e54yt2km0sp96npdu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZeH69gOZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a57e54yt2km0sp96npdu.png" alt="Alt Text" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Securing connection between Azure SignalR and Web App
&lt;/h3&gt;

&lt;p&gt;Our requirement is to connect the azure signalr from azure webapp. The Azure Web App can be accessible from internet. So, the way we need to configure the NAC will be like&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Configure the public network rule to only allow &lt;strong&gt;Client Connections&lt;/strong&gt; from the public network&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--waQsxy3K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uoyzamvz1ccne6nb93x9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--waQsxy3K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uoyzamvz1ccne6nb93x9.png" alt="image" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the &lt;strong&gt;Server connection&lt;/strong&gt; we need to configure it privately using the private endpoint and allow the Server Connection from that private endpoint connection, i.e., we should not allow the Server connection from the public network&lt;/p&gt;

&lt;p&gt;This step involves a series of other steps to be configured on azure app service as well, let us see that.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Configuring VNet
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;First we need a Virtual Network (VNet), which should be in the same location as your App services and azure Signalr. In my case it would be &lt;em&gt;Central US&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vnet-cus&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mt61Ncm7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0sd19911xljesz51q6un.jpg" alt="image" width="800" height="308"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create 2 subnets inside the VNet, one for our Web App and another for Private Endpoint (azure signalr) 

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;public-subnet&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;private-endpoint-subnet&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ja588d3Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2jerymn9bmzklers3oo.png" alt="image" width="800" height="222"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Integrating Azure App Service with VNet
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Configure the VNet Integration on our Web App, i.e., Integration with &lt;code&gt;vnet-cus&lt;/code&gt; and &lt;code&gt;public-subnet&lt;/code&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L5YgA7EI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9arc71c0uummjtrsdtlr.png" alt="image" width="800" height="760"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DaBlM7Ul--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4xsqr4z7qejr7ro1qcm2.png" alt="image" width="800" height="513"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Configuring Private endpoint on Azure SignalR
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;From Azure signalR menu, =&amp;gt; &lt;code&gt;Private endpoint connections&lt;/code&gt; and create a new &lt;code&gt;Private Endpoint&lt;/code&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ux0ocMeC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2y55sprb0xoojxf8sapk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ux0ocMeC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2y55sprb0xoojxf8sapk.png" alt="image" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure the Private endpoint like below&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic (note that the Region should be same as your VNet)
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EDmJusPu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8q8uithh8misggl400u1.jpg" alt="Alt Text" width="800" height="499"&gt;
&lt;/li&gt;
&lt;li&gt;Resource (Choose your SignalR service as your Resource)
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G8LxyV20--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zlmwztqw2uzgqepegcc8.jpg" alt="Alt Text" width="800" height="404"&gt;
&lt;/li&gt;
&lt;li&gt;Configuration (choose &lt;code&gt;subnet&lt;/code&gt; as &lt;code&gt;private-endpoint-subnet&lt;/code&gt;)
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0i-XgMGF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0egwaz43uptd9d629asw.jpg" alt="Alt Text" width="800" height="566"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once you created your private endpoint connection the state should be in &lt;code&gt;Approved&lt;/code&gt;- since I'm the actually the owner of the subscription it gets auto-approved for me, if you are not seeing approved state, please reach out to the resource owner&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jtCzRO2---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/39r7cn1wchg343nht9gw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jtCzRO2---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/39r7cn1wchg343nht9gw.png" alt="image" width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Configuring NAC on Azure SignalR
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;As we now have an approved private endpoint connection, it is time to secure our Server connection via private endpoint&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hJ2ku46f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u9u08so7fxvvhz6k5ctr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hJ2ku46f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u9u08so7fxvvhz6k5ctr.png" alt="image" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing
&lt;/h4&gt;

&lt;p&gt;Well, that is it, we have secured the connectivity between our azure web app and azure signalr. &lt;/p&gt;

&lt;p&gt;But WAIT? How can I make sure that my Web app is using the private endpoint and not the internet for the Azure SignalR connectivity?&lt;/p&gt;

&lt;p&gt;I am glad you asked this question, let us find it out.&lt;/p&gt;

&lt;p&gt;From my Azure Web App, I tried to nameresolve the azure signalr service.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; nameresolver signalrsevice.service.signalr.net&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WzLwBrAo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gje2d62xwocboqbpqezt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WzLwBrAo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gje2d62xwocboqbpqezt.png" alt="image" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we see the output , it is returning the private IP &lt;code&gt;10.2.1.4&lt;/code&gt; of the signalr resource which confirms that connection to signalr is private and not public.&lt;/p&gt;

&lt;p&gt;In the next part we will see the concepts related to signalr Infrastructure using terraform 💪&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azuresignalr</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Securing Azure SignalR +Azure App Service - Part 1</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Mon, 24 May 2021 14:09:13 +0000</pubDate>
      <link>https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-1-bko</link>
      <guid>https://dev.to/jayendran/securing-azure-signalr-azure-app-service-part-1-bko</guid>
      <description>&lt;p&gt;Recently I start to explore the &lt;a href="https://docs.microsoft.com/en-us/azure/azure-signalr/signalr-overview" rel="noopener noreferrer"&gt;Azure SignalR Service&lt;/a&gt; for one of my chat based web wpplication.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Azure SignalR Service simplifies the process of adding real-time web functionality to applications over HTTP. This real-time functionality allows the service to push content updates to connected clients, such as a single page web or mobile application. As a result, clients are updated without the need to poll the server or submit new HTTP requests for updates.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To put more simple word &lt;em&gt;Azure SignalR is a PaaS helps us to update the Client (UI) without refreshing the Page&lt;/em&gt; - So Cool😎 Is it?&lt;/p&gt;

&lt;p&gt;For that I need to come-up with a architecture, So I start doing a POC - "How to securely connect a Azure SignalR Service from a &lt;a href="https://github.com/aspnet/AzureSignalR-samples/tree/main/samples/ChatRoom" rel="noopener noreferrer"&gt;simple ChatBased Application&lt;/a&gt;" ?&lt;/p&gt;

&lt;p&gt;You can find more asp.net sample code for AzuresignalR from the below Repo.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/aspnet" rel="noopener noreferrer"&gt;
        aspnet
      &lt;/a&gt; / &lt;a href="https://github.com/aspnet/AzureSignalR-samples" rel="noopener noreferrer"&gt;
        AzureSignalR-samples
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Code samples for Azure SignalR
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Welcome to Azure SignalR Service&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This repository contains documentation and code samples for Azure SignalR Service.&lt;/p&gt;
&lt;p&gt;Azure SignalR Service is an Azure managed service that helps developers easily build web applications with real-time features.&lt;/p&gt;
&lt;p&gt;This service supports both &lt;a href="https://github.com/aspnet/SignalR" rel="noopener noreferrer"&gt;ASP.NET Core SignalR&lt;/a&gt; and &lt;a href="https://github.com/SignalR/SignalR" rel="noopener noreferrer"&gt;ASP.NET SignalR&lt;/a&gt;. &lt;a href="https://github.com/aspnet/SignalR" rel="noopener noreferrer"&gt;SignalR&lt;/a&gt; is an open source library that simplifies the process of adding real-time web functionality to applications.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The ASP.NET Core version is not a simple .NET Core port of the original SignalR, but a &lt;a href="https://blogs.msdn.microsoft.com/webdev/2017/09/14/announcing-signalr-for-asp-net-core-2-0/" rel="nofollow noopener noreferrer"&gt;rewrite&lt;/a&gt; of the original version. As a result, &lt;a href="https://github.com/aspnet/SignalR" rel="noopener noreferrer"&gt;ASP.NET Core SignalR&lt;/a&gt; is not backward compatible with &lt;a href="https://github.com/SignalR/SignalR" rel="noopener noreferrer"&gt;ASP.NET SignalR&lt;/a&gt; (API interfaces and behaviors are different). If it is the first time you try SignalR, we recommend you to use the &lt;a href="https://github.com/dotnet/aspnetcore/tree/main/src/SignalR" rel="noopener noreferrer"&gt;ASP.NET Core SignalR&lt;/a&gt;, it is &lt;strong&gt;simpler, more reliable, and easier to use&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;For more information about SignalR, please visit SignalR official &lt;a href="https://www.asp.net/signalr" rel="nofollow noopener noreferrer"&gt;site&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you're new to Azure SignalR Service…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/aspnet/AzureSignalR-samples" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;In this series of post, I am going to share the best practice / architecture on how to securely connect azuresignalr with azure app service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let us create a POC Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AzureSignalR
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo60r7ffem0898s7liywd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo60r7ffem0898s7liywd.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I choose the resource group, service name and keep the rest of another configurations to default.&lt;/p&gt;

&lt;p&gt;The main thing to note here is the &lt;a href="https://docs.microsoft.com/en-us/azure/azure-signalr/concept-service-mode" rel="noopener noreferrer"&gt;Service mode&lt;/a&gt; i.e, how we are going to consume/connect to the azure signalr service&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default mode- Using azure signalr for your Web application (Server based) - e.g., azure web App&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Serverless mode- Using azure signalr for your Web application (Serverless based) - e.g., static web apps, function apps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Classic mode - Mixed of the above modes. This mode is for backward compatibility for those applications created before there is default and serverless mode. It is &lt;em&gt;strongly recommended to not use this mode anymore&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu841lf8itlybp8rsjnbp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu841lf8itlybp8rsjnbp.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leave the &lt;em&gt;connectivity method&lt;/em&gt; to the public endpoint for now, we will configure this later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Azure Web App
&lt;/h3&gt;

&lt;p&gt;Create a simple webapp like below. Please keep an eye of the SKU/Size which you need at least the &lt;em&gt;Standard / Premium plan&lt;/em&gt; that support secure network access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8rg1qur4lb1i38ltw8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8rg1qur4lb1i38ltw8k.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploy the Web Chat App
&lt;/h3&gt;

&lt;p&gt;Once we provisioned our web app, we deploy the &lt;a href="https://github.com/aspnet/AzureSignalR-samples/tree/main/samples/ChatRoom" rel="noopener noreferrer"&gt;ChatRoom&lt;/a&gt; in it.&lt;/p&gt;

&lt;p&gt;After the deployment it’s time to update the azure signalr connection string to our app settings config variable called &lt;code&gt;Azure:SignalR:ConnectionString&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2di78igg9cxhko92lfcc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2di78igg9cxhko92lfcc.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, our site will look likes. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwt7f8c4br8wvt9ombfo6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwt7f8c4br8wvt9ombfo6.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Different connections in Azure Signalr service
&lt;/h2&gt;

&lt;p&gt;Before diving into the security, we first need to understand how the azure signalr works behind the screen.&lt;/p&gt;

&lt;p&gt;There are 2 different connections in azure signalr (sdk) as of now(24/May/2021)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server Connection &lt;em&gt;(Not Applicable for Serverless mode)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Client Connection &lt;em&gt;(Required for all modes)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Server Connection
&lt;/h3&gt;

&lt;p&gt;Within your SignalR application, where you have a web server that hosts a &lt;em&gt;hub (called hub server)&lt;/em&gt; and clients can have duplex real-time communication with the hub server&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;negotiate&lt;/code&gt; endpoint is exposed by Azure SignalR Service SDK for each hub.&lt;/li&gt;
&lt;li&gt;This endpoint will respond to client's negotiation requests and redirect clients to SignalR Service.&lt;/li&gt;
&lt;li&gt;Eventually, clients will be connected to SignalR Service.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Server connection flow
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5o12jwmm309opym63dl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5o12jwmm309opym63dl.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  From the &lt;a href="https://github.com/aspnet/AzureSignalR-samples/blob/main/samples/ChatRoom/Startup.cs#L31" rel="noopener noreferrer"&gt;Code&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ceivmn143yoy3eclyci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ceivmn143yoy3eclyci.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please note that for serverless mode there is no server so we could not have a Hub server. So, this &lt;em&gt;server connection&lt;/em&gt; will not be applicable for &lt;em&gt;serverless mode&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Client Connection
&lt;/h3&gt;

&lt;p&gt;There are 2 steps to establish the persistent connection.&lt;/p&gt;

&lt;p&gt;1.Client will call the negotiate request to app server which returns a redirect response with SignalR Service's URL and access token&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cr16rauakaruno8h1w7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7cr16rauakaruno8h1w7.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9y5k7w88s10t0hi1e7gd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9y5k7w88s10t0hi1e7gd.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Client use the new URL and access token to make the persistent connection to SignalR&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu81jw38lbpiko4tcqxy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu81jw38lbpiko4tcqxy3.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxregqoaig8mso1viu52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxregqoaig8mso1viu52.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WebSocket Connection:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vaseeqtr6si1i1ocq06.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vaseeqtr6si1i1ocq06.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Client Connection flow
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbonkg9zn2h2e6lbtqe65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbonkg9zn2h2e6lbtqe65.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Overall Flow
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Default mode = Server Connection + Client Connection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2ya86s6p4x6kuk4givt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw2ya86s6p4x6kuk4givt.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will continue on how we secure our azure signalr connectivity to Azure web app in the upcoming parts.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azuresignalr</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>ReadmeAloud 📢</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Wed, 24 Mar 2021 05:06:24 +0000</pubDate>
      <link>https://dev.to/jayendran/readmealoud-5glo</link>
      <guid>https://dev.to/jayendran/readmealoud-5glo</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;As a developer, we often came across many open source projects in GitHub, in which &lt;code&gt;Readme.md&lt;/code&gt; is one of the first files which we will see 🤩. It is the simplest way to understand, what the project is about, how to use it, and other related information &lt;em&gt;(kind of documentation)&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Here some known facts about readme from &lt;a href="https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-readmes" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A README is often the first item a visitor will see when visiting your repository. README files typically include information on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What the project does&lt;/li&gt;
&lt;li&gt;Why the project is useful&lt;/li&gt;
&lt;li&gt;How users can get started with the project&lt;/li&gt;
&lt;li&gt;Where users can get help with your project&lt;/li&gt;
&lt;li&gt;Who maintains and contributes to the project&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Moreover having a good readme file which will help and attract many contributors. However, it's always been challenging for any &lt;em&gt;low vision or visually impaired&lt;/em&gt; developers and contributors. As most of the readme content is in the form of text, which is quite difficult for them to read and understand. So I developed a very simple tool called &lt;strong&gt;"ReadmeAloud"&lt;/strong&gt; that can convert the raw-text from any public GitHub readme file to Speech 🎤 and also provides a way to download it in form of an mp3 file 🎵&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1b0gch5s9dbus7qbrnx.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1b0gch5s9dbus7qbrnx.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Some of the Existing Solution
&lt;/h1&gt;

&lt;p&gt;There are many solutions that already existing in the market which help to convert text into speech easily. Some of them are &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Edge Brower has an inbuilt feature called &lt;a href="https://support.microsoft.com/en-us/topic/use-learning-tools-in-the-edge-browser-78a7a17d-52e1-47ee-b0ac-eff8539015e1" rel="noopener noreferrer"&gt;&lt;strong&gt;ReadAloud&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Read aloud highlights each word on the webpage as it's being ?&amp;gt;?read. To stop listening, select the Pause button or the X to close Read aloud.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqkug3m8e0vscuubk24p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqkug3m8e0vscuubk24p.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Google Chrome Extension - &lt;a href="https://chrome.google.com/webstore/detail/read-aloud-a-text-to-spee/hdhinadidafjejdhmfkjgnolgimiaplp" rel="noopener noreferrer"&gt;Read Aloud: A Text to Speech Voice Reader&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Word for Microsoft 365 - &lt;a href="https://support.microsoft.com/en-us/office/listen-to-your-word-documents-5a2de7f3-1ef4-4795-b24e-64fc2731b001" rel="noopener noreferrer"&gt;Read Aloud&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9o5pa93xz4io2d9unon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9o5pa93xz4io2d9unon.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So you are saying that it's already existing what so special about "ReadmeAloud"?
&lt;/h2&gt;

&lt;p&gt;Well, I agree with you that most of these tools were great and helpful for everyone. However, I felt there are a couple of factors that are missing like the feature to &lt;em&gt;download the converted speech into a file(say mp3)&lt;/em&gt; and in most cases with the existing tools, either they need to pay for some license or they need to be connected with the internet to use the tool. That why I came up with my own little tool for low vision developers and focused on the most needed place for them which is Github, Readme File.&lt;/p&gt;

&lt;h1&gt;
  
  
  Architecuture
&lt;/h1&gt;

&lt;p&gt;Here I have focused on the use-case rather than the architecture or technology that the reason you can see a very simple architecture like &lt;br&gt;
-Azure front door&lt;br&gt;
-Azure Webapp&lt;br&gt;
-Azure Text-to-Speech Cognitive API &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtqckvji24wgbypjlhl4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtqckvji24wgbypjlhl4.png" alt="Architecture"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Source Code:
&lt;/h1&gt;

&lt;p&gt;This is an open-source project.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        jayendranarumugam
      &lt;/a&gt; / &lt;a href="https://github.com/jayendranarumugam/ReadmeAloud" rel="noopener noreferrer"&gt;
        ReadmeAloud
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      "ReadmeAloud" is a simple tool that can convert the raw-text from any public GitHub readme file to Speech 🎤 and also provides a way to download it in form of an mp3 file 🎵
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ReadMeAloud&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;A simple tool to provide an easy and efficient way to understand open-source projects for everyone especially visually impaired or sight-impaired friends
&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/ReadmeAloud./Images/ReadmeAloud.jpeg"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FReadmeAloud.%2FImages%2FReadmeAloud.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Architecutre&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/ReadmeAloud./Images/Architecture.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FReadmeAloud.%2FImages%2FArchitecture.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Read the detailed article from&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jayendranarumugam/ReadmeAloud" rel="noopener noreferrer"&gt;Dev Community Post&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jayendranarumugam/ReadmeAloud" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h1&gt;
  
  
  Workflow
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The user will provide a valid Github Raw Readme.md URL &lt;em&gt;e.g, &lt;a href="https://raw.githubusercontent.com/jayendranarumugam/DemoSecrets/master/README.md" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/jayendranarumugam/DemoSecrets/master/README.md&lt;/a&gt;&lt;/em&gt; in the azure front door&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the user clicks the &lt;code&gt;Search&lt;/code&gt; button the azure front door route the traffic to the azure web app (Blazor) securely then convert the text from the URL to Speech using Azure Cognitive API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the Speech is converted successfully, the audio bytes will be used to play the audio on the browser and also provide the way to download it as an mp3 file.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Code Walkthrough
&lt;/h1&gt;

&lt;p&gt;This is my first time coding a server-side blazor 😁. Mostly I reused the default boilerplate blazor code, in which I modified and added some parts for my projects e.g, &lt;code&gt;SpeechService&lt;/code&gt;. I hope I learned something about blazor now. I also put some great GitHub repos in the below &lt;strong&gt;References&lt;/strong&gt; section which help me to understand blazor. &lt;/p&gt;

&lt;p&gt;The entire logic of converting the text into speech is done using simple &lt;a href="https://docs.microsoft.com/en-us/samples/azure-samples/cognitive-services-speech-sdk/sample-repository-for-the-microsoft-cognitive-services-speech-sdk/" rel="noopener noreferrer"&gt;Azure Cognitive Speech SDK&lt;/a&gt; which you can find in &lt;a href="https://github.com/jayendranarumugam/ReadmeAloud/blob/master/Service/SpeechService.cs" rel="noopener noreferrer"&gt;&lt;code&gt;SpeechService.cs&lt;/code&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;]&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;SynthesizeAudioAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;SpeechConfig&lt;/span&gt; &lt;span class="n"&gt;speechConfigForAudioAsync&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SpeechConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromSubscription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"CognitiveAPIKey"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"CognitiveAPIRegion"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;speechConfigForAudioAsync&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetSpeechSynthesisOutputFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SpeechSynthesisOutputFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Audio16Khz32KBitRateMonoMp3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


            &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;synthesizer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SpeechSynthesizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speechConfigForAudioAsync&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;AudioConfig&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;                                

                    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;synthesizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SpeakTextAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reason&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ResultReason&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SynthesizingAudioCompleted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AudioData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

                        &lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reason&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ResultReason&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Canceled&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cancellation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SpeechSynthesisCancellationDetails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                            
                        &lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;result.AudioData&lt;/code&gt; is the converted audio in (byte array) &lt;code&gt;byte[]&lt;/code&gt; format which we will use to play in the browser and download as an mp3 file using Javascript functions like &lt;code&gt;downloadFromByteArray&lt;/code&gt;, &lt;code&gt;playAudio&lt;/code&gt; and &lt;code&gt;stopAudio&lt;/code&gt; which you can find in the &lt;a href="https://github.com/jayendranarumugam/ReadmeAloud/blob/master/wwwroot/helper.js" rel="noopener noreferrer"&gt;&lt;code&gt;helper.js&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Demo
&lt;/h1&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8vtbbqZyFBk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
&lt;h1&gt;
  
  
  Improvements:
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Readmealoud&lt;/em&gt; Is more like a small prototype where we can fit many features on top of that easily. Being said that, there are some limitations with the current design which we can improve in the future. Some of them are &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The architecture itself is currently highly coupled with the server(blazor), we can make it more scalable by introducing a separate layer for the cognitive calls i.e, the azure function &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Current limitation to convert only the public GitHub repo, we can improve that to private repo also by including some additional authentication. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Engish language is the by default for both text and speech conversation, we can improve that easily, since &lt;a href="https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/language-support#text-to-speech" rel="noopener noreferrer"&gt;azure cognitive service has a very wide variety of supported languages&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I'm not a front-end guy 🙈. So feel free to contribute to &lt;a href="https://github.com/jayendranarumugam/ReadmeAloud/" rel="noopener noreferrer"&gt;readmealoud&lt;/a&gt; with your creative ideas or UI/&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the &lt;code&gt;Readme&lt;/code&gt; file is too long then the speech conversation would take more time some time it eventually timed out too. Currently, it is suited for small &lt;code&gt;readme&lt;/code&gt; files. We can improve that by changing the architecture which we discussed above.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We can also improve the design with more accessibility for people with low vision like providing voice search capability input for GitHub repo details.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Conclusion:
&lt;/h1&gt;

&lt;p&gt;The whole idea of the &lt;em&gt;readmealoud&lt;/em&gt; is to provide an easy and efficient way to understand open-source projects for everyone especially visually impaired or sight-impaired friends. Though I showcased this for GitHub readme URL, however, we can put any valid URL for given plain text content. This is just a small idea and I hope it will reach its own audience 🤗&lt;/p&gt;
&lt;h1&gt;
  
  
  References:
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gpeipman" rel="noopener noreferrer"&gt;
        gpeipman
      &lt;/a&gt; / &lt;a href="https://github.com/gpeipman/BlazorDemo" rel="noopener noreferrer"&gt;
        BlazorDemo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Demo application for my writings about Blazor
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;BlazorDemo&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This is my simple Blazor application that demonstrates how to build SPA on Blazor and how to communicate with ASP.NET Core backend
Demo application is simple books database.&lt;/p&gt;
&lt;p&gt;Solution contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sample database BACPAC file (can be imported to MSSQL using SSMS)&lt;/li&gt;
&lt;li&gt;Client application with Blazor UI&lt;/li&gt;
&lt;li&gt;Basic select and CRUD operations are implemented in UI and in back-end&lt;/li&gt;
&lt;li&gt;Displaying of delete confirmation dialog and deleting of books&lt;/li&gt;
&lt;li&gt;Fully functioning add/edit form&lt;/li&gt;
&lt;li&gt;Pager component and support for data paging&lt;/li&gt;
&lt;li&gt;Dependency injection with custom service classes&lt;/li&gt;
&lt;li&gt;Protecting Blazor application and Azure Functions based back-end using Azure AD&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Azure AD example&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;For Azure AD there are two project in solution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BlazorDemo.AdalClient - Blazor web application that supports Azure AD&lt;/li&gt;
&lt;li&gt;BlazorDemo.AzureFunctionsBackend - Azure Functions project with all functions that form back-end for Blazor application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On Azure the following services are needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Azure AD - free one is okay&lt;/li&gt;
&lt;li&gt;Azure SQL - instance with…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gpeipman/BlazorDemo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/khalidabuhakmeh" rel="noopener noreferrer"&gt;
        khalidabuhakmeh
      &lt;/a&gt; / &lt;a href="https://github.com/khalidabuhakmeh/Farm" rel="noopener noreferrer"&gt;
        Farm
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Blazor Farm Soundboard
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>azure</category>
      <category>azurecognitive</category>
      <category>github</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Azure Synapse Analytics(workspaces): Deploy and Debug - Part 2</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Sat, 12 Sep 2020 14:33:36 +0000</pubDate>
      <link>https://dev.to/jayendran/azure-synapse-analytics-workspaces-deploy-and-debug-part-2-l5c</link>
      <guid>https://dev.to/jayendran/azure-synapse-analytics-workspaces-deploy-and-debug-part-2-l5c</guid>
      <description>&lt;h1&gt;
  
  
  Introduction:
&lt;/h1&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/jayendran/azure-synapse-analytics-workspaces-deploy-and-debug-part-1-1fap"&gt;previous post&lt;/a&gt;, we saw the basics architecture and understanding of the ARM template and parameters of synapse analytics workspace. In this post, we are going to see how to secure your synapse analytics workspace by giving proper permission through APIs.&lt;/p&gt;

&lt;h1&gt;
  
  
  Different types of APIs:
&lt;/h1&gt;

&lt;p&gt;Managing Azure Synapse workspace can be possible with two different &lt;a href="https://docs.microsoft.com/en-us/rest/api/synapse/"&gt;REST APIs&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Management API&lt;/li&gt;
&lt;li&gt;Data Plane API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usually for all the azure resources we commonly use a REST API which known as &lt;em&gt;Management API&lt;/em&gt;. In the case of synapse workspace, we have an additional one special API called &lt;em&gt;Data Plane API&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---UbC-GVU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/qxu1rgrrygfct3vixlu7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---UbC-GVU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/qxu1rgrrygfct3vixlu7.jpg" alt="Alt Text" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Management API:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The REST APIs to create and manage Azure Synapses resources through Azure Resource Manager(ARM)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mainly used for management operations such as &lt;em&gt;create,update,delete&lt;/em&gt; synapse workspace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;{api-version}&lt;/code&gt; should be &lt;strong&gt;2019-06-01-preview&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The audience claim (used for obtaining bearer token -Authorization) should be &lt;code&gt;"https://management.core.windows.net"&lt;/code&gt; or &lt;code&gt;"https://management.azure.com"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Base API Endpoint looks like&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Synapse/workspaces/{workspaceName}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Data Plane API:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The REST APIs to create and manage Azure Synapses resources through individual Azure synapse workspace endpoint itself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Used for managing individual synapse workspace operations such as &lt;em&gt;workspace role-assignments,managing and monitoring spark and sql jobs,dataflows,pipelines,datasets,linkedservices,triggers and notebooks&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;{api-version}&lt;/code&gt; should be &lt;strong&gt;2019-11-01-preview&lt;/strong&gt; or &lt;strong&gt;2020-02-01-preview&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The audience claim (used for obtaining bearer token -Authorization) should be &lt;code&gt;"https://dev.azuresynapse.net"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Base API Endpoint looks like&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://&amp;lt;workspacename&amp;gt;.dev.azuresynapse.net/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Right now there is no docs available for Data Plane API(preview). However you can get information from &lt;a href="https://github.com/Azure/azure-rest-api-specs/tree/master/specification/synapse/data-plane/Microsoft.Synapse"&gt;Github docs&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Listing available synapse workspace - Management API
&lt;/h1&gt;

&lt;p&gt;Lets see how we can call the management API to list a synapse workspace in a resource group.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; You can also directly try these API in the azure docs. Using &lt;code&gt;Try It&lt;/code&gt; Option like below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LjEP9faE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/jeuamcrcwwjo63jepi2y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LjEP9faE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/jeuamcrcwwjo63jepi2y.jpg" alt="Alt Text" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However the above method use &lt;code&gt;user impersonation&lt;/code&gt; and not &lt;code&gt;client credentials&lt;/code&gt; (using SPN) to grab the bearer token. So lets see how we can call this API using client credentials method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Bearer token
&lt;/h2&gt;

&lt;p&gt;We are going to use &lt;code&gt;client_credentials&lt;/code&gt; way of using SPN(client_id/client_secret) to get the JWT Token.&lt;br&gt;
The below is the simple curl command to invoke the Authorization API and obtain the bearer token.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Make sure that your SPN have proper RBAC role for your purpose. In this below example my SPN have &lt;strong&gt;Contributor&lt;/strong&gt; access to the Resource Group&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --request POST \
  --url https://login.microsoftonline.com/&amp;lt;tenant-id&amp;gt;/oauth2/token \
  --header 'accept:  application/json' \
  --header 'content-type: multipart/form-data;' \
  --form client_id=a35373d8-c772-4ea0-9f4b-73111376354f \
  --form 'client_secret=xxxxxxx~~2Z6Es' \
  --form grant_type=client_credentials \
  --form resource=https://management.azure.com/ \
  --form scope=Microsoft.Synapse/workspaces/read
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3599"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ext_expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3599"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1599917407"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"not_before"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1599913507"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://management.azure.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"access_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eyJ....."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insomnia Screenshot:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AKmCiLgp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/5xff3u6icyr0rr2quoqt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AKmCiLgp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/5xff3u6icyr0rr2quoqt.jpg" alt="Alt Text" width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Calling Synapse management workspace List API
&lt;/h2&gt;

&lt;p&gt;Now we got the token, lets call the actual API&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --request GET \
  --url 'https://management.azure.com/subscriptions/&amp;lt;sub-id&amp;gt;/resourceGroups/azuresynapses/providers/Microsoft.Synapse/workspaces/?api-version=2019-06-01-preview' \
  --header 'accept:  application/json' \
  --header 'authorization: Bearer eyJ0......................' \
  --header 'content-type: application/json'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/subscriptions/&amp;lt;sub-id&amp;gt;/resourceGroups/azuresynapses/providers/Microsoft.Synapse/workspaces/azsynapse002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eastus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azsynapse002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Synapse/workspaces"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"identity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SystemAssigned"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"principalId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"712cc76e-7dd9-4978-a259-6c2be5057d2f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"tenantId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;tenant-id&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"connectivityEndpoints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"web"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://web.azuresynapse.net?workspace=%2fsubscriptions%2f&amp;lt;sub-id&amp;gt;%2fresourceGroups%2fazuresynapses%2fproviders%2fMicrosoft.Synapse%2fworkspaces%2fazsynapse002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"sql"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azsynapse002.sql.azuresynapse.net"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://azsynapse002.dev.azuresynapse.net"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"sqlOnDemand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azsynapse002-ondemand.sql.azuresynapse.net"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"managedResourceGroupName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"azuresynapses"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"privateEndpointConnections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"workspaceUID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0fdd8032-3277-4d1b-b4c3-b069f48bd169"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"extraProperties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"IsScopeEnabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"provisioningState"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Succeeded"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insomnia Screenshot:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--muSdpq7I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/qj7nr6h8fgwix2mneotu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--muSdpq7I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/qj7nr6h8fgwix2mneotu.jpg" alt="Alt Text" width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Synapse Workspace Roles
&lt;/h1&gt;

&lt;p&gt;Before going to the Data Plane API. Let see what is the synapse workspace roles 🤔. Because, we are going to use Data Plane API to manage the workspace roles.&lt;/p&gt;

&lt;p&gt;There are actually 3 different roles that are unique to Synapse and aren't based on Azure roles, which are &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Synapse workspace admin&lt;/li&gt;
&lt;li&gt;Synapse SQL admin&lt;/li&gt;
&lt;li&gt;Apache Spark for Azure Synapse Analytics admin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is an &lt;a href="https://docs.microsoft.com/en-us/azure/synapse-analytics/security/how-to-set-up-access-control#how-roles-interact-with-synapse-studio"&gt;existing azure docs&lt;/a&gt; which has explained this in detail about the 3 different roles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Epqjwv6_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/auus9ftpn0krn70bnt7o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Epqjwv6_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/auus9ftpn0krn70bnt7o.jpg" alt="Alt Text" width="800" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Managing workspace Role access - Data Plane API:
&lt;/h1&gt;

&lt;p&gt;Now we understood the different roles in the synapse workspace. Lets see how we can manage these role access through Data Plane API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Bearer token
&lt;/h2&gt;

&lt;p&gt;As usual we are going to use the SPN Authentication for getting the bearer token. Here a couple of differences are the &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;em&gt;resource&lt;/em&gt; param will be &lt;code&gt;https://dev.azuresynapse.net&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;We no longer needed the &lt;em&gt;scope&lt;/em&gt; param&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Make sure that your SPN is already a part of &lt;em&gt;Workspace Admin&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --request POST \
  --url https://login.microsoftonline.com/&amp;lt;tenant-id&amp;gt;/oauth2/token \
  --header 'accept:  application/json' \
  --header 'content-type: multipart/form-data;' \
  --form client_id=a35373d8-c772-4ea0-9f4b-73111376354f \
  --form 'client_secret=xxxxxxx~~2Z6Es' \
  --form grant_type=client_credentials \
  --form resource=https://dev.azuresynapse.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3599"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ext_expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3599"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1599917407"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"not_before"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1599913507"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://dev.azuresynapse.net"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"access_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eyJ....."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insomnia Screenshot:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pgsfnMLr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/o2xtznwc6fig09clu5wo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pgsfnMLr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/o2xtznwc6fig09clu5wo.jpg" alt="Alt Text" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Calling Synapse Data Plane API to Add users to workspace roles
&lt;/h2&gt;

&lt;p&gt;Here we are going to add a user into one of the 3 roles. In order to do so, we need to perform 2 operations&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the role id&lt;/li&gt;
&lt;li&gt;Add the user (object id) to that role id.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Get the role Id
&lt;/h3&gt;

&lt;p&gt;In order to get the role id we have to use the below endpoint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://&amp;lt;workspacename&amp;gt;.dev.azuresynapse.net/rbac/roles?api-version=2020-02-01-preview
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets curl it&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --request GET \
  --url 'https://azsynapse002.dev.azuresynapse.net/rbac/roles?api-version=2020-02-01-preview' \
  --header 'accept: application/json' \
  --header 'authorization: Bearer eyJ0' \
  --header 'content-type: application/json'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6e4bf58a-b8e1-4cc3-bbf9-d73143322b78"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Workspace Admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"isBuiltIn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"c3a6d2f1-a26f-4810-9b0f-591308d5cbf1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Apache Spark Admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"isBuiltIn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7af0c69a-a548-47d6-aea3-d00e69bd83aa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sql Admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"isBuiltIn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insomnia Screenshot:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VUJj882l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/pdgdm1h7g0ge1yn8quwm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VUJj882l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/pdgdm1h7g0ge1yn8quwm.jpg" alt="Alt Text" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Add Users to the Role ID
&lt;/h3&gt;

&lt;p&gt;Now we got the role id for each roles (these role ids are same for all the synapse workspace globally). Let add the user using below endpoint&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://&amp;lt;workspacename&amp;gt;.dev.azuresynapse.net/rbac/roleAssignments?api-version=2020-02-01-preview

#Json body Param:

{
"roleId": "&amp;lt;workspace role id&amp;gt;",
"principalId": "&amp;lt;objectid of the user/group&amp;gt;"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --request POST \
  --url 'https://azsynapse002.dev.azuresynapse.net/rbac/roleAssignments?api-version=2020-02-01-preview' \
  --header 'authorization: Bearer eyJ..............' \
  --header 'content-type: application/json' \
  --data '{
    "roleId": "6e4bf58a-b8e1-4cc3-bbf9-d73143322b78",
 "principalId": "fb1e7804-9542-4412-be66-e143a10e3b1a"
}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6e4bf58a-b8e1-4cc3-bbf9-d73143322b78-fb1e7804-9542-4412-be66-e143a10e3b1a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roleId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6e4bf58a-b8e1-4cc3-bbf9-d73143322b78"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"principalId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fb1e7804-9542-4412-be66-e143a10e3b1a"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insomnia Screenshot:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FKpeAUid--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/bq707icbb57s7i72x4b7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FKpeAUid--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/bq707icbb57s7i72x4b7.jpg" alt="Alt Text" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion:
&lt;/h1&gt;

&lt;p&gt;In this Post we just saw some cool ways to manage the synapse workspace purely using APIs. This opens-up the wide space for automation. Please keep in the mind that most of these features are in preview.So there is no such grantee that all the API endpoint/operations will be the same as now which i explained in the post.I keep my best level to update this post whenever some update needs.Here I explained one of operation like synapse role assignment for data plane.Actually Data Plane API can do much more than this.Read this &lt;a href="https://github.com/Azure/azure-rest-api-specs/tree/master/specification/synapse/data-plane/Microsoft.Synapse/preview"&gt;github repo&lt;/a&gt; for getting the full power of Data Plane API Operations.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azuresynapseanalytics</category>
      <category>cloud</category>
      <category>api</category>
    </item>
    <item>
      <title>Blurry screenshots after uploaded in Dev.to Post?</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Sun, 23 Aug 2020 08:01:58 +0000</pubDate>
      <link>https://dev.to/jayendran/blurry-screenshots-after-uploaded-in-dev-to-post-5f3</link>
      <guid>https://dev.to/jayendran/blurry-screenshots-after-uploaded-in-dev-to-post-5f3</guid>
      <description>&lt;p&gt;Not sure that I'm only facing this issue !? Whenever I upload some screenshots from my PC for my post, It was looking blurry during the preview and after the publish.&lt;/p&gt;

&lt;p&gt;If you look at my recent post &lt;a href="https://dev.to/jayendran/azure-synapse-analytics-workspaces-deploy-and-debug-part-1-1fap"&gt;Azure Synapse Analytics(workspaces): Deploy and Debug - Part 1&lt;/a&gt; most of the screenshots are blurry. I tried with many different ways to get screenshots like snipper, Snagit nothing seems to work for me.&lt;/p&gt;

&lt;p&gt;Eg.,&lt;br&gt;
Some of the screenshot like&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdrm2pk3hjhydjkcq94zu.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdrm2pk3hjhydjkcq94zu.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuws0nyoc11fupx8max73.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuws0nyoc11fupx8max73.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>help</category>
    </item>
    <item>
      <title>Azure Synapse Analytics(workspaces): Deploy and Debug - Part 1</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Fri, 21 Aug 2020 16:05:25 +0000</pubDate>
      <link>https://dev.to/jayendran/azure-synapse-analytics-workspaces-deploy-and-debug-part-1-1fap</link>
      <guid>https://dev.to/jayendran/azure-synapse-analytics-workspaces-deploy-and-debug-part-1-1fap</guid>
      <description>&lt;h1&gt;
  
  
  Disclaimer:
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt; This post is provided "as-is".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Information and views expressed in this post, including URL and other Internet Web site references, may change without notice. Some examples depicted herein are provided for illustration only and are fictitious.  No real association or connection is intended or should be inferred. This document does not provide you with any legal rights to any intellectual property in any Microsoft product. You may copy and use this document for your internal, reference purposes.&lt;br&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Setting up the Definitions clear
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Azure Synapse Analytics
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-in/azure/synapse-analytics/sql-data-warehouse/sql-data-warehouse-overview-what-is" rel="noopener noreferrer"&gt;Azure Synapse&lt;/a&gt; is an analytics service that brings together enterprise data warehousing and Big Data analytics. It gives you the freedom to query data on your terms, using either serverless on-demand or provisioned resources-at scale&lt;/p&gt;
&lt;h2&gt;
  
  
  Azure Synapse Analytics Workspace &lt;em&gt;(Preview)&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Azure Synapse comes with a web-native Studio user experience that provides a single experience and model for management, monitoring, coding, and security called &lt;a href="https://docs.microsoft.com/en-in/azure/synapse-analytics/overview-what-is" rel="noopener noreferrer"&gt;synapse analytics workspace&lt;/a&gt;.&lt;br&gt;
&lt;em&gt;(As of writing this post, Azure synapse Analytics workspace is in preview)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you are familiar with &lt;a href="https://azure.microsoft.com/en-in/overview/data-platform/" rel="noopener noreferrer"&gt;Azure Data Platform&lt;/a&gt;, I can simply put synapses workspace in a single pic like below 😉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0pciicguz94dfzmj31wx.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0pciicguz94dfzmj31wx.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Roadmap of Azure Synapse Analytics
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.stack.imgur.com%2FXP6QJ.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.stack.imgur.com%2FXP6QJ.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  What we are going to see in this Post?
&lt;/h1&gt;

&lt;p&gt;We can create the synapses workspace which is a public preview from azure portal easily. However currently, there are no official docs yet available that can give detailed steps for creating synapses workspace programmatically using ARM. In this post &lt;em&gt;(part 1)&lt;/em&gt;, we are going to see how we can deploy azure synapses from the ARM template using service principal, deployment architecture, the different levels of access, and conditions.&lt;/p&gt;

&lt;p&gt;I choose this topic because right now most of the docs are still under development, I faced a lot of troubles initially, even I created few issues and PR. So this post it's just a matter of sharing my new knowledge to others 😊&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/MicrosoftDocs/azure-docs/issues/60705" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Creating Synapses Workspace through ARM Template using SPN Failing during provisioning "storageRoleDeploymentResource" with BAD Request 
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#60705&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F25414541%3Fv%3D4" alt="jayendranarumugam avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;jayendranarumugam&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/MicrosoftDocs/azure-docs/issues/60705" rel="noopener noreferrer"&gt;&lt;time&gt;Aug 12, 2020&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Is there any Specific permissions needed to include while deploying a Synapses workspace through ARM with SPN Authentication?&lt;/p&gt;
&lt;p&gt;ARM will getting failed at `storageRoleDeploymentResource' Resource provisioning state with BAD request&lt;/p&gt;
&lt;p&gt;Also the sql admin was randomly assigned with a GUID. Do we need any special permission to include in the doc to cover the SPN Deployment ?&lt;/p&gt;
&lt;p&gt;Doc Link: &lt;a href="https://docs.microsoft.com/en-us/azure/synapse-analytics/security/how-to-set-up-access-control" rel="nofollow noopener noreferrer"&gt;https://docs.microsoft.com/en-us/azure/synapse-analytics/security/how-to-set-up-access-control&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Document Details&lt;/h4&gt;
&lt;p&gt;⚠ &lt;em&gt;Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ID: 1149f92f-5b95-7b27-5525-db4f792d7937&lt;/li&gt;
&lt;li&gt;Version Independent ID: 60242818-539c-6e91-7dc8-222ccc383574&lt;/li&gt;
&lt;li&gt;Content: &lt;a href="https://docs.microsoft.com/en-us/azure/synapse-analytics/security/how-to-set-up-access-control" rel="nofollow noopener noreferrer"&gt;Secure your Synapse workspace (preview) - Azure Synapse Analytics&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Content Source: &lt;a href="https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/synapse-analytics/security/how-to-set-up-access-control.md" rel="noopener noreferrer"&gt;articles/synapse-analytics/security/how-to-set-up-access-control.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Service: &lt;strong&gt;synapse-analytics&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Sub-service: &lt;strong&gt;security&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Login: @matt1883&lt;/li&gt;
&lt;li&gt;Microsoft Alias: &lt;strong&gt;mahi&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/MicrosoftDocs/azure-docs/issues/60705" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/Azure/azure-cli/issues/14708" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Synapses Creating Big Data Pool validation error: Parameter 'BigDataPoolResourceInfo.node_count' failed to meet validation requirement.
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#14708&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F25414541%3Fv%3D4" alt="jayendranarumugam avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;jayendranarumugam&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/Azure/azure-cli/issues/14708" rel="noopener noreferrer"&gt;&lt;time&gt;Aug 07, 2020&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;blockquote&gt;
&lt;h3&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;&lt;code&gt;az feedback&lt;/code&gt; auto-generates most of the information requested below, as of CLI version 2.0.62&lt;/h3&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Describe the bug&lt;/strong&gt;
Running the command of &lt;a href="https://docs.microsoft.com/en-us/cli/azure/ext/synapse/synapse/spark/pool?view=azure-cli-latest#ext-synapse-az-synapse-spark-pool-create" rel="nofollow noopener noreferrer"&gt;creating bigdata pools for azure synapses&lt;/a&gt; getting the below error
validation error: Parameter 'BigDataPoolResourceInfo.node_count' failed to meet validation requirement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To Reproduce&lt;/strong&gt;
Download latest az cli and running the below command which was the example given at &lt;a href="https://docs.microsoft.com/en-us/cli/azure/ext/synapse/synapse/spark/pool?view=azure-cli-latest#ext-synapse-az-synapse-spark-pool-create" rel="nofollow noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;az synapse spark pool create --name testpool --workspace-name testsynapseworkspace --resource-group rg \
--spark-version 2.4 --node-count 3 --node-size Medium

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Expected behavior&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It should create a Big data pool&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Environment summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Windows 10&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Additional context&lt;/strong&gt;&lt;/p&gt;


    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Azure/azure-cli/issues/14708" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/Azure/azure-rest-api-specs/issues/10500" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Synapses Data Plane API Audience should remove Trailing
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#10500&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F25414541%3Fv%3D4" alt="jayendranarumugam avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;jayendranarumugam&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/Azure/azure-rest-api-specs/issues/10500" rel="noopener noreferrer"&gt;&lt;time&gt;Aug 18, 2020&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Am not exactly sure that this is a bug in the code itself or docs need to be updated. Either way, I'm creating this issue for both the case&lt;/p&gt;
&lt;p&gt;Data Plane APIs Synapses Audience need to remove extra &lt;strong&gt;/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As per the below &lt;a href="https://docs.microsoft.com/en-us/rest/api/synapse/?source=docs" rel="nofollow noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Set the Authorization header to a JSON Web Token that you obtain from Azure Active Directory. For data-plane operations, be sure to obtain a token for the resource URI / audience claim "&lt;a href="https://dev.azuresynapse.net/" rel="nofollow noopener noreferrer"&gt;https://dev.azuresynapse.net/&lt;/a&gt;", NOT "&lt;a href="https://management.core.windows.net/" rel="nofollow noopener noreferrer"&gt;https://management.core.windows.net/&lt;/a&gt;" nor "&lt;a href="https://management.azure.com/" rel="nofollow noopener noreferrer"&gt;https://management.azure.com/&lt;/a&gt;". For more information, see Acquire an access token.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;From the above statement has the audience claim &lt;strong&gt;&lt;a href="https://dev.azuresynapse.net/" rel="nofollow noopener noreferrer"&gt;https://dev.azuresynapse.net/&lt;/a&gt;&lt;/strong&gt; is not working, and will give an error like&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    "code": "InvalidTokenAuthenticationAudience",
    "message": "Token Authentication failed with SecurityTokenInvalidAudienceException - IDX10214: Audience validation failed. Audiences: '[PII is hidden]'. Did not match: validationParameters.ValidAudience: '[PII is hidden]' or validationParameters.ValidAudiences: '[PII is hidden]'."
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But once we removed the trailing slash at the end of the URL (/) which will be &lt;strong&gt;&lt;a href="https://dev.azuresynapse.net" rel="nofollow noopener noreferrer"&gt;https://dev.azuresynapse.net&lt;/a&gt;&lt;/strong&gt; then the APIs are working.&lt;/p&gt;
&lt;p&gt;Please make necessary fix either in the docs or the API&lt;/p&gt;
&lt;p&gt;Reference: &lt;a href="https://docs.microsoft.com/en-us/rest/api/synapse/?source=docs" rel="nofollow noopener noreferrer"&gt;https://docs.microsoft.com/en-us/rest/api/synapse/?source=docs&lt;/a&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Azure/azure-rest-api-specs/issues/10500" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/Azure/azure-powershell/pull/12622" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Fixed the Address/Ip Typo
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#12622&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars3.githubusercontent.com%2Fu%2F25414541%3Fv%3D4" alt="jayendranarumugam avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;jayendranarumugam&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/Azure/azure-powershell/pull/12622" rel="noopener noreferrer"&gt;&lt;time&gt;Aug 10, 2020&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Fixed the Address/Ip Typo&lt;/p&gt;

&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Description&lt;/h2&gt;

&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Checklist&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] I have read the &lt;a href="../blob/master/CONTRIBUTING.md#submitting-changes"&gt;&lt;em&gt;Submitting Changes&lt;/em&gt;&lt;/a&gt; section of &lt;a href="../blob/master/CONTRIBUTING.md"&gt;&lt;code&gt;CONTRIBUTING.md&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] The title of the PR is clear and informative&lt;/li&gt;
&lt;li&gt;[x] The appropriate &lt;code&gt;ChangeLog.md&lt;/code&gt; file(s) has been updated:
&lt;ul&gt;
&lt;li&gt;For any service, the &lt;code&gt;ChangeLog.md&lt;/code&gt; file can be found at &lt;code&gt;src/{{SERVICE}}/{{SERVICE}}/ChangeLog.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A snippet outlining the change(s) made in the PR should be written under the &lt;code&gt;## Upcoming Release&lt;/code&gt; header -- no new version header should be added&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] The PR does not introduce &lt;a href="../blob/master/documentation/breaking-changes/breaking-changes-definition.md"&gt;breaking changes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] If applicable, the changes made in the PR have proper test coverage&lt;/li&gt;
&lt;li&gt;[x] For public API changes to cmdlets:
&lt;ul&gt;
&lt;li&gt;[x] a cmdlet design review was approved for the changes in &lt;a href="https://github.com/Azure/azure-powershell-cmdlet-review-pr" rel="noopener noreferrer"&gt;this repository&lt;/a&gt; (&lt;em&gt;Microsoft internal only&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;[x] the markdown help files have been regenerated using the commands listed &lt;a href="../blob/master/documentation/development-docs/help-generation.md#updating-all-markdown-files-in-a-module"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Azure/azure-powershell/pull/12622" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  Getting ARM Template from Azure Portal
&lt;/h1&gt;

&lt;p&gt;We can easily grab the template for the synapses workspace template from the Azure portal itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F61ktaocgv3yqprrx4opl.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F61ktaocgv3yqprrx4opl.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdrm2pk3hjhydjkcq94zu.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdrm2pk3hjhydjkcq94zu.JPG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After getting the ARM template will look like the below&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;ARM Parameters,&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h1&gt;
  
  
  Architecture of Synapses Workspace:
&lt;/h1&gt;

&lt;p&gt;Here I'm just giving a very simple &amp;amp; high-level architecture image for understanding the synapses workspace components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs878xvo3p5hvoika6cgg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs878xvo3p5hvoika6cgg.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you see synapses workspace itself consist of a storage account gen2 and default on-demand SQL pool, it can be accessed by 3 different roles &lt;em&gt;(NOT RBAC roles)&lt;/em&gt; called &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workspace Admin&lt;/li&gt;
&lt;li&gt;SQL Admin&lt;/li&gt;
&lt;li&gt;Spark Admin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll explain these roles in part 2. As of now just assume its a role needed for any user to access the workspace.&lt;/p&gt;

&lt;h1&gt;
  
  
  ARM Graphical Viewer
&lt;/h1&gt;

&lt;p&gt;We can easily understand this ARM using VS Code + &lt;a href="https://marketplace.visualstudio.com/items?itemName=bencoleman.armview" rel="noopener noreferrer"&gt;ARM Template View extension&lt;/a&gt;. Here the final result will look like&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuws0nyoc11fupx8max73.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuws0nyoc11fupx8max73.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great! now we understood that synapses workspace needs a &lt;em&gt;storage account(gen2)&lt;/em&gt; and a &lt;em&gt;container (gen2filessystem)&lt;/em&gt; in it. The ARM also has some other components like &lt;em&gt;roleassignments, managedidentitysqlcontrolsettings, and firewall&lt;/em&gt;. which are basically for giving correct permissions for our workspace, we will look more about these in the below sections.&lt;/p&gt;

&lt;h1&gt;
  
  
  Analyzing Parameters from ARM
&lt;/h1&gt;

&lt;p&gt;Most of the parameters are self-explanatory, however, some of them depend on some high privilege permission. Let's see those&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;setWorkspaceIdentityRbacOnStorageAccount&lt;/strong&gt; :
If true, this will assign the role of the workspace(MSI) as the storage blob contributor to the existing or the new storage account.
This needs &lt;em&gt;Microsoft.Authorization/roleAssignments/write&lt;/em&gt; permission which requires &lt;strong&gt;owner&lt;/strong&gt; role or at-least &lt;strong&gt;User Access Administrator&lt;/strong&gt;. So make sure you give owner/User Access Administrator access to your SPN if you set this true.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The below table will help you to understand this parameter based on your SPN access.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;grantWorkspaceIdentityControlForSql&lt;/strong&gt; :&lt;br&gt;
Grant CONTROL to the workspace's managed identity on all SQL pools and SQL on-demand&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;isNewFileSystemOnly&lt;/strong&gt;: If the storage account new/exist but when we need to create a new filesystem, use this variable to true&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;setSbdcRbacOnStorageAccount&lt;/strong&gt; : If we need to enable the user, (whose object id will be provided in &lt;strong&gt;userObjectId&lt;/strong&gt;) as the &lt;em&gt;Storage Blob contributor&lt;/em&gt; to the Storage account gen2.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a nested task which depends on &lt;strong&gt;setWorkspaceIdentityRbacOnStorageAccount&lt;/strong&gt; parameter, i.e., this will be executed only if you provide &lt;em&gt;setWorkspaceIdentityRbacOnStorageAccount&lt;/em&gt; as true. &lt;br&gt;
&lt;em&gt;E.g&lt;/em&gt; If you provide &lt;em&gt;setWorkspaceIdentityRbacOnStorageAccount&lt;/em&gt; as false and even if you provide &lt;em&gt;setSbdcRbacOnStorageAccount&lt;/em&gt; as true it won't affect anything.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I hope you get some additional information about the synapse workspace from this post. I'll explain more about API's, security best practice in &lt;a href="https://dev.to/jayendran/azure-synapse-analytics-workspaces-deploy-and-debug-part-2-l5c"&gt;Part 2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azuresynapseanalytics</category>
      <category>azurearm</category>
      <category>datawarehouse</category>
    </item>
    <item>
      <title>Azure AD Managed Identity: Connecting Azure Web App and Slots with Azure SQL DB (without credentials)</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Wed, 17 Jun 2020 13:55:46 +0000</pubDate>
      <link>https://dev.to/jayendran/azure-ad-managed-identity-connecting-azure-web-app-and-slots-with-azure-sql-db-without-credentials-51f8</link>
      <guid>https://dev.to/jayendran/azure-ad-managed-identity-connecting-azure-web-app-and-slots-with-azure-sql-db-without-credentials-51f8</guid>
      <description>&lt;h1&gt;
&lt;a&gt;&lt;/a&gt;
Introduction&lt;/h1&gt;

&lt;p&gt;&lt;span&gt;Managed Identity is a great way for connecting services in Azure without having to provide credentials like username, password or even clientid or client secrets. Please note that not &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/services-support-managed-identities"&gt; all azure services support managed identity.&lt;/a&gt;&lt;span&gt;  There are many great articles and blogs which discuss about in depth of managed identity and their types.You can see some of them in the See Also section.In this article we are going to see 2 main popular Azure resources to connect each other without providing any credentials in the code, they are &lt;/span&gt;&lt;a href="https://docs.microsoft.com/en-in/azure/app-service/overview"&gt;azure app service&lt;/a&gt;&lt;span&gt; (front-end) and &lt;/span&gt;&lt;a href="https://azure.microsoft.com/en-in/services/sql-database/"&gt;azure sql database&lt;/a&gt;&lt;span&gt; (back-end) by using System Managed Identity. &lt;br&gt;
&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h1&gt;
&lt;a&gt;&lt;/a&gt;Using typical Connection String way&lt;/h1&gt;

&lt;p&gt;&lt;span&gt;Usually we use the connection string to connect an azure sql database from any front-end. For instance lets say we are developing a dotnet application and want to connect to a back end (azure sql db) we will simply use the connection string like in the &lt;strong&gt;&lt;em&gt;web.config&lt;/em&gt;&lt;/strong&gt; below &lt;em&gt;(which may be different for some other applications)&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;connectionStrings&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"DbConnection"&lt;/span&gt; &lt;span class="na"&gt;connectionString=&lt;/span&gt;&lt;span class="s"&gt;"server=&amp;lt;sqlinstance&amp;gt;.database.windows.net;database=&amp;lt;dbname&amp;gt;;Uid=localadmin;Pwd={your_password_here};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;"&lt;/span&gt; &lt;span class="na"&gt;providerName=&lt;/span&gt;&lt;span class="s"&gt;"System.Data.SqlClient"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/connectionStrings&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;From the &lt;strong&gt;C# code&lt;/strong&gt; we will consume the connection string from the web.config to establish the connectivity from our code to backend like &lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connectionstring&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;//Executing some sql code&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
&lt;a&gt;&lt;/a&gt;Azure Key Vault for Connection String&lt;/h2&gt;

&lt;p&gt;It is always good to store this type of connection string in a secure place like &lt;a href="https://social.technet.microsoft.com/wiki/contents/articles/51871.net-core-2-managing-secrets-in-web-apps.aspx"&gt;&lt;br&gt;
azure key vault secrets&lt;/a&gt;. However we still need to store the client id and client secret  in a web.config if we aren't using the Managed Identity.See again storing a secret in a web.config, which is more like a chicken and egg problem  🐔🥚🐔&lt;br&gt;&lt;br&gt;
Here we need more sophisticated solution to solve this, which is the Managed Identity.&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
&lt;a&gt;&lt;/a&gt;Using System Managed Identity way&lt;/h1&gt;



&lt;h2&gt;
&lt;a&gt;&lt;/a&gt;Step 1: Enabling System Managed Identity in Web App&lt;/h2&gt;

&lt;p&gt;First we need to enable the System Managed Identity in our web app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/4405.0.JPG"&gt;&lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--xUMs_i8u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://social.technet.microsoft.com/wiki/resized-image.ashx/__size/550x0/__key/communityserver-wikis-components-files/00-00-00-00-05/4405.0.JPG" width="550" height="480"&gt;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;If you are using any slots you should also enable the same options in the slots as well &lt;br&gt;
&lt;a href="https://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/365844751.1.JPG"&gt;&lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--52a-K1SZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://social.technet.microsoft.com/wiki/resized-image.ashx/__size/550x0/__key/communityserver-wikis-components-files/00-00-00-00-05/365844751.1.JPG" width="550" height="486"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;h2&gt;
&lt;a&gt;&lt;/a&gt;Step 2: Creating Managed Identity User in Azure SQL&lt;/h2&gt;
&lt;h2&gt;&lt;a&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After we enabled the System Managed Identity in Azure App, we have to create a Managed Identity User in Azure sql db. To do so we must enable the Azure Active Directory Admin, then login to the database using the Active Directory account from either SSMS
or Azure Data Studio. &lt;br&gt;
&lt;a href="https://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/404335.2.JPG"&gt;&lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--rBre6Aiq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://social.technet.microsoft.com/wiki/resized-image.ashx/__size/550x0/__key/communityserver-wikis-components-files/00-00-00-00-05/404335.2.JPG" width="550" height="99"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;We have to run the below query in the corresponding database.&lt;br&gt;
&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;EXTERNAL&lt;/span&gt; &lt;span class="n"&gt;PROVIDER&lt;/span&gt; 

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;slots&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;slotname&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;EXTERNAL&lt;/span&gt; &lt;span class="n"&gt;PROVIDER&lt;/span&gt; &lt;span class="c1"&gt;-- For apps in the slots&lt;/span&gt;

&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;db_datareader&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;MEMBER&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;-- gives permission for normal app read to database&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;db_datawriter&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;MEMBER&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;-- gives permission for normal app write to database&lt;/span&gt;

&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;db_datareader&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;MEMBER&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;slots&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;slotname&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;-- gives permission for slot app  read to database&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;db_datawriter&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;MEMBER&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;slots&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;slotname&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;-- gives permission for slot app  write to database&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By doing the above we are creating a user for our system managed identity of our app in the backend and providing required permissions like read/write a database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/2112.3.JPG"&gt;&lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--OM_Ap-Mi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://social.technet.microsoft.com/wiki/resized-image.ashx/__size/550x0/__key/communityserver-wikis-components-files/00-00-00-00-05/2112.3.JPG" width="550" height="378"&gt;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
&lt;a&gt;&lt;/a&gt;Step 3: Remove the credentials from the Connection String&lt;/h2&gt;

&lt;p&gt;Finally we have to remove the credentials details like userid , password from the connection string ,like below&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;connectionStrings&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;add&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"DbConnection"&lt;/span&gt; &lt;span class="na"&gt;connectionString=&lt;/span&gt;&lt;span class="s"&gt;"server=&amp;lt;sqlinstance&amp;gt;.database.windows.net;database=&amp;lt;dbname&amp;gt;;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;"&lt;/span&gt; &lt;span class="na"&gt;providerName=&lt;/span&gt;&lt;span class="s"&gt;"System.Data.SqlClient"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/connectionStrings&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
&lt;a&gt;&lt;/a&gt;Step 4: 1-Line Magic Code&lt;/h2&gt;

&lt;p&gt;Now we just need to add a single line of code (magic) in our application before &lt;em&gt; opening the connection &lt;/em&gt;like below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccessToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;AzureServiceTokenProvider&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;GetAccessTokenAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://database.windows.net/"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sometime during the local testing if you have more than one subscription you will get error at the above line. To resolve that please use the optional parameters called tenant id for &lt;em&gt;GetAccessTokenAsync &lt;/em&gt;method&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccessToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;AzureServiceTokenProvider&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;GetAccessTokenAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://database.windows.net/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tenant&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In order to use the above code you also need to import a package called &lt;strong&gt;Microsoft.Azure.Services.AppAuthentication.&lt;br&gt;
&lt;/strong&gt; You can install it from nuget  like below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Install-Package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Microsoft.Azure.Services.AppAuthentication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1.5.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So finally our code will look like below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connectionstring&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccessToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;AzureServiceTokenProvider&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;GetAccessTokenAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://database.windows.net/"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;//Executing some sql code&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
&lt;a&gt;&lt;/a&gt;Step 5: Testing it Locally&lt;/h2&gt;

&lt;p&gt;In order to test this from local machine we have to use &lt;a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest"&gt;&lt;br&gt;
Azure CLI 2.0 or above&lt;/a&gt;. So install the Az Cli then run the command &lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;az&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will prompt you for the credentials. Once you successfully logged in you will see your subscription details like in the below pic &lt;br&gt;&lt;br&gt;
&lt;a href="https://social.technet.microsoft.com/wiki/cfs-file.ashx/__key/communityserver-wikis-components-files/00-00-00-00-05/4861.azlogin.jpg"&gt;&lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--B10np4sY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://social.technet.microsoft.com/wiki/resized-image.ashx/__size/550x0/__key/communityserver-wikis-components-files/00-00-00-00-05/4861.azlogin.jpg" width="550" height="200"&gt;&lt;/a&gt; Now you can run your application in local.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Note: If you have more than 1 tenant access you have to explicitly pass the tenantid in the &lt;span&gt;GetAccessTokenAsync&lt;/span&gt; method)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After the successful run you can deploy the application in Azure. &lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
&lt;a&gt;&lt;/a&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;Azure Managed Identity is going to remove the way of storing credentials in code even in azure key vault. In this article we saw only 2 services. But there are more and more services are coming along the way. Using this great feature we can do all the things inside Azure very safely and not leaking any credentials to others. &lt;br&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;See Also&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joonasw.net/view/azure-service-bus-managed-identities"&gt;https://joonasw.net/view/azure-service-bus-managed-identities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thomasthornton.cloud/2019/01/07/azure-managed-identities/"&gt;https://thomasthornton.cloud/2019/01/07/azure-managed-identities/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Azure-Samples/app-service-msi-entityframework-dotnet"&gt;https://github.com/Azure-Samples/app-service-msi-entityframework-dotnet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>azuresql</category>
      <category>managedidentity</category>
      <category>azurewebapp</category>
    </item>
    <item>
      <title>Serverless Prediction of a Product Feedback</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Sat, 23 May 2020 10:52:09 +0000</pubDate>
      <link>https://dev.to/jayendran/serverless-prediction-of-a-product-feedback-3o7h</link>
      <guid>https://dev.to/jayendran/serverless-prediction-of-a-product-feedback-3o7h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is part of &lt;a href="https://aka.ms/ServerlessSeptember2020" rel="noopener noreferrer"&gt;#ServerlessSeptember&lt;/a&gt;. You'll find other helpful articles, detailed tutorials, and videos in this all-things-Serverless content collection. New articles from community members and cloud advocates are published every week from Monday to Thursday through September. &lt;/p&gt;

&lt;p&gt;Find out more about how Microsoft Azure enables your Serverless functions at &lt;a href="https://docs.microsoft.com/azure/azure-functions/?WT.mc_id=servsept20-devto-cxaall" rel="noopener noreferrer"&gt;https://docs.microsoft.com/azure/azure-functions/&lt;/a&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Story behind my use-case
&lt;/h1&gt;

&lt;p&gt;If you are developing any product, &lt;em&gt;feedback&lt;/em&gt; is much more important. You have to trace each and every feedback like feature request or Bugs/Issues. Even Microsoft has a dedicated website &lt;a href="https://feedback.azure.com/" rel="noopener noreferrer"&gt;https://feedback.azure.com/&lt;/a&gt; for tracking all its feedback related to their &lt;em&gt;Azure Product&lt;/em&gt;. For issues they have to use GitHub issues &lt;a href="https://github.com/MicrosoftDocs/azure-docs/issues" rel="noopener noreferrer"&gt;https://github.com/MicrosoftDocs/azure-docs/issues&lt;/a&gt; for all their open Source Projects. This would be a great way to track all the feedback on the open-source project. But how we can track Internal Project feedback efficiently! &lt;/p&gt;

&lt;p&gt;Because ...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.tenor.com%2Fimages%2Fa22a51ec2a7b6f777a6270bbea4ac828%2Ftenor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.tenor.com%2Fimages%2Fa22a51ec2a7b6f777a6270bbea4ac828%2Ftenor.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this blog, we are going to use a better way to solve this problem of getting feedback about our internal projects with the help of azure server-less computing and AI 😎&lt;/p&gt;

&lt;p&gt;Let's jump into our Project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26BGIqWh2R1fi6JDa/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26BGIqWh2R1fi6JDa/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Architecture
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FAzureDevStories.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FAzureDevStories.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's assume that we are going to develop a new internal product called &lt;em&gt;myproduct&lt;/em&gt; (wow what a unique name 🤣 )&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l0uc76ZPu3wuSp5uB4/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l0uc76ZPu3wuSp5uB4/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm going to use Yammer to get all the feedback's from our internal users.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Yammer&lt;/strong&gt; is your social layer across Microsoft 365, integrating with the apps and services you already use to stay productive. You can create and edit documents, take notes, and share resources as a group. And get back to your conversations from anywhere in Microsoft 365.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you notice the architecture, most of the main components are server-less like azure functions and logic app. There are many advantages of using server-less is our architecture. some of them are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost Efficient (Consumption model)&lt;/li&gt;
&lt;li&gt;Less Development time (logic-app : drag/drop model)&lt;/li&gt;
&lt;li&gt;Quick Deployments etc., &lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Components used
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/en-in/microsoft-365/yammer/yammer-overview" rel="noopener noreferrer"&gt;Yammer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-in/services/cognitive-services/language-understanding-intelligent-service/" rel="noopener noreferrer"&gt;LUIS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-in/services/logic-apps/" rel="noopener noreferrer"&gt;Logic Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/devops/boards/work-items/guidance/agile-process-workflow?view=azure-devops" rel="noopener noreferrer"&gt;AzureDevOps WorkItems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-in/services/cosmos-db/" rel="noopener noreferrer"&gt;Cosmos DB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-signalr/signalr-overview" rel="noopener noreferrer"&gt;Signal R&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-in/services/functions/" rel="noopener noreferrer"&gt;Azure Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The components in this architecture are more flexible. i.e, you can easily replace one component with the other similar one.&lt;/p&gt;

&lt;p&gt;For e.g &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can use &lt;em&gt;MS Teams&lt;/em&gt; or any other internal chat-based tool instead of yammer for getting the feedback.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Azure DevOps WorkItem&lt;/em&gt; Tracking can be replaced by &lt;em&gt;github/JIRA&lt;/em&gt; kind of tools easily.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Cosmos DB&lt;/em&gt; can be replaced by the &lt;em&gt;Azure Table Storage&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;See how flexible this architecture is when we start using more and more server-less components 😉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/d1MoLyoyipfMc/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/d1MoLyoyipfMc/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Workflow
&lt;/h1&gt;

&lt;p&gt;Here I'm focusing on a product that was developed for internal purposes. So our end-users are nothing but the employees in our organization. So I used &lt;em&gt;Yammer&lt;/em&gt; as my main platform to gather all the feedback and bugs about &lt;em&gt;myproduct&lt;/em&gt; from users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logic App
&lt;/h2&gt;

&lt;p&gt;As soon as a user posted in yammer our logic app will be triggered. Let's see how our logic app now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FLogicApp.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FLogicApp.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Yammer
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_LUIS.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_LUIS.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  LUIS
&lt;/h3&gt;

&lt;p&gt;I'm using LUIS to predict what are the intents in the yammer post(utterances)&lt;/p&gt;

&lt;p&gt;Intents: Bugs🐞 /Features&lt;br&gt;
Utterances: Yammer post which users posted&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An &lt;em&gt;Utterances&lt;/em&gt; are input from the user that your app needs to interpret.&lt;br&gt;&lt;br&gt;
An &lt;em&gt;Intent&lt;/em&gt; represents a task or action the user wants to perform. It is a purpose or goal expressed in a user's utterance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I trained by LUIS with some user-defined Intents. You can also find my exported LUIS model in the &lt;a href="https://github.com/jayendranarumugam/AzureDevStories/tree/master/LUIS%20App" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_LUIS.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_LUIS.JPG"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  AzureDevOps WorkItems
&lt;/h3&gt;

&lt;p&gt;If the predicted intent is Bug then I'll create a bug work-item in AzureDevOps else if it is Feedback then I'll create Feature work-item as simple as that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_AzDevOps_Bug.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_AzDevOps_Bug.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_AzDevOps_Feature.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_AzDevOps_Feature.JPG"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  CosmosDB
&lt;/h3&gt;

&lt;p&gt;All are fine, but what happens if the intent is neither bug nor feedback?&lt;br&gt;
In such a case, &lt;strong&gt;None&lt;/strong&gt; Intent will be our predicted Intent. This None Intent is more important for Re-training our LUIS model. So I'm going to save these intents safely in CosmosDB&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_Cosmos.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FDevTo%2FLogicApp_Cosmos.JPG"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Azure Functions
&lt;/h2&gt;

&lt;p&gt;OK, I've saved the &lt;em&gt;None&lt;/em&gt; Intents in cosmos DB, now I'm going to build a static website where developers can view all the information about the none intents in near &lt;strong&gt;real-time&lt;/strong&gt; without doing any refresh.&lt;/p&gt;

&lt;p&gt;This is quite an interesting part, where I've learned how powerful the Azure-Functions are! Thanks to &lt;a href="https://twitter.com/nthonyChu" rel="noopener noreferrer"&gt;Anthony Chu&lt;/a&gt; for his wonderful &lt;a href="https://anthonychu.ca/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fanthonychu.ca%2Fpost-assets%2F2018-09-24%2Farchitecture-overview.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fanthonychu.ca%2Fpost-assets%2F2018-09-24%2Farchitecture-overview.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image Credits: &lt;a href="https://twitter.com/nthonyChu" rel="noopener noreferrer"&gt;Anthony Chu&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've used Signal-R for a Broadcasting real-time updates from cosmos DB using CosmosDB Change-Feed in Azure Function.&lt;/p&gt;

&lt;p&gt;If you see the below image I've four azure functions totally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FAzFunction.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FAzFunction.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's start with &lt;code&gt;OnDocumentsChanged&lt;/code&gt; class, which will be triggered automatically for every insert/update on the target Cosmos DB.&lt;/p&gt;

&lt;p&gt;For every new/updated item in the cosmos DB, I'll simply adding those items as messages in the &lt;code&gt;SignalRHub(SignalRHubItems)&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OnDocumentsChanged&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OnDocumentsChanged"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nf"&gt;CosmosDBTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;databaseName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"MyProductDB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;collectionName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Items"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ConnectionStringSetting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"AzureWebJobsCosmosDBConnectionString"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;LeaseCollectionName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"leases"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;CreateLeaseCollectionIfNotExists&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
             &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;updatedItems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;SignalR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HubName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SignalRHubItems"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;IAsyncCollector&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SignalRMessage&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;signalRMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;updatedItems&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;signalRMessages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SignalRMessage&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;Target&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SignalRHubUpdatedItems"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;Arguments&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;});&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;SignalRInfo&lt;/code&gt; class will be called from the static web page to make connections to SignalRhub to read the message from that.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SignalRInfo&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SignalRInfo"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Anonymous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"get"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;SignalRConnectionInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HubName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SignalRHubItems"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;SignalRConnectionInfo&lt;/span&gt; &lt;span class="n"&gt;connectionInfo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OkObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connectionInfo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;GetItems&lt;/code&gt; class will also be called from the static web page to make connections to CosmosDB to get/read all the Items.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GetItems&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"GetItems"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Anonymous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"get"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;CosmosDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MyProductDB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Items"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ConnectionStringSetting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"AzureWebJobsCosmosDBConnectionString"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
                &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;updatedItems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OkObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;updatedItems&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
                &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
             &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OkObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;updatedItems&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Finally &lt;code&gt;StaticFileFunction&lt;/code&gt; class is simple Az-function to show our statics web page &lt;em&gt;(index.html)&lt;/em&gt;, inside &lt;code&gt;www&lt;/code&gt; folder&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StaticFileFunction&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;staticFilesFolder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"www"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;defaultPage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DEFAULT_PAGE"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt;
    &lt;span class="s"&gt;"index.html"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DEFAULT_PAGE"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"StaticFileFunction"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;HttpResponseMessage&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Anonymous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"get"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Route&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetFilePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

                &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HttpResponseMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpStatusCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OK&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FileMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;StreamContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MediaTypeHeaderValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;GetMimeType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HttpResponseMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpStatusCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotFound&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetScriptPath&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HOME"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;@"site\wwwroot"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EnvironmentVariableTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetFilePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;staticFilesPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetFullPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;GetScriptPath&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;staticFilesFolder&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fullPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetFullPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;staticFilesPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="nf"&gt;IsInDirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;staticFilesPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid path"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;isDirectory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isDirectory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;fullPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;defaultPage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fullPath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;IsInDirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;parentPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;childPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DirectoryInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parentPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DirectoryInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;childPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;do&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FullName&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FullName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetMimeType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FileExtensionContentTypeProvider&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryGetContentType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it! Let's test it out &lt;/p&gt;
&lt;h1&gt;
  
  
  Testing
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Posted some posts in Yammer.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FYammer_Post1.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FYammer_Post1.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FYammer_Post2.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FYammer_Post2.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FYammer_Post3.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FYammer_Post3.JPG"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Checking AzureDevOps
&lt;/h2&gt;

&lt;p&gt;It's created bugs and features correctly. However one of the posts got missed meaning it's predicted as &lt;em&gt;None&lt;/em&gt; Intent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FAzureDevOps_WorkItems.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FAzureDevOps_WorkItems.JPG"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Checking CosmosDB
&lt;/h2&gt;

&lt;p&gt;So our post got inserted in cosmos DB correctly.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FCosmosDB.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FCosmosDB.JPG"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Static Web Page
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FAzFunction_CosmosLiveFeed.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjayendranarumugam%2FAzureDevStories%2Fmaster%2FImages%2FAzFunction_CosmosLiveFeed.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the live-stream&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStories%2Fblob%2Fmaster%2FImages%2FDevTo%2FDemo.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStories%2Fblob%2Fmaster%2FImages%2FDevTo%2FDemo.gif%3Fraw%3Dtrue"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And it's Working Finally!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/SAIGPdSohpC7JdRcHT/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/SAIGPdSohpC7JdRcHT/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Source Code
&lt;/h1&gt;

&lt;p&gt;This is an Open-Source Project, view the full source code in the below link and feel free to provide feedback/issues to me 😎&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jayendranarumugam" rel="noopener noreferrer"&gt;
        jayendranarumugam
      &lt;/a&gt; / &lt;a href="https://github.com/jayendranarumugam/AzureDevStories" rel="noopener noreferrer"&gt;
        AzureDevStories
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Serverless Prediction of a Product Feedback (#AzureDevStories)&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This Project is created as a part of &lt;a href="https://devstories.konfhub.com/" rel="nofollow noopener noreferrer"&gt;Azure Dev Stories Challenge&lt;/a&gt; and won the &lt;a href="https://devstories.konfhub.com/#winners" rel="nofollow noopener noreferrer"&gt;First Prize&lt;/a&gt; 🏆&lt;/p&gt;

&lt;p&gt;I've published a detailed article about this project in the &lt;a href="https://dev.to/jayendran/serverless-prediction-of-a-product-feedback-3o7h" rel="nofollow"&gt;Dev Community&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture Diagram&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/AzureDevStories./Images/AzureDevStories.jpg"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStories.%2FImages%2FAzureDevStories.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Components Used&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Yammer&lt;/li&gt;
&lt;li&gt;LUIS&lt;/li&gt;
&lt;li&gt;Logic Apps&lt;/li&gt;
&lt;li&gt;AzureDevOps WorkItems&lt;/li&gt;
&lt;li&gt;Cosmos DB&lt;/li&gt;
&lt;li&gt;Signal R&lt;/li&gt;
&lt;li&gt;Azure Functions&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Yammer&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Users provide their feedback about the product. It could be many, for the demo purpose I just choose 2 topics &lt;em&gt;(Bug, Feature)&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/AzureDevStoriesImages/Yammer_Post1.JPG"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStoriesImages%2FYammer_Post1.JPG"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
 &lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/AzureDevStoriesImages/Yammer_Post2.JPG"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStoriesImages%2FYammer_Post2.JPG"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
 &lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/AzureDevStoriesImages/Yammer_Post3.JPG"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStoriesImages%2FYammer_Post3.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;LUIS&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Creating Intents for Bugs and Feedbacks in the LUIS.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/AzureDevStoriesImages/LUIS.JPG"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStoriesImages%2FLUIS.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Logic Apps&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Predicting the Intents i.e, Bug or Feedback based on the Yammer Post by the user and take necessary actions&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/AzureDevStoriesImages/LogicApp.JPG"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStoriesImages%2FLogicApp.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;AzureDevOps WorkItems&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Create Bug/Feature if the top intent of the Post matched with LUIS&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/AzureDevStories./Images/AzureDevOps_WorkItems.JPG"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStories.%2FImages%2FAzureDevOps_WorkItems.JPG" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Cosmos DB&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Insert the document in Cosmos DB if the top intent of the Post is &lt;em&gt;None&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/jayendranarumugam/AzureDevStoriesImages/CosmosDB.JPG"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fjayendranarumugam%2FAzureDevStoriesImages%2FCosmosDB.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Signal R&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Serverless Signal R used to autorefresh the WebPage for the…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jayendranarumugam/AzureDevStories" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h1&gt;
  
  
  Reference
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://anthonychu.ca/post/azure-functions-static-file-server/" rel="noopener noreferrer"&gt;https://anthonychu.ca/post/azure-functions-static-file-server/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anthonychu.ca/post/cosmosdb-real-time-azure-functions-signalr-service/" rel="noopener noreferrer"&gt;https://anthonychu.ca/post/cosmosdb-real-time-azure-functions-signalr-service/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azuredevstories</category>
      <category>azure</category>
      <category>serverless</category>
      <category>azurefunctions</category>
    </item>
    <item>
      <title>Quantum Computing: An Introduction</title>
      <dc:creator>Jayendran Arumugam</dc:creator>
      <pubDate>Fri, 21 Jun 2019 07:02:44 +0000</pubDate>
      <link>https://dev.to/jayendran/quantum-computing-an-introduction-4djd</link>
      <guid>https://dev.to/jayendran/quantum-computing-an-introduction-4djd</guid>
      <description>&lt;h1&gt;Introduction&lt;/h1&gt;

&lt;p&gt;We often hear that quantum computers will be the future and it will help us to solve all world problems like world hunger, natural disaster, and many complex problems. Understanding the concept of quantum and its behavior is much necessary to solve these kinds of problems. In this blog, we will understand the history and the concepts of quantum. There are many ways to understand why quantum mechanics is hard to simulate. Perhaps the simplest is to see that quantum theory can be interpreted as saying that matter, at a quantum level, is simultaneously in a host of different possible configurations (known as states) at the same time.&lt;/p&gt;

&lt;h1&gt;Quantum History&lt;/h1&gt;

&lt;p&gt;It all begins around 1672 where big scientists working on finding the behavior of light. Initially, Newton finds that light is the form of particles, later Robert Hooke found that light is a wave and not a particle, until the problem of the photoelectric effect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fisaac-newton-robert-hooke.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fisaac-newton-robert-hooke.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Photoelectric Effect&lt;/h1&gt;

&lt;p&gt;When light hits a cable next to another cable electrons jump from one to another and it was thought it happened because waves of light made atoms vibrate until they ejected an electron. But when it was measured carefully a big contradiction was found, it’s only happened for the light of some wavelengths for others no electrons jump at all.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2F73bacc9f2bf571752483a89ef6c61a94f07470f7.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2F73bacc9f2bf571752483a89ef6c61a94f07470f7.png%3Fw%3D1024"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h1&gt;Einstein Invention of Quantum&lt;/h1&gt;

&lt;p&gt;In 1905, Einstein tries to solve this photoelectric problem by making a big hypothesis combining the two previous ones.  &lt;/p&gt;

&lt;p&gt;“What if light were made not of waves or particles but of both that is what if light were made of wave packets (photons)” &lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fmw9d.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fmw9d.gif"&gt;&lt;/a&gt;Light exist in both waves and particles- photons

&lt;/p&gt;

&lt;p&gt;Quantum is the smallest part of something, and nothing smaller than this of that “something” exists. Such as a cent is a quantum of American money, as is an electron of the electric charge. Photon is, in that respect, the quantum of electromagnetic field(light). &lt;/p&gt;

&lt;p&gt;It was a revolutionary view and it opened the field of quantum physics. &lt;/p&gt;

&lt;p&gt;He also awarded the Nobel prize for this invention.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2F2321d57a1a791345fe2fe2065f2ad1da.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2F2321d57a1a791345fe2fe2065f2ad1da.jpg"&gt;&lt;/a&gt;Einstein Receiving Nobel Prize

&lt;/p&gt;

&lt;h1&gt;Quantum Properties&lt;/h1&gt;

&lt;h2&gt;Superposition&lt;/h2&gt;

&lt;p&gt;Quantum superposition states that an object that is not being observed exists in all possible states at once- it is in a superposition. This superposition is a combination of all the possible states that a particle could theoretically be in. &lt;/p&gt;

&lt;p&gt;E.g., Electron in an Atom – Because until you observe the electron in the atom, it could be located anywhere outside the nucleus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fsuperposition_of_electron.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fsuperposition_of_electron.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Quantum Entanglement&lt;/h2&gt;

&lt;p&gt;When any two quantum particles interact, they are entangled, and it means that their quantum states are interdependent. There’s a correlation between them, so that if one is in one particular state, then the other one has to have some other particular state across space and time. &lt;/p&gt;

&lt;p&gt;E.g., 2 electrons have been entangled then this may create a situation where those two spins are correlated, such that if one of the electrons has a spin up, the other must-have spin down.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Ftumblr_ore4xsbson1vjhboso1_400.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Ftumblr_ore4xsbson1vjhboso1_400.gif"&gt;&lt;/a&gt;Quantum Entangelement of two electrons

&lt;/p&gt;

&lt;h1&gt;Quantum Computing&lt;/h1&gt;

&lt;p&gt;Quantum computing is the use of quantum-mechanical phenomena such as superposition and entanglement to perform computation. A quantum computer is used to perform such computation, which can be implemented theoretically or physically. &lt;/p&gt;

&lt;h2&gt;Qubit&lt;/h2&gt;

&lt;p&gt;In quantum computing, a qubit or quantum bit is the basic unit of quantum information. &lt;/p&gt;

&lt;p&gt;To understand Qubit theoretically, let’s introduce a vector notation for bits as follows: a bit is represented by a column vector of two elements (α,β)T, where α stands for 0 and β for 1. Now the bit 0 is represented by the vector (1,0)T and the bit 1 by (0,1)T. Just like before(classical bit), there are only two possible values(qubit in superposition). &lt;/p&gt;

&lt;p&gt;The foundational core of quantum computing is to store information in quantum states of matter and to use quantum gate operations to compute on that information, by harnessing and learning to “program” quantum interference &lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fquantum_teaser_photon.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fquantum_teaser_photon.gif"&gt;&lt;/a&gt;A Qubit existing in a superposition

&lt;/p&gt;

&lt;h1&gt;Modern Computer Vs Quantum Computer&lt;/h1&gt;

&lt;p&gt;Our modern computers made up of simple components to do simple operations like Main Memory, Arithmetic Unit, Control Unit. Looking into the depth of our Computer chips contains modules, which contain logic gates that contain transistors. A transistor is nothing but a switch that either can block or allow the way of information coming through. Here information is nothing but bits of 0’s or 1’s. Combination of several bits used to represent more complex information. &lt;/p&gt;

&lt;p&gt;Here, more importantly, the bits are exhibit either in 0’s or 1’s which can yield many different possible data like below &lt;/p&gt;

&lt;p&gt;2 bits = &amp;gt; 2&lt;sup&gt;4&lt;/sup&gt;= &amp;gt; 8 Game Boy &lt;/p&gt;

&lt;p&gt;4 bits = &amp;gt; 2&lt;sup&gt;7&lt;/sup&gt; memories= &amp;gt; 128 ASCII Characters &lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fclassical_computing.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fclassical_computing.png"&gt;&lt;/a&gt;Out of 16 possible combinations 1 will be used

&lt;/p&gt;

&lt;p&gt;Now the Quantum computer a way to different that it used qubit where it can exhibit both 0 and 1 at the same time or these or a quantum superposition of 0 and 1 as long as we are unobserved. But the instance we measure it collapses into one of the definite states. &lt;/p&gt;

&lt;p&gt;For 4 classical bits can be in one of the 2&lt;sup&gt;4&lt;/sup&gt; different configurations at a time, which is 16 possible combinations like (0000 to 1111) out of which we can use just one. &lt;/p&gt;

&lt;p&gt;For 4 Qubits in superposition, however, can be all of those 16 combinations at once &lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fquantum_computing.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fquantum_computing.png"&gt;&lt;/a&gt;All 16 possible combination exisit in superposition

&lt;/p&gt;

&lt;h1&gt;Some Applications of Quantum Computer&lt;/h1&gt;


&lt;h2&gt;Cryptography&lt;/h2&gt; Quantum computers used to create private keys for encrypting messages from one place to another. So that hackers could not secretly copy the key perfectly, due to the quantum uncertainty. They would have to break the laws of quantum physics to hack the key. 


&lt;h2&gt;Teleportation&lt;/h2&gt; Teleportation of information from one location to another without physically transmitting the information (Quantum entangled property)

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fq45ni2h57eibdepk7qqhesyrgu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2Fq45ni2h57eibdepk7qqhesyrgu.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt; Problem with Quantum Computing Now &lt;/h1&gt;


&lt;h2&gt;Scaling:&lt;/h2&gt; If we want to use quantum computers to solve real problems, they will need to explore the large space of quantum states. The number of qubits is important, but so is the error rate. By nature, qubits are fragile. They require a precise environment and state to operate correctly, and they’re highly prone to outside interference. So, if we try to scale the qubits currently error rates are also increased.  

&lt;p&gt;Currently, Microsoft, IBM, and other pioneers are working on creating a more stable Qubit called Topological Qubit. It can store information in a more stable form as compared to other Qubits. Topological Qubit will allow Quantum computers to scale at a much higher rate and allow us to build a quantum computer large and stable enough to solve our most challenging problems. &lt;/p&gt;

&lt;h1&gt; Microsoft Quantum Development Kit (Q#) &lt;/h1&gt;

&lt;p&gt;Microsoft Quantum Development Kit to empower a growing community with tools to unlock the quantum revolution for our tasks, problems, and solutions. The high-level programming language, Q#, was designed to address the challenges of quantum information processing; it is integrated into a software stack that enables a quantum algorithm to be compiled down to the primitive operations of a quantum computer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2F1cbp8hbrb63bwwav.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjayendranarumugam.files.wordpress.com%2F2019%2F06%2F1cbp8hbrb63bwwav.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;In this blog, I just wrote an introduction to the world of quantum. I hope this blog helps you to understand the basics things of quantum. There is much more to achieve in the near future. The significance of quantum is very huge demand in the future, with the help of quantum we can solve many world problems easily and efficiently&lt;/p&gt;

</description>
      <category>physics</category>
      <category>quantumcomputing</category>
      <category>qubits</category>
      <category>quantum</category>
    </item>
  </channel>
</rss>
