Static Web Apps はお手軽に静的な Web サイトを提供するだけでなく、API もデプロイできます。

API をデプロイした場合、Azure の他のリソースにアクセスする処理が必要なケースが多いと思います。

API から他のリソースにアクセスするには接続情報を環境変数に持たせる手もありますが、マネージド ID を使用するとより安全でスマートなコードが組めるので良いですよね。

Static Web Apps の API は 2 種類

Static Web Apps の API は マネージド関数独自の関数 の使用という 2 つの構成が存在します。 マネージド関数の方がお手軽に使えますが、下記の表にあるようにマネージド ID(現状の和訳だと「管理対象 ID」になっている)が使えません。

https://docs.microsoft.com/ja-jp/azure/static-web-apps/apis

このため、 独自の関数の使用 を選択する必要があります。

・・・とキレイに書いてみましたが、実際はこの仕様を知らず、Static Web Apps のマネージド ID を有効化して IAM 設定をして「動かないなぁ。。」と悩んでいました。 マネージド関数でマネージド ID を使おうとして、169.254.169.254:80 にアクセスできない旨のエラーを見て気づきました。 上記 IP アドレスは下記のドキュメント等に登場しますが、Azure に対する何らかの問い合わせに使われる IP アドレスです。

https://docs.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/how-to-use-vm-token

独自の関数の使用

下記のドキュメントを参考に、Azure ポータルからポチポチ設定すれば連携できます。

https://docs.microsoft.com/ja-jp/azure/static-web-apps/functions-bring-your-own

ドキュメントを見なくてもできちゃうくらい簡単です。 まずはマネージド ID を有効化した Functions を用意し、その後 Static Web Apps の「関数」のところからリンクすれば OK です。

注意点としては、GitHub Actions で CI/CD を既にマネージド関数仕様で組んでいる場合、api_location のパスを空文字にしておく必要があります。

ちなみに Azure ポータル以外にも REST API を叩いても設定できますので、自動構築もできちゃいますね。

https://docs.microsoft.com/en-us/rest/api/appservice/static-sites/register-user-provided-function-app-with-static-site

まとめ

Static Web Apps の API でマネージド ID を使用したい場合はマネージド ID が有効な Functions を用意し、独自の関数の使用 の設定を行いリンクしましょう。