「Microsoft Azure Functions」でのPython関数の作り方

# 概要
Microsoft Azure Functions を使用し、Python関数作成の備忘録です。
今まで、クラウドはAWSばかり触っており、Azureに触れたのが初めてでした。
Azureの情報は公式にはありますが、他にはあまりない印象でした。
AWSの AWS Lambdaを使用した時のように簡単にはいかず、苦労したためまとめてみます。
間違った認識をしているのもあるかもしれません。
サンプルプログラムを一通り動作した段階となっています。
・ローカルのVisual Studio Codeにて環境を構築、ローカル環境で動作確認を実施後、
　Azureにデプロイするまでの流れです。

# (1)前提条件
## ①Azureアカウント
サブスクリプションは無料試用版を使用しています。
https://azure.microsoft.com/ja-jp/free/
に従って、アカウントを作成、利用しました。

## ②環境
WindowsPC環境

# (2)事前準備

## ①リソースグループ作成
Azureサインイン後、"Azure Portal"上で作業を行います。
"Azure Portal"上では、サブスクリプションという大きな枠組みがあり、
その中に"リソースグループ"を作成します。
プロジェクト単位の管理のようなイメージでしょうか？
AWSでいう"アカウントID"が"サブスクリプション"や"リソースグループ"に該当するのかなと思っています。
⇒Azure Portalのホームより「リソースグループ」を選択。
　無料試用版のサブスクリプション内に任意のリソースグループを作成します。

## ①"Azure Functions(関数アプリ)"作成
"Azure Portal"のホームより「関数アプリ」を選択。追加ボタンを押下します。
下記のように、
・リソースグループ 
・関数アプリ名(一意の名前とする必要があります)
・ランタイムスタック
・バージョン
・地域
を選択します。
<img width="384" alt="1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/6e5415d5-c73e-a12e-68ef-38882c493f0a.png">
※無料試用版では、日本の東日本リージョンではPythonのサービスを使うことはできないようです。
 (従量課金型は提供対象外だそうです）なので、Central USを指定します。
　他の項目は、デフォルト設定(オペレーティングシステムはLinux)し、作成ボタンを押下します。

## ②ローカル環境の準備
WindowsPC上にローカル環境(開発環境)を作成のため、以下インストールします。
### Visual Studi Code(VS Code)インストール
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
⇒ローカル開発環境はVS Codeとなります。
### Pythonインストール
https://www.python.org/downloads/release
⇒"Azure Portalで"指定したものと同じ、python3.7系をインストールしておきます。
### Azure CLIインストール
https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-windows?view=azure-cli-latest
### VS Codeの拡張機能"Azure Functions"をマーケットプレイスから取得
左のタブの上から5個目のアイコンを押下して取得します。
<img width="578" alt="2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/1574ab43-5633-ba8d-63a1-c2908c6ad8e9.png">
⇒取得後、左のタブにAzureのアイコンが追加されます。
　
### Azure Functions Core Toolsインストール
・Node.jsをインストール
https://nodejs.org/en/download/
⇒npmも同梱されます。
・コマンドプロンプトやPowerShellで下記コマンドを実行し、Azure Functions Core Toolsを取得します。
```npm install -g azure-functions-core-tools@3```
※AzureにUploadする際、必要なコマンドとなります。
参考： https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=windows%2Ccsharp%2Cbash

### 権限変更
　PowerShellを起動し、以下のコマンドを実行します。
```Set-ExecutionPolicy -Scope CurrentUser RemoteSigned```
　※VS Codeでローカル環境として実行するときの権限を変更します。
参考：http://totech.hateblo.jp/entry/2017/09/29/162411

# (3)ローカル環境にPythonコードを作成
　VS Codeにアクセスし"Sign in to Azure..."をクリック。Azureにサインインしておきます。
　
## ①関数の作成
　下記、画面キャプチャの赤枠クリックすると、プロンプトが表示、
　ワークスペースを任意の場所を指定します。
<img width="378" alt="3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/777c667d-bc25-73bc-1dd1-b8efb39aa9ed.png">
　その後、新しいプロジェクト作成が進み、
　下記に従って、入力していきます。
　・Select the folder containing your function project
　　⇒任意のPC上のフォルダを選びます。
　・Select a language for your function project
　　⇒"Python"を選びます。
　・Select a Python alias to create a virtual environment
　　⇒環境準備でインストールしたpythonのexeを選択します。(フルパス)
　・Select a template for your project's first function
　　⇒"HTTP trigger" を選びます。
　・Provide a function name
　　⇒関数名は"HTTPTest"とします。
　・承認レベル
　　⇒今回、Anonymous を選択します。誰でもアクセスできる状態です。
　完了すると、下記のようなテスト関数が生成されます。
<img width="709" alt="6.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/ce91406a-9a47-b90d-fd51-ccce13b0bd98.png">

## ②ローカル環境でテストを行う。
　・関数作成後、F5を押し、コンソールに関数の実行状況が表示されます。
<img width="610" alt="7.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/b42545ca-6095-d62c-6271-8cab9cefdc5a.png">
　　実行後、ローカル環境でのHTTPパスが表示されますので、ブラウザから実行し、動作確認を行います。
<img width="462" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/1ebc44f4-463c-cbaa-c87b-64fa482e77d9.png">

　下記のように、URIに記載したユーザ名がブラウザの応答結果として表示されれば、
　ローカル環境での確認は成功です。
<img width="419" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/62869215-6f13-99a8-a45e-a482c7f88eba.png">


#Azureに関数をデプロイする
##①関数アプリをデプロイ
下記の赤枠のアイコンを押下し、関数を”Azure”にデプロイしていきます。
<img width="512" alt="11.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/64561cc5-dfb1-4133-6a3a-fa775be0b268.png">
アイコンを押下すると、コンソールが表示されるため、
下記に従って、入力していきます。
・ローカル環境の関数を実行しているパスを指定します。
・AzurePortalで作成した関数アプリ(TestSampleFunctions)を指定します。
・確認のポップアップが表示されるので、"Deploy"をクリックします。
<img width="601" alt="12.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/c236f972-ecf3-5f4b-76e3-c80849f5a514.png">
　⇒デプロイ完了まで、しばらく待ちます。
##②"Azure Portal"で確認
 ・デプロイ完了後、"Azure Portal"にアクセスします。
<img width="569" alt="13.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/5dfbd03d-4bed-82a4-2662-36dd6b20bd93.png">
　⇒デプロイされていることが確認できます。

　・"関数のURLの取得"をクリックし、Azureにデプロイした関数にアクセスするためのURLを取得します。
<img width="507" alt="14.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513502/d1b7b72d-aa59-625a-a293-5866185048a4.png">
⇒取得したURLに対し、ローカル環境で確認したのと同様にアクセスし、
　結果が返ることが確認できればデプロイが成功です。
　
　今回、確認し内容は以上となります。今後、Azure Functionsから他のAzureのサービスに対しての
　処理を行えるよう、引き続き試していきたいと思います。

　※なお、テスト確認後、不要なリソースは削除しておいてください。
　　アクセス元の制限をしていないため、パスが分かれば誰でもアクセスできることになります。
　　(上記で作成した関数アプリはすでに削除しておりますので、アクセスすることはできません。)