ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

Azure Static Web Apps から VNET のリソースを使う

はじめに

夏休みの宿題として、即席 POST を。

Static Web Apps を使って Web サイトを構築する時、VNET 内で保護されたストレージやデータベースの中のデータを使ったり、そのデータを更新したりしたい、かもしれない。

でも Static Web Apps には VNET につなぐ機能 (App Service でいうところの VNET 統合) がない。
# 静的サイトのホスティングなんだから、当然な気もする。

そうだ!

Static Web Apps は、バックエンド API として Function App が使えるじゃないか!
Function App の VNET 統合を使って、VNET 内につなごう!!

構成

つまりはこう。

f:id:horihiro:20210727105346p:plain

構成のポイント。

  1. Static Web Apps の後ろに Function App
  2. ストレージ アカウントやデータベースは、プライベート リンクを使って VNET 外からのアクセスを全力で拒否
  3. Function App は VNET 統合で、2. のプライベート リンクと同じ VNET に接続

やってみる

Azure Functions を VNET 統合する

docs.microsoft.com

全く難しいことはなく、ポータルからポチポチしたら設定完了。

最近プレビューで出てきた [ネットワーク (プレビュー)] ブレードも見やすくていい感じ。

f:id:horihiro:20210727203435p:plain

注意点は以下の通り

  • 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)

ドキュメントはこちら。

docs.microsoft.com

何故かこれだけ英語。

でも VNET 統合よりも設定は簡単で、ポータルから [関数] ブレードからポチポチしてリンク対象の Function App を選ぶだけ。

f:id:horihiro:20210727204236p:plain

結果

目論見通り、Function App からのアクセスは VNET 内のリソースにつながるので、関数のトリガーは HTTP にしてバックエンド API として作り、VNET 内にあるストレージ アカウントやデータベースから入力バインドで取ってきたデータを HTTP のレスポンスにする、なんてことも簡単にできた。

バインディング、最高。

諸注意

一度 Static Web Apps と Function App をリンクすると、そのリンクを解除した後も Function App への HTTP アクセスで 401 が返ったままになり、まともに使えない。

これは、Static Web Apps とリンクした際に、Function App 側の [認証] 機能が有効になることが原因。
# 何故かドキュメントには見当たらない

なので、元に戻したければ下図のように、未認証のアクセスを許可するよう変更する。

f:id:horihiro:20210727105414p:plain

これでリンク前の状態に戻って HTTP アクセスが可能になる。( ホッ

最後に

Qiita のエンジニア フェスタ 2021 で Static Web Apps をテーマにした記事を絶賛募集中です。

qiita.com

f:id:horihiro:20210727210246p:plain

4K 42 インチ モニターとかが当たる (かもしれない) らしいです。ほしい。