ゼロから1時間で作れるAzure Functionsハンズオン

Azure Functions に触れるために調べたが、最低限検証用に何となく動くものを作れるような記事が見当たらなかったのでまとめる。
※私の検索スキルが悪いだけというのもある。

# はじめに
クラウド技術は情報量が多い。多すぎて私には全てを受け止めきれない。
確かに従量課金等もあり注意は必要だが、今回諸々心配をせずに最短でタイトルの内容を突っ走れるようだと分かった。
必須情報は不足無く記載したいが説明不足な点はコメント等で補助いただけると幸いである。

なお、本当に1時間で作れるかは定かではないが、それぐらい短い時間でできる、と解釈して欲しい。

# この記事のゴール
自分の作成した Azure Functions に外部からアクセスする。
そして、下記イメージができるようにする。

* どのようにコードを登録するのか
* データの入出力に関わる事
* いかに外部に公開するか

なお、HTTP Trigger に関わる内容に限定する。

# 前提条件
以下の条件を整える。

* PC を持っている事
* Microsoft アカウントを持っている事(outlook.jpやhotmail等で良い)
  無い場合は https://outlook.live.com/owa/ 等で新規に無料発行すると良い(多分)。

# ハンズオン開始
Azure は検証用に「試用期間(30日)」や「開発プログラム(90日)」が存在するも期限切れの心配はある。
当記事ではこちらは利用せず Microsoft Learn(以下MS Learn)([参考](#参考)#1) を利用する。MS Learn では Azure サンドボックスというサブスクリプションが4時間(計10回)利用でき、この権利はデイリーで復活するらしい。
悪用すれば権利は剥奪されるが、純粋な学習目的でその事態に陥る事はないだろう。

## 1. 進め方
MS Learn の下記トピックを用いて進める。

* Azure Functions を使用したサーバーレス ロジックの作成 - Learn | Microsoft Docs
  https://docs.microsoft.com/ja-jp/learn/modules/create-serverless-logic-with-azure-functions/

構築パラメータは本家を参照いただきたく、その際は都度その事を記載する。

## 2. 関数アプリの作成
MS Learn を以下のページまで進める。

* 演習 - Azure portal での関数アプリの作成
  https://docs.microsoft.com/ja-jp/learn/modules/create-serverless-logic-with-azure-functions/3-create-an-azure-functions-app-in-the-azure-portal?pivots=javascript

ページの先頭にある「Azure サンドボックスを有効にする」からサンドボックスを有効にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/100d71b6-79b3-7da9-d522-0cfecb59ac10.png)
サンドボックス有効化後に [Azure Portal](https://portal.azure.com/#home) にアクセスする。
その時、右上のプロファイルが MICROSOFT LEARN SANDBOX になっている事を確認する。
異なる場合はディレクトリを変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/441cb8f2-f308-a31d-96d1-319919e45924.png)

[リソースの作成]→[関数アプリ]より 作成 を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/bf5d136a-04eb-7570-53d2-894e0a26c0ee.png)↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/02df2686-f245-eb84-a591-f334ebfda5c5.png)
関数アプリ作成時にどのようなパラメータを入力するかは MS Learn を参照いただきたい。

MS Learn の内容の通り進めれば、5分～10分後に関数アプリがデプロイされる。
デプロイ後、[リソースに移動]より移動し、[URL]欄のリンクから関数アプリに接続することで、あなたの予想に反してこのページが見えている事でしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/ae28e07d-3e38-305d-27ce-701fd4a4190e.png)

## 3. Function の登録
MS Learn を以下のページまで進める。

* Azure Functions でコードをオンデマンドで実行する - Learn | Microsoft Docs
  https://docs.microsoft.com/ja-jp/learn/modules/create-serverless-logic-with-azure-functions/4-creating-and-executing-an-azure-function

左メニューより[関数]を選択し、表示されたページ上で[作成]を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/82410897-cb44-f770-cf23-9b3157a3bac5.png)
テンプレートより HTTP trigger を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/7e58e529-5eb7-f2c5-ee12-f11b5e2a45a6.png)
作成に関わるパラメータは MS Learn に記載されている情報を入力する。
Azure Functions は HTTP trigger 以外にも Azure 上の特定のイベントに連動して動作させる事も可能である。

## 4. テスト実行
下記画像のように [コードとテスト]→[テストと実行]→[実行] を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/0c645532-d25e-c2bc-21e8-9f44edb90d07.png)
実行後、ログ用のコンソールが下部に、実行結果が右パネルに表示される。

## 5. 外部からアクセスして実行
下記画像のように URL を取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/7b98add6-c945-c14e-5a55-f7cc31549ca3.png)
デフォルトのテンプレートから作成している場合、nameパラメータを利用するため、取得したURLに `name=***` を追加してアクセスする。

デフォルトでは外部から無闇にアプリにアクセスできない設定になっている。先のように取得した URL にも含まれている関数キー(APIキー)によるアクセス制限が可能である。Functions でのアクセス制限は承認レベルと呼ばれ「匿名(Anonymous)」(=無制限、関数キー無しで利用可能)、「関数(Function)」(=関数キー又はホストキーで利用可能)、「管理者(Admin)」(=ホストキーのみ利用可能)の3段階に分かれる。
この承認レベルの設定は関数作成時に指定でき、作成後は変更できないようだ(できるかも知れないが設定場所が見当たらなかった)。

関数キーは URL の取得時に自動的に含まれるようだが左メニューの [関数キー] からも得られる。この関数キーはクエリ文字列で指定する以外にも `x-functions-key` で指定できる。

演習にもあるが、このように curl 等コマンドで接続して起動させることもできるようだ。
```
curl --header "Content-Type: application/json" --header "x-functions-key: <your-function-key>" --request POST --data "{\"name\": \"Azure Function\"}" <your-https-url>
```

以上までが当記事で紹介したかった内容となる。

# まとめ

* どのようにコードを登録するのか
  Azure 上で [関数アプリ] を作成し、登録した[関数]内に処理を記載する。
* パラメータの入力と結果の出力
  `function.json` で入出力のデータ構造を記載する。
  `module.exports` でエクスポートした関数の引数で入力を、`context.res` に戻りの値を記載する。
* いかに外部に公開するか
  承認レベルを設定して、利用可能な人を制限することができる。
  また、未確認だが通常の Azure と同等の通信元の許可リストによる制限もできると推測している。

# 最後に
この記事の主旨は MS Learn の「Azure Functions を使用したサーバーレス ロジックの作成」を参照したらよい、という事になる。
より MS Learn の理解を深めたい場合は下記ページが参考になる。

* Azureを無料で試して学べるMicrosoft Learnを使ってみた | やましーデータ活用クラウドエンジニアになる
  https://ymstech.net/blog/free-azure-microsoft-learn/

# 参考

1. Microsoft Learn | Microsoft Docs
   https://docs.microsoft.com/ja-jp/learn/
1. Azure Functions の HTTP トリガー | Microsoft Docs#承認レベル
   https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=in-process%2Cfunctionsv2&pivots=programming-language-csharp#http-auth
1. Azure Functions を使用したサーバーレス ロジックの作成 - Learn | Microsoft Docs
   https://docs.microsoft.com/ja-jp/learn/modules/create-serverless-logic-with-azure-functions/
1. 演習 - Azure portal での関数アプリの作成
   https://docs.microsoft.com/ja-jp/learn/modules/create-serverless-logic-with-azure-functions/3-create-an-azure-functions-app-in-the-azure-portal?pivots=javascript
1. Azure Functions でコードをオンデマンドで実行する - Learn | Microsoft Docs
   https://docs.microsoft.com/ja-jp/learn/modules/create-serverless-logic-with-azure-functions/4-creating-and-executing-an-azure-function
1. Azureを無料で試して学べるMicrosoft Learnを使ってみた | やましーデータ活用クラウドエンジニアになる
   https://ymstech.net/blog/free-azure-microsoft-learn/
1. 【PL-900】個人アカウントで学習環境を準備する - Qiita
   https://qiita.com/ueda_it/items/b633a4cb8c4c98b0de10
1. AzureFunctionsの無料枠を超えないように設定したい
   https://teratail.com/questions/266102

# 変更履歴
* 2022/05/22(18:58):
  - Adminキーをホストキーに表記を修正