Static Web AppsのAPIでマネージドIDを使う方法 #Azureリレー

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を用意し、独自の関数の使用 の設定を行いリンクしましょう。