はじめに
夏休みの宿題として、即席 POST を。
Static Web Apps を使って Web サイトを構築する時、VNET 内で保護されたストレージやデータベースの中のデータを使ったり、そのデータを更新したりしたい、かもしれない。
でも Static Web Apps には VNET につなぐ機能 (App Service でいうところの VNET 統合) がない。
# 静的サイトのホスティングなんだから、当然な気もする。
そうだ!
Static Web Apps は、バックエンド API として Function App が使えるじゃないか!
Function App の VNET 統合を使って、VNET 内につなごう!!
構成
つまりはこう。
構成のポイント。
- Static Web Apps の後ろに Function App
- ストレージ アカウントやデータベースは、プライベート リンクを使って VNET 外からのアクセスを全力で拒否
- Function App は VNET 統合で、2. のプライベート リンクと同じ VNET に接続
やってみる
Azure Functions を VNET 統合する
全く難しいことはなく、ポータルからポチポチしたら設定完了。
最近プレビューで出てきた [ネットワーク (プレビュー)] ブレードも見やすくていい感じ。
注意点は以下の通り
- VNET 統合が使える Function App のプランは、Elastic Premium プラン、または、Standard 以上の App Serviceプラン
- 統合先の VNET と Function App のリージョンは同じ
- VNET には、Function App からの VNET 統合専用、つまり空っぽの のサブネットが必須
一番の注意点は一つ目、 Elastic Premium プラン、または、Standard 以上の App Serviceプラン
。
Static Web Apps 付属の Function App は、Linux の従量課金プランなので、そのままでは VNET 統合が使えない。
なので、Static Web Apps の Bring Your Own Functions を使って、VNET 統合が使える Function App をリンクしてみる。
Static Web Apps で自前の Function App を使う (Bring Your Own Functions)
ドキュメントはこちら。
何故かこれだけ英語。
でも VNET 統合よりも設定は簡単で、ポータルから [関数] ブレードからポチポチしてリンク対象の Function App を選ぶだけ。
結果
目論見通り、Function App からのアクセスは VNET 内のリソースにつながるので、関数のトリガーは HTTP にしてバックエンド API として作り、VNET 内にあるストレージ アカウントやデータベースから入力バインドで取ってきたデータを HTTP のレスポンスにする、なんてことも簡単にできた。
バインディング、最高。
諸注意
一度 Static Web Apps と Function App をリンクすると、そのリンクを解除した後も Function App への HTTP アクセスで 401 が返ったままになり、まともに使えない。
これは、Static Web Apps とリンクした際に、Function App 側の [認証] 機能が有効になることが原因。
# 何故かドキュメントには見当たらない
なので、元に戻したければ下図のように、未認証のアクセスを許可するよう変更する。
これでリンク前の状態に戻って HTTP アクセスが可能になる。( ホッ
最後に
Qiita のエンジニア フェスタ 2021 で Static Web Apps をテーマにした記事を絶賛募集中です。
4K 42 インチ モニターとかが当たる (かもしれない) らしいです。ほしい。