<?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: kemurayama</title>
    <description>The latest articles on DEV Community by kemurayama (@kemurayama).</description>
    <link>https://dev.to/kemurayama</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%2F356780%2F36c8cef3-c9aa-4790-8044-9d0d55aafbc9.png</url>
      <title>DEV Community: kemurayama</title>
      <link>https://dev.to/kemurayama</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kemurayama"/>
    <language>en</language>
    <item>
      <title>Azure Communication Services Group Call Demo on Azure Static Web App</title>
      <dc:creator>kemurayama</dc:creator>
      <pubDate>Sat, 20 Mar 2021 04:48:44 +0000</pubDate>
      <link>https://dev.to/kemurayama/azure-communication-services-group-call-demo-3bp7</link>
      <guid>https://dev.to/kemurayama/azure-communication-services-group-call-demo-3bp7</guid>
      <description>&lt;p&gt;If you want to add video, chat, SMS and telephony-over-IP to your application, &lt;strong&gt;Azure Communication Services&lt;/strong&gt; is the good option.&lt;/p&gt;

&lt;p&gt;This post introduces a quick sample that is Group Call demo app on Azure Static Web App.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Azure Communication Services ?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/ja-jp/services/communication-services/"&gt;Azure Communication Services&lt;/a&gt; is cloud-based communications services with rich communication experiences used by Microsoft Teams&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Azure Static Web Apps ?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/services/app-service/static/"&gt;Azure Static Web App&lt;/a&gt; is a web services where you can host your application with your frontend framework such as React.js, Vue.js and more.&lt;/p&gt;

&lt;p&gt;Backend is powered by &lt;a href="https://azure.microsoft.com/en-us/services/functions/"&gt;Azure Functions&lt;/a&gt; that is a serverless service on Azure. &lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;This post uses below repository. you can &lt;code&gt;git clone&lt;/code&gt; or &lt;code&gt;fork&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kemurayama"&gt;
        kemurayama
      &lt;/a&gt; / &lt;a href="https://github.com/kemurayama/acs-group-call-demo"&gt;
        acs-group-call-demo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Azure Communication Services Group Call Demo
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;On Frontend, it uses &lt;a href="https://reactjs.org/"&gt;React.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This Application also uses &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-python"&gt;Azure Functions Python&lt;/a&gt; for creating Azure Communication Services User ID and issuing VoIP token.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/"&gt;Node.js v1.14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/"&gt;Python 3.8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=windows%2Ccsharp%2Cbash"&gt;Azure Functions Core Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://classic.yarnpkg.com/en/docs/install/#windows-stable"&gt;yarn&lt;/a&gt; (Optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Create Azure Communication Services
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/communication-services/quickstarts/create-communication-resource?tabs=windows&amp;amp;pivots=platform-azp"&gt;Create Azure Communication Services&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set Connection String value at &lt;code&gt;local.settings.json&lt;/code&gt; after creating New Project for Azure Functions.&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;"IsEncrypted"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Values"&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;"FUNCTIONS_WORKER_RUNTIME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"COMMUNICATION_SERVICES_CONNECTION_STRING"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;h2&gt;
  
  
  Setup Local
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Clone This Repository&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;yarn install&lt;/code&gt; (or &lt;code&gt;npm install&lt;/code&gt;) at repository root&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;api&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;Create New Azure Functions Project. (&lt;code&gt;Ctrl + Shift + P&lt;/code&gt; then choose &lt;code&gt;Azure Functions: Create New Project...&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Activate virtualenv if not activated (&lt;code&gt;source .venv/bin/activate&lt;/code&gt; or &lt;code&gt;\.venv\Scripts\activate&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;api&lt;/code&gt; by VS Code&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Start Group Call at Local
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;yarn start&lt;/code&gt; or &lt;code&gt;npm start&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;func host start&lt;/code&gt; at api&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Create user with ACS ID
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0s36QLYy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/acsname.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0s36QLYy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/acsname.png" alt="createuser"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Issue VoIP Token
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FPpN9phT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/token.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FPpN9phT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/token.png" alt="token"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Choose your Devices and Join Group Call
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GGcSDBcP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/selectdeviceandjoin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GGcSDBcP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/selectdeviceandjoin.png" alt="deviceandjoin"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Enjoy your group call
&lt;/h3&gt;

&lt;p&gt;You can join the same group call if you input the same group call ID.&lt;/p&gt;

&lt;p&gt;When you want to try camera in group call, you have to turn on &lt;strong&gt;BEFORE&lt;/strong&gt; you join.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MJvPh06a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/group.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MJvPh06a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/group.png" alt="deviceandjoin"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Deploy to Azure Static Web App
&lt;/h2&gt;
&lt;h3&gt;
  
  
  How to deploy
&lt;/h3&gt;

&lt;p&gt;Clone or Fork this repository.&lt;/p&gt;

&lt;p&gt;Go to Azure Portal and &lt;a href="https://docs.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=vanilla-javascript"&gt;create Azure Static Web Apps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Choose your cloned repo and set build details.&lt;/p&gt;

&lt;p&gt;Build Presets: React&lt;br&gt;
App location: /&lt;br&gt;
Api location: api&lt;br&gt;
Outout location: build&lt;/p&gt;
&lt;h3&gt;
  
  
  Set Up Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/static-web-apps/application-settings"&gt;Set Azure Communication Services connection string on Azure Static Web App&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;key: &lt;code&gt;COMMUNICATION_SERVICES_CONNECTION_STRING&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;value: Connection String Value&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Troubleshooting
&lt;/h3&gt;

&lt;p&gt;If you failed something on Azure Static Web App, you can add &lt;a href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview"&gt;Application Insights&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set environment variables in the same way.&lt;/p&gt;

&lt;p&gt;See &lt;a href="https://docs.microsoft.com/ja-jp/azure/static-web-apps/apis"&gt;API support in Azure Static Web Apps Preview with Azure Functions&lt;/a&gt; and &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-monitoring"&gt;Monitor Azure Functions&lt;/a&gt; for more details.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;key: &lt;code&gt;APPINSIGHTS_INSTRUMENTATIONKEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;value: app instrumentation key value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can monitor your backend API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yMn67XBv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/appinsights.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yMn67XBv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/acs/appinsights.png" alt="appinsights"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;This application uses below libraries but the latest version of communication-calling is &lt;a href="https://www.npmjs.com/package/@azure/communication-calling"&gt;&lt;code&gt;1.0.0-beta.9&lt;/code&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"@azure/communication-calling": "^1.0.0-beta.6",&lt;/li&gt;
&lt;li&gt;"@azure/communication-common": "^1.0.0-beta.5",&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;del&gt;I will update library someday.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated the latest libraries&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kemurayama"&gt;
        kemurayama
      &lt;/a&gt; / &lt;a href="https://github.com/kemurayama/acs-group-call-demo"&gt;
        acs-group-call-demo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Azure Communication Services Group Call Demo
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>azure</category>
    </item>
    <item>
      <title>Access AAD Protected App with Managed Identity</title>
      <dc:creator>kemurayama</dc:creator>
      <pubDate>Thu, 29 Oct 2020 13:44:25 +0000</pubDate>
      <link>https://dev.to/kemurayama/access-aad-protected-app-with-managed-identity-4gmm</link>
      <guid>https://dev.to/kemurayama/access-aad-protected-app-with-managed-identity-4gmm</guid>
      <description>&lt;p&gt;In my previous post, I explained how to access AAD protected Function App with AAD app client ID and secret.&lt;br&gt;
You can protect your API endpoints by AAD that is much safer than Function key.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/kemurayama" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M4HAcviQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--1UMe__2a--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/356780/36c8cef3-c9aa-4790-8044-9d0d55aafbc9.png" alt="kemurayama image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/kemurayama/access-aad-protected-azure-web-apps-azure-functions-2oc1" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Access AAD protected Azure Functions&lt;/h2&gt;
      &lt;h3&gt;kemurayama ・ Oct  5 '20 ・ 4 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#azure&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#azurefunctions&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#aad&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;However, in previous scenario, &lt;strong&gt;you still need to manage AAD client ID and secret securely&lt;/strong&gt;. As your service grow, your API will also increase and it becomes more difficult to recognize all secrets.&lt;/p&gt;

&lt;p&gt;In such scenario, you can use &lt;strong&gt;Managed Identity&lt;/strong&gt; to reduce your concern if your APIs/Apps are hosted on Azure Web Apps, Azure Functions or Azure Virtual Machines.&lt;/p&gt;

&lt;p&gt;This post will explain how to set Managed Identity and access AAD protected app with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1eS2_Xut--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/access_mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1eS2_Xut--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://keyomuradev.azureedge.net/access_mi.png" alt="access managed identity"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;If you are new to AAD, Azure Functions and Azure Web Apps, you can check tutorials first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-whatis"&gt;What is Azure Active Directory?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/app-service/quickstart-dotnetcore?pivots=platform-linux"&gt;Quickstart: Create an ASP.NET Core web app in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-vs-code?pivots=programming-language-csharp"&gt;Quickstart: Create a function in Azure using Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In SPA scenario, you can check this repository&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Azure-Samples"&gt;
        Azure-Samples
      &lt;/a&gt; / &lt;a href="https://github.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi"&gt;
        ms-identity-javascript-angular-spa-aspnetcore-webapi
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An Angular single-page application that authenticates users with Azure AD and calls a protected ASP.NET Core web API using MSAL Angular v2 (Preview)
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
  &lt;tr&gt;
  &lt;th&gt;page_type&lt;/th&gt;
  &lt;th&gt;languages&lt;/th&gt;
  &lt;th&gt;products&lt;/th&gt;
  &lt;th&gt;description&lt;/th&gt;
  &lt;th&gt;urlFragment&lt;/th&gt;
  &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;div&gt;sample&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;
&lt;table&gt;
  &lt;tbody&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;div&gt;javascript&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;typescript&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;csharp&lt;/div&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;
&lt;table&gt;
  &lt;tbody&gt;
  &lt;tr&gt;
  &lt;td&gt;&lt;div&gt;angular&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;dotnet-core&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;msal-angular&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;microsoft-identity-web&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;azure-active-directory&lt;/div&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;This sample demonstrates an Angular single-page application calling a .NET Core web API secured with Azure Active Directory using MSAL Angular v2&lt;/div&gt;&lt;/td&gt;
  &lt;td&gt;&lt;div&gt;ms-identity-javascript-angular-spa-aspnetcore-webapi&lt;/div&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h1&gt;
An Angular single-page application that authenticates users against Azure AD and calls a protected ASP.NET Core web API&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#scenario"&gt;Scenario&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#contents"&gt;Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#prerequisites"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#setup"&gt;Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#registration"&gt;Registration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#run-the-sample"&gt;Running the sample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#explore-the-sample"&gt;Explore the sample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#about-the-code"&gt;About the code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#deployment"&gt;Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#more-information"&gt;More information&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#community-help-and-support"&gt;Community Help and Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi/master/#contributing"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
Overview&lt;/h2&gt;
&lt;p&gt;This sample demonstrates a cross-platform application suite involving an Angular SPA (&lt;em&gt;TodoListSPA&lt;/em&gt;) calling an ASP.NET Core web API (&lt;em&gt;TodoListAPI&lt;/em&gt;) secured with &lt;a href="https://docs.microsoft.com/azure/active-directory/fundamentals/active-directory-whatis" rel="nofollow"&gt;Azure Active Directory&lt;/a&gt; (Azure AD) using the &lt;a href="https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-angular"&gt;Microsoft Authentication Library for Angular (Preview)&lt;/a&gt; (MSAL Angular).&lt;/p&gt;
&lt;h2&gt;
Scenario&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TodoListSPA&lt;/strong&gt; use &lt;a href="https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-angular"&gt;MSAL-Angular&lt;/a&gt; to sign-in a user.&lt;/li&gt;
&lt;li&gt;The app then obtains an &lt;a href="https://docs.microsoft.com/azure/active-directory/develop/access-tokens" rel="nofollow"&gt;access token&lt;/a&gt; from &lt;strong&gt;Azure AD&lt;/strong&gt; for the signed-in user.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;access token&lt;/strong&gt; is then used to authorize the…&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/Azure-Samples/ms-identity-javascript-angular-spa-aspnetcore-webapi"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  What is Managed Identity ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; is the feature of AAD. Imagine you use Azure Web Apps that call Function App which is protected by AAD.&lt;/p&gt;

&lt;p&gt;Generally, you create AAD app for the Web App and get &lt;code&gt;access_token&lt;/code&gt; with its ID and secrets to access the Functions App. With &lt;strong&gt;Managed Identity, you don't have to create AAD App and manage its secrets&lt;/strong&gt;. If you host your application on specific services, AAD manage your app identity on behalf of you.&lt;/p&gt;

&lt;p&gt;Managed Identity has two types. One is &lt;strong&gt;System-assinged&lt;/strong&gt;, another is &lt;strong&gt;User-assigned&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;System-assigned Managed Identity&lt;/strong&gt; is one-to-one relationship between the service and ID. You can enable Managed Identity for the services. If you delete the service, Azure Platform automatically delete the ID at the same time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User-assigned Managed Identity&lt;/strong&gt; is similar to Azure AD App. You create Managed Identity as an Azure resource then assign it to cresponding services. The relationship is one-to-many and it will remain even you delete services. The difference between AAD App and User-assigned Managed Identity is you still don't need to manage secrets.&lt;/p&gt;

&lt;p&gt;For detail explanation, check &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview"&gt;What are managed identities for Azure resources?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Managed Identity, your app Blob Storage, SQL Database and more. &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/services-support-managed-identities"&gt;Services that support managed identities for Azure resources&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this post, I use &lt;strong&gt;System-assigned Managed Identity&lt;/strong&gt; to access Function App which is protected by AAD.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup Environment
&lt;/h2&gt;

&lt;p&gt;I created sample apps for testing Managed Identity.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kemurayama"&gt;
        kemurayama
      &lt;/a&gt; / &lt;a href="https://github.com/kemurayama/azure-functions-python-samples"&gt;
        azure-functions-python-samples
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Azure Functions v2.0 Python samples 
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Clone and run &lt;code&gt;deploy.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Make sure you have &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#check-azure-ad-permissions"&gt;the permission to create AAD App&lt;/a&gt; and the subscription you use.&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;manifest.json&lt;/code&gt; to add permission to the App. Your App need &lt;code&gt;User.Read&lt;/code&gt;  API permission.&lt;br&gt;
You should check your resourceAppId and resourceAcces id.&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"resourceAppId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"resourceAccess"&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;"yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"&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;"Scope"&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;h2&gt;
  
  
  Test Managed Identity
&lt;/h2&gt;

&lt;p&gt;After you deployed test application, you can access Web App &lt;code&gt;/request_function&lt;/code&gt;. It calls Function App protected by AAD with Managed Identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Step
&lt;/h2&gt;

&lt;p&gt;In SPA scenario, you can check &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa"&gt;this document&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With Managed Identity, you can authenticate &lt;a href="https://docs.microsoft.com/en-us/azure/postgresql/howto-connect-with-managed-identity"&gt;PostgreSQL&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Access AAD protected Azure Functions</title>
      <dc:creator>kemurayama</dc:creator>
      <pubDate>Mon, 05 Oct 2020 12:03:09 +0000</pubDate>
      <link>https://dev.to/kemurayama/access-aad-protected-azure-web-apps-azure-functions-2oc1</link>
      <guid>https://dev.to/kemurayama/access-aad-protected-azure-web-apps-azure-functions-2oc1</guid>
      <description>&lt;p&gt;Securing resources are really important. When you create APIs or other web sites and expose to public internet, it is necessary to protect your endpoints if you.&lt;/p&gt;

&lt;p&gt;IP restriction is the common way to limit the clients who can access the endpoint. However, it is getting more difficult to manage all public IPs of the clients these days because clients access your services from anywhere.&lt;/p&gt;

&lt;p&gt;On Microsoft Azure, &lt;strong&gt;Azure Active Directory (AAD)&lt;/strong&gt; protects your APIs/Webs through OAuth 2.0, OpenID Connect, SAML and etc.. When you use PaaS such as Azure Web Apps / Azure Functions, just turning on the feature let you protect your endpoints.&lt;/p&gt;

&lt;p&gt;This post explains how to protect your APIs with AAD on Azure and access them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;This post doesn't explain what Azure Active Directory (AAD) is. If you are interested in it, you can check this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/app-objects-and-service-principals" rel="noopener noreferrer"&gt;Application and service principal objects in Azure Active Directory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you haven't created Azure Web Apps or Azure Functions, I recommend you to create them first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/app-service/quickstart-dotnetcore?pivots=platform-windows" rel="noopener noreferrer"&gt;Quickstart: Create an ASP.NET Core web app in Azure&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-vs-code?pivots=programming-language-csharp" rel="noopener noreferrer"&gt;Quickstart: Create a function in Azure using Visual Studio Code&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create Azure Functions
&lt;/h2&gt;

&lt;p&gt;First of all, you need to create Azure resources that host your API.&lt;br&gt;
Create your HTTPTrigger Function &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-vs-code?pivots=programming-language-csharp" rel="noopener noreferrer"&gt;Quickstart: Create a function in Azure using Visual Studio Code&lt;/a&gt;.&lt;br&gt;
You can publish your own API in minutes.&lt;/p&gt;

&lt;p&gt;After deploying your HTTPTrigger Function to Azure, call it from cURL command, &lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; or any other tools that create HTTP requests.&lt;br&gt;
If the authentication level is set &lt;code&gt;function&lt;/code&gt;, you can call your API with the Function key &lt;code&gt;code=xxxx&lt;/code&gt; in query parameter or &lt;code&gt;x-functions-key: xxxx&lt;/code&gt; in request header.&lt;br&gt;
For more details, check &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=python#authorization-keys" rel="noopener noreferrer"&gt;Azure Functions HTTP trigger&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%2Fkeyomuradev.azureedge.net%2Fpostman_func_http.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%2Fkeyomuradev.azureedge.net%2Fpostman_func_http.png" alt="postmanrequest"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fig 1. Successful Postman Requests&lt;/p&gt;
&lt;h2&gt;
  
  
  Enable AAD Authentication
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Development or Staging&lt;/strong&gt; environment, you can use &lt;strong&gt;Function Keys&lt;/strong&gt; to protect your Function App. However, in &lt;strong&gt;Production&lt;/strong&gt;, it is difficult to manage your Function Key securely when you distribute the key to all clients that call the Function.&lt;br&gt;
Once the key is leaked, you have to change the setting for all apps.&lt;/p&gt;

&lt;p&gt;To secure your app and manage the authentication/authorization, you can use &lt;strong&gt;Azure Active Directory (AAD)&lt;/strong&gt;.&lt;br&gt;
AAD assign unique ID with each app, and each authentication is logged.&lt;/p&gt;

&lt;p&gt;In Azure Web App / Azure Functions, you can enable AAD auth feature from Azure portal or commands,&lt;br&gt;
thought &lt;strong&gt;AAD auth is not available for Azure Function Linux consumption plan&lt;/strong&gt; (Oct.2020).&lt;br&gt;
See &lt;a href="https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-provider-aad" rel="noopener noreferrer"&gt;Configure your App Service or Azure Functions app to use Azure AD login&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This feature is currently not available on Linux Consumption plan for Azure Functions&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After you enabled the feature for your Function App, it returns &lt;code&gt;HTTP 401 unauthrized&lt;/code&gt; because AAD protects your endpoint.&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%2Fkeyomuradev.azureedge.net%2Funauthorized.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%2Fkeyomuradev.azureedge.net%2Funauthorized.png" alt="unauthorized requests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fig 2. Unauthorized Requests to Function App&lt;/p&gt;
&lt;h2&gt;
  
  
  Get Access Token to Authenticate
&lt;/h2&gt;

&lt;p&gt;In order to access AAD protected Function App, you need to get &lt;strong&gt;access token&lt;/strong&gt; from AAD for the Function App.&lt;br&gt;
In case of API call, set &lt;code&gt;Bearer&lt;/code&gt; token to &lt;code&gt;Authroization&lt;/code&gt; header.&lt;/p&gt;

&lt;p&gt;You need to create client application on AAD to authenticate Function App.&lt;br&gt;
If you use &lt;a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli" rel="noopener noreferrer"&gt;Azure CLI&lt;/a&gt;, you can create client AAD app for testing like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az ad sp create-for-rbac &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"TestAuthClientApp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It outputs the result as JSON. Store your &lt;code&gt;appId&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt; to authenticate Function App.&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%2Fkeyomuradev.azureedge.net%2Fres_azcli.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%2Fkeyomuradev.azureedge.net%2Fres_azcli.png" alt="azcli result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fig 3. Azure CLI result&lt;/p&gt;

&lt;p&gt;To get access token for the Function App, copy Function App AAD ID as target from Azure Portal.&lt;br&gt;
You can check from &lt;strong&gt;[Authentication/Authorization]&lt;/strong&gt; blade.&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%2Fkeyomuradev.azureedge.net%2Fserver.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%2Fkeyomuradev.azureedge.net%2Fserver.png" alt="Function App ID"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fig 4. Function App ID&lt;/p&gt;

&lt;p&gt;Call &lt;code&gt;https://login.microsoftonline.com/&amp;lt;Your AAD Tenant ID&amp;gt;/oauth2/token&lt;/code&gt; to get access token.&lt;br&gt;
When you use cURL, below command works.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://login.microsoftonline.com/&amp;lt;TENANT ID&amp;gt;/oauth2/token  &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="nv"&gt;grant_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client_credentials &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="nv"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;Web App CLIENT ID&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="nv"&gt;client_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;Client Application ID&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="nv"&gt;client_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;SECRET&amp;gt;
&lt;/code&gt;&lt;/pre&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%2Fkeyomuradev.azureedge.net%2Fget_token.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%2Fkeyomuradev.azureedge.net%2Fget_token.png" alt="Request Access Token"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before requesting Function App, you need to change AAD App Setting for Function App. Check &lt;code&gt;Access tokens&lt;/code&gt; to enable program to get &lt;code&gt;access_token&lt;/code&gt; with implicit grant flow.&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%2Fkeyomuradev.azureedge.net%2Fimplicit_grant.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%2Fkeyomuradev.azureedge.net%2Fimplicit_grant.png" alt="Request App"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Request Function App with Token
&lt;/h2&gt;

&lt;p&gt;Function App and request with &lt;code&gt;Authroization:Bearer xxxx&lt;/code&gt; header, which needs &lt;strong&gt;white space&lt;/strong&gt; between &lt;code&gt;Bearer&lt;/code&gt; and &lt;code&gt;token&lt;/code&gt; then you should get &lt;code&gt;HTTP 200 OK&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now you can set function auth level from &lt;code&gt;function&lt;/code&gt; to &lt;code&gt;anonymous&lt;/code&gt; because AAD protects your 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%2Fkeyomuradev.azureedge.net%2Frequest_app.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%2Fkeyomuradev.azureedge.net%2Frequest_app.png" alt="Request App"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Next Step
&lt;/h2&gt;

&lt;p&gt;Now you protect your API with AAD. However, you still need to manage AAD client app credentials. More secure way is to use &lt;strong&gt;Managed Identity&lt;/strong&gt; that enable Function App to authenticate Azure services without secrets.&lt;br&gt;
If your code runs on specific services such as Web App or Function App where Managed Identity enabled, Azure manage their authentication automatically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview" rel="noopener noreferrer"&gt;What are managed identities for Azure resources?&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/kemurayama" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__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%2F356780%2F36c8cef3-c9aa-4790-8044-9d0d55aafbc9.png" alt="kemurayama"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/kemurayama/access-aad-protected-app-with-managed-identity-4gmm" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Access AAD Protected App with Managed Identity&lt;/h2&gt;
      &lt;h3&gt;kemurayama ・ Oct 29 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
      <category>azure</category>
      <category>azurefunctions</category>
      <category>aad</category>
    </item>
    <item>
      <title>Deploying Azure Functions  Python with Terraform</title>
      <dc:creator>kemurayama</dc:creator>
      <pubDate>Wed, 23 Sep 2020 11:29:17 +0000</pubDate>
      <link>https://dev.to/kemurayama/deploying-azure-functions-for-python-with-terraform-n</link>
      <guid>https://dev.to/kemurayama/deploying-azure-functions-for-python-with-terraform-n</guid>
      <description>&lt;p&gt;This post will focus on &lt;strong&gt;deploying Azure Functions Python with Terraform&lt;/strong&gt;. If you are new to both services, you can start from &lt;strong&gt;Prerequisites&lt;/strong&gt;.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/developer/python/tutorial-vs-code-serverless-python-01" rel="noopener noreferrer"&gt;Create and deploy serverless Azure Functions in Python with Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/developer/terraform/get-started-cloud-shell" rel="noopener noreferrer"&gt;Quickstart: Configure Terraform using Azure Cloud Shell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/services/functions/" rel="noopener noreferrer"&gt;Azure Functions&lt;/a&gt; is FaaS (function-as-a-service) on &lt;strong&gt;Microsoft Azure&lt;/strong&gt;. It enables you to create your exciting services faster because it is a &lt;strong&gt;serverless service&lt;/strong&gt;. You only need to focus on your code and don't need to care about OS updates and middleware.&lt;/p&gt;

&lt;p&gt;In addition, Azure Functions is &lt;strong&gt;event-driven&lt;/strong&gt; that is triggered by external events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload images on Azure Blob Storage (Object Storage service)&lt;/li&gt;
&lt;li&gt;Insert / Update items on Azure Cosmso DB (NoSQL DB service)&lt;/li&gt;
&lt;li&gt;HTTP incoming requests&lt;/li&gt;
&lt;li&gt;Timer defined by cron&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, deploying all services and configuring them from Azure Portal take a long time and happens mistakes.&lt;/p&gt;

&lt;p&gt;To increase our productivity and deploy safely, I would like to use IaC (Infrastructure as Code) tools, such as &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/overview" rel="noopener noreferrer"&gt;ARM Template&lt;/a&gt; or &lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt;, rather than deploying each resource from Azure Portal. Especially in production environment, managing your infrastructure as code is really important. &lt;/p&gt;

&lt;h2&gt;
  
  
  Set Up Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Terraform &amp;gt;= 0.12&lt;/li&gt;
&lt;li&gt;azurerm provider &amp;gt;= 2.21&lt;/li&gt;
&lt;li&gt;azure cli&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Define Resources
&lt;/h2&gt;

&lt;p&gt;Let's define resources. In Terraform, you define your resources in &lt;code&gt;.tf&lt;/code&gt; files.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;main.tf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="c1"&gt;# https://github.com/terraform-providers/terraform-provider-azurerm/issues/7960&lt;/span&gt;
&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"azurerm"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;=2.21.0"&lt;/span&gt;
  &lt;span class="nx"&gt;features&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_resource_group"&lt;/span&gt; &lt;span class="s2"&gt;"funcdeploy"&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;"rg-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-function"&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_storage_account"&lt;/span&gt; &lt;span class="s2"&gt;"funcdeploy"&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;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;storage"&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;funcdeploy&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;funcdeploy&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;account_tier&lt;/span&gt;             &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Standard"&lt;/span&gt;
  &lt;span class="nx"&gt;account_replication_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"LRS"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_storage_container"&lt;/span&gt; &lt;span class="s2"&gt;"funcdeploy"&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;"contents"&lt;/span&gt;
  &lt;span class="nx"&gt;storage_account_name&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_storage_account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;funcdeploy&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;container_access_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"private"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_application_insights"&lt;/span&gt; &lt;span class="s2"&gt;"funcdeploy"&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;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-appinsights"&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;funcdeploy&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;funcdeploy&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;application_type&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt;

  &lt;span class="c1"&gt;# https://github.com/terraform-providers/terraform-provider-azurerm/issues/1303&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"hidden-link:&lt;/span&gt;&lt;span class="k"&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;funcdeploy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/providers/Microsoft.Web/sites/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;func"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Resource"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_app_service_plan"&lt;/span&gt; &lt;span class="s2"&gt;"funcdeploy"&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;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-functions-consumption-asp"&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;funcdeploy&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;funcdeploy&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;kind&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"FunctionApp"&lt;/span&gt;
  &lt;span class="nx"&gt;reserved&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;tier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Dynamic"&lt;/span&gt;
    &lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Y1"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"azurerm_function_app"&lt;/span&gt; &lt;span class="s2"&gt;"funcdeploy"&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;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;func"&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;funcdeploy&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;funcdeploy&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;app_service_plan_id&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_app_service_plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;funcdeploy&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;storage_account_name&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_storage_account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;funcdeploy&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;storage_account_access_key&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;azurerm_storage_account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;funcdeploy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;primary_access_key&lt;/span&gt;
  &lt;span class="nx"&gt;https_only&lt;/span&gt;                 &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;version&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"~3"&lt;/span&gt;
  &lt;span class="nx"&gt;os_type&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"linux"&lt;/span&gt;
  &lt;span class="nx"&gt;app_settings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"WEBSITE_RUN_FROM_PACKAGE"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1"&lt;/span&gt;
      &lt;span class="s2"&gt;"FUNCTIONS_WORKER_RUNTIME"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"python"&lt;/span&gt;
      &lt;span class="s2"&gt;"APPINSIGHTS_INSTRUMENTATIONKEY"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;azurerm_application_insights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;funcdeploy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instrumentation_key&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
      &lt;span class="s2"&gt;"APPLICATIONINSIGHTS_CONNECTION_STRING"&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"InstrumentationKey=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;azurerm_application_insights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;funcdeploy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instrumentation_key&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;IngestionEndpoint=https://japaneast-0.in.applicationinsights.azure.com/"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;site_config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;linux_fx_version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Python|3.8"&lt;/span&gt;        
        &lt;span class="nx"&gt;ftps_state&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Disabled"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;# Enable if you need Managed Identity&lt;/span&gt;
  &lt;span class="c1"&gt;# identity {&lt;/span&gt;
  &lt;span class="c1"&gt;#   type = "SystemAssigned"&lt;/span&gt;
  &lt;span class="c1"&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;code&gt;variables.tf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"location"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;type&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt;   &lt;span class="nx"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;default&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;   &lt;span class="s2"&gt;"japaneast"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"prefix"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;type&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt;   &lt;span class="nx"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;default&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;   &lt;span class="s2"&gt;"my"&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Here are some tips for successful deployment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;azurerm &amp;gt;= 2.21.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add Hidden Link Tag &lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;version = ~3&lt;/code&gt; (default is v1)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deploy Azure Resources
&lt;/h3&gt;

&lt;p&gt;After you created above files, let's deploy !&lt;/p&gt;

&lt;p&gt;If you don't want to install Terraform on your local PC, use &lt;a href="https://docs.microsoft.com/en-us/azure/developer/terraform/get-started-cloud-shell" rel="noopener noreferrer"&gt;Azure Cloud Shell&lt;/a&gt; as test.&lt;/p&gt;

&lt;p&gt;Make sure your each resource name is &lt;strong&gt;unique&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;terraform init

...
Terraform has been successfully initialized!
...

&lt;span class="nv"&gt;$ &lt;/span&gt;terraform plan 
&lt;span class="nv"&gt;$ &lt;/span&gt;terraform apply

...
Apply &lt;span class="nb"&gt;complete&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; Resources: 6 added, 0 changed, 0 destroyed.
&lt;/code&gt;&lt;/pre&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%2Fkeyomuradev.azureedge.net%2Fapplyresult.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%2Fkeyomuradev.azureedge.net%2Fapplyresult.png" alt="terraform apply result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fig.1 The result of &lt;code&gt;terraform apply&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then you see Azure Functions on your Azure Portal.&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%2Fkeyomuradev.azureedge.net%2Fdeployresults.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%2Fkeyomuradev.azureedge.net%2Fdeployresults.png" alt="Azure Resources after deploying"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fig.2 Resources on Azure Portal&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy Function
&lt;/h2&gt;

&lt;p&gt;After &lt;code&gt;terrafrom apply&lt;/code&gt;, you may upload your code to your &lt;a href="https://docs.microsoft.com/en-us/azure/developer/python/tutorial-vs-code-serverless-python-01" rel="noopener noreferrer"&gt;Function with Visual Studio Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once deployed your code to Function App, you can see your functions on Azure Portal.&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%2Fkeyomuradev.azureedge.net%2Ffunction.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%2Fkeyomuradev.azureedge.net%2Ffunction.png" alt="Azure Function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fig.3 Functions on Azure Portal&lt;/p&gt;

&lt;p&gt;You can manage various resources and control versions in &lt;code&gt;.tf&lt;/code&gt; file. In production, you should use &lt;strong&gt;CI/CD tools&lt;/strong&gt; such as &lt;a href="https://github.co.jp/features/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; or &lt;a href="https://azure.microsoft.com/en-us/services/devops/" rel="noopener noreferrer"&gt;Azure DevOps&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.shibayan.jp/entry/20191009/1570619560" rel="noopener noreferrer"&gt;Terraform と Azure Pipelines を使って App Service / Azure Functions をコード化して管理する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/terraform-providers/terraform-provider-azurerm/issues/7960" rel="noopener noreferrer"&gt;azurerm_function_app Example Usage (Linux) in docs produces error on apply&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/terraform-providers/terraform-provider-azurerm/issues/1303" rel="noopener noreferrer"&gt;Feature Request: Attach azurerm_application_insights to a azurerm_app_service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.terraform.io/docs/providers/azurerm/r/function_app.html" rel="noopener noreferrer"&gt;azurerm_function_app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>terraform</category>
      <category>python</category>
      <category>azurefunctions</category>
    </item>
    <item>
      <title>Hosting Pyodide on Azure Static Web App</title>
      <dc:creator>kemurayama</dc:creator>
      <pubDate>Fri, 29 May 2020 12:15:09 +0000</pubDate>
      <link>https://dev.to/kemurayama/hosting-pyodide-on-azure-static-web-app-3ba2</link>
      <guid>https://dev.to/kemurayama/hosting-pyodide-on-azure-static-web-app-3ba2</guid>
      <description>&lt;p&gt;The post is showing how we host &lt;a href="https://github.com/iodide-project/pyodide" rel="noopener noreferrer"&gt;Pyodide&lt;/a&gt; on &lt;a href="https://azure.microsoft.com/en-us/services/app-service/static/" rel="noopener noreferrer"&gt;Azure Static Web Apps&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Azure Static Web Apps?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/services/app-service/static/" rel="noopener noreferrer"&gt;Azure Static Web Apps&lt;/a&gt; is a new service on Azure announced at &lt;a href="https://mybuild.microsoft.com/" rel="noopener noreferrer"&gt;Microsoft Build 2020&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is Pyodide ?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/iodide-project/pyodide" rel="noopener noreferrer"&gt;Pyodide&lt;/a&gt; enable us to run Python on Web browser via &lt;b&gt;WebAssembly&lt;/b&gt;. It is a related project of &lt;a href="https://alpha.iodide.io/" rel="noopener noreferrer"&gt;Iodide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I wanted to try Azure Static Web App but am not familiar with JavaScript Frameworks at all. Since I have Python experience a little bit, I tried Pyodide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Your Azure Static Web Apps
&lt;/h2&gt;

&lt;p&gt;First of all, you need to create your own Static Web Apps for hosting your Pyodide App. There are some Static Web App templates (Angular, React, Vue or Vanilla) on GitHub and you can folk them. &lt;/p&gt;

&lt;p&gt;In case of Pyodide, I think &lt;a href="https://docs.microsoft.com/en-us/azure/static-web-apps/getting-started?tabs=vanilla-javascript" rel="noopener noreferrer"&gt;vanilla-javascript&lt;/a&gt; is good place to start and try.&lt;/p&gt;

&lt;p&gt;After you created your Static Web App, you will find your GitHub repo has &lt;code&gt;.github/workflows&lt;/code&gt; folder. It contains yaml file for &lt;a href="https://github.com/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;GitHub Actions automate your Build and Deploy workflow. This time you don't need to edit this yaml file because we just want to deploy our static files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up index.html with Pyodide
&lt;/h2&gt;

&lt;p&gt;After deploying, you can see your Web App. I wrote index.html on my repo below.&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/kemurayama" rel="noopener noreferrer"&gt;
        kemurayama
      &lt;/a&gt; / &lt;a href="https://github.com/kemurayama/my-pyodide-sample" rel="noopener noreferrer"&gt;
        my-pyodide-sample
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;When you call Python in &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag, &lt;code&gt;pyodide.runPython&lt;/code&gt; is needed. When you want to use packages, you can use &lt;code&gt;loadPackage&lt;/code&gt; such as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#matplotlib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;pyodide&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadPackage&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;matplotlib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;numpy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;plot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pyodide&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runPython&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;your Python Code !!&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and available packages are &lt;a href="https://github.com/iodide-project/pyodide/tree/master/packages" rel="noopener noreferrer"&gt;listed in Pyodide repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Push and Deploy
&lt;/h2&gt;

&lt;p&gt;When you finish local development, let's push your code to GitHub.&lt;br&gt;
GitHub Actions automatically deploy your code to Azure Static Web App.&lt;/p&gt;

&lt;p&gt;You can use matplotlib or numpy on your browser. Available packages are &lt;a href="https://github.com/iodide-project/pyodide/tree/master/packages" 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%2Fgithub.com%2Fkemurayama%2Fmy-pyodide-sample%2Fblob%2Fmaster%2Fstaticweb.png%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%2Fkemurayama%2Fmy-pyodide-sample%2Fblob%2Fmaster%2Fstaticweb.png%3Fraw%3Dtrue" alt="top"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;p&gt;By developer tool, you can check whether Pyodide is loaded successfully or not. If successfully loaded, &lt;code&gt;Python initialization complete&lt;/code&gt; show up on console.&lt;br&gt;
If Pyodide fails with this message &lt;code&gt;Unchecked runtime.lastError: The message port closed before a response was received.&lt;/code&gt;, you can try in Secret Browser. &lt;/p&gt;

</description>
      <category>azure</category>
      <category>python</category>
      <category>pyodide</category>
    </item>
    <item>
      <title>My aiohttp and jinja2 app sample</title>
      <dc:creator>kemurayama</dc:creator>
      <pubDate>Sat, 09 May 2020 12:30:07 +0000</pubDate>
      <link>https://dev.to/kemurayama/my-aiohttp-and-jinja2-app-sample-gai</link>
      <guid>https://dev.to/kemurayama/my-aiohttp-and-jinja2-app-sample-gai</guid>
      <description>&lt;p&gt;Recently, I started to use &lt;a href="https://docs.aiohttp.org/en/stable/web_quickstart.html"&gt;aiohttp&lt;/a&gt; server and &lt;a href="https://aiohttp-jinja2.readthedocs.io/en/stable/"&gt;aiohttp_jinja2&lt;/a&gt; for my personal project. It is very useful.&lt;/p&gt;

&lt;p&gt;My python version is 3.8.2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python &lt;span class="nt"&gt;--version&lt;/span&gt;
Python 3.8.2

&lt;span class="c"&gt;# requirements.txt&lt;/span&gt;
aiohttp[speedups]
aiohttp_jinja

pip &lt;span class="nb"&gt;install &lt;/span&gt;aiohttp[speedups]
pip &lt;span class="nb"&gt;install &lt;/span&gt;aiohttp_jinja
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Project directory is like below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
└── app
    ├── main.py
    └── templates
        ├── index.html
        └── layout.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;aiohttp_jinja and aiohttp Class Based View can be used like below example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main.py
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pathlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jinja2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;aiohttp_jinja2&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;aiohttp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;aiohttp_jinja2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;template&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# setup jinja2 
&lt;/span&gt;    &lt;span class="n"&gt;aiohttp_jinja2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;jinja2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FileSystemLoader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;'templates'&lt;/span&gt;
            &lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HomeHandler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HomeHandler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


    &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- layout.html --&amp;gt;&lt;/span&gt;

&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;aiohttp and jinja test&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;My aiohttp jinja demo&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

    {%block body%}{%endblock%}

&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- index.html --&amp;gt;&lt;/span&gt;
{% extends "layout.html" %}
{% set title = "Main" %}
{% block body %}

    &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Form test extended from layout.html&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"{{ url('index') }}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;

    {% if name %}

        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;My name is {{ name }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

    {% endif %}
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>aiohttp</category>
      <category>jinja2</category>
    </item>
    <item>
      <title>Select a row with Whereclause in SQLAlchemy</title>
      <dc:creator>kemurayama</dc:creator>
      <pubDate>Mon, 27 Apr 2020 13:35:01 +0000</pubDate>
      <link>https://dev.to/kemurayama/select-a-row-with-whereclause-in-sqlalchemy-32ol</link>
      <guid>https://dev.to/kemurayama/select-a-row-with-whereclause-in-sqlalchemy-32ol</guid>
      <description>&lt;p&gt;I am new to SQLAlchemy and aiopg. After defined a Tabled object and finished DB initialization, I wanted to fetch one row with specified &lt;code&gt;id&lt;/code&gt; in aiohttp server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;aiopg.sa&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;MetaData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Integer&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="n"&gt;Date&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Name'&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="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;nullable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Description'&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="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;nullable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Price'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nullable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&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;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;init_pg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'config'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;'postgres'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;aiopg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'database'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'port'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;minsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'minsize'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;maxsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'maxsize'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'db'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After spending all afternoon, finally I figured it out. &lt;code&gt;text&lt;/code&gt; can convert string as &lt;code&gt;TextClause&lt;/code&gt; and it can be used in &lt;code&gt;Whereclause&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.sqlalchemy.org/en/13/core/selectable.html#sqlalchemy.sql.expression.select"&gt;https://docs.sqlalchemy.org/en/13/core/selectable.html#sqlalchemy.sql.expression.select&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'db'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;acquire&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;whereclause&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'id = {}'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
        &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;whereclause&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;whereclause&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I am really happy to know it :)  and I had better look into Official Document more carefully.&lt;/p&gt;

</description>
      <category>python</category>
    </item>
    <item>
      <title>When you want to create a new blob in your code Azure Functions</title>
      <dc:creator>kemurayama</dc:creator>
      <pubDate>Sat, 25 Apr 2020 10:41:36 +0000</pubDate>
      <link>https://dev.to/kemurayama/when-you-want-to-create-a-new-blob-in-your-code-azure-functions-k7e</link>
      <guid>https://dev.to/kemurayama/when-you-want-to-create-a-new-blob-in-your-code-azure-functions-k7e</guid>
      <description>&lt;p&gt;You can create a new blob file by writing like below. &lt;br&gt;
Plus {rand-guid} generate guid. It is useful !!&lt;/p&gt;

&lt;p&gt;Storage Account Setting is set by &lt;b&gt;Storage Account&lt;/b&gt; Attribute.&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="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;"MyTestFuncion"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;StorageAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"StorageConnectionAppSetting"&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;EventHubTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"myeh"&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="s"&gt;"EHConnection"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;EventData&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Binder&lt;/span&gt; &lt;span class="n"&gt;binder&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;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;writer&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;binder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BindAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TextWriter&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
                        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BlobAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;container&amp;gt;/{rand-guid}.json"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;what&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;want&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;);&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>azure</category>
      <category>serverless</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
