0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

閉域化したBlobStorageにAzure Functionsからアクセスしてデータを取得する

Posted at

はじめに

完成形はあくまでも半閉域化レベルです。
(そもそも記事書いてる本人が閉域化の学習中なので詳しい人いたら教えてほしいです)

前回、Azure FunctionsからBlob Storageにアクセスする記事を書きました。

ただし、この構成はパブリックアクセスに対して制限をかけていません。
もちろん、Functionsは認証レベルをFUNCTIONにしているので、エンドポイント以外に関数キー等のキー情報が必要ですし、Blob Storageも匿名アクセスは許可していないので、接続文字列などのキー情報が必要です。
ただ、キー情報が漏れてしまえば世界中どこからでもアクセス可能です。
前回の記事の状態はざっくり書くとこんな感じかなと思います。
image.png

企業内で利用するにはこれだとちょっとセキュリティ的にNGなことがあるので、今回は以下のように設定します。

  • Blob Storage:パブリックアクセスを無効にしてプライベートエンドポイントを使ってアクセスする
  • Functions:サービスエンドポイントで会社のグローバルIPのみ許可するようにする

リソースの作成

仮想ネットワークを作成する

image.png

適当な名前で作成します。
セキュリティタブは今回はデフォルトのままにして、アドレス空間もデフォルトのまま(無駄が多いですが)にし、サブネットを追加します
image.png

追加したサブネットの情報はこんな感じ(これも今回はデフォルトのまま)
image.png
追加後はそのままリソースを作成する

Blob storageを作成する

前回記事書いたときと同じ構成で作成します。基本的に名前決めたらあとはデフォルトのままでよいです。
image.png

匿名アクセスのチェックがOFFになってることだけはちゃんと確認する
image.png

リソース作成後は前回記事と同様に「faq」というコンテナを作成しファイルをアップする。
※ファイルの中身については冒頭に貼ってる前回記事を参照してください。(全く同じなので)
image.png

Functionsを作成する

関数アプリを作成する際は、今回はApp Serviceプランを選択します。
flex Consumptionプランはこの後補足しますが、基本的にpremiumより右側しか仮想ネットワーク対応してないです。ただ、premiumより右側は正直インスタンスが常時稼働しているので、Serverlessとしてのうまみが薄れてしまうのが難点なんですよね(2024/5/22までは)
image.png

補足:Flex Consumptionの登場

日本時間で2024年5月22日から始まったMicrosoft BuildのイベントでFlex Consumptionプランが発表されました。このプランでは仮想ネットワークがサポートされたことで、上記で記載していたServerlessのうまみが薄れてしまっていたところが解消されます。
現在パブリックプレビュー段階で、残念ながら日本リージョンでリソースを作成することが出来ませんが、この記事を読んでる方が「データレジデンシー(データをホストする物理的な場所)」を気にしない場合はFlex Consumptionを選ぶとよいです

pythonの環境として作成していきます。名前は適当に決めてください
image.png

価格プランは新規に作成し、B1を選択しておきます。選択後はStorageタブへ
image.png

Function用のストレージも新規に作成しておきます
image.png

次のネットワークも今の時点ではパブリックアクセスONで進めます(あとで制限入れます)
image.png

次の監視タブはInsightsを有効にしておきます(新規に作成します)
image.png

デプロイタブはデフォルトのまま進めます
image.png

リソースを作成しましょう

関数を実装する

これは前回記事と同じ内容なので、下記を参照して実装し、デプロイしてください
※環境変数の設定も忘れずに

Functionにデプロイし、テスト実行してBlobに保存したファイルが読み取れたら、ここから半閉域化をしていきます
image.png

Blob Storageのパブリックアクセスを無効にする

ストレージアカウントにアクセスし、ネットワークの設定を開き、パブリックアクセスを「無効」に変えて保存します。
image.png

これによってインターネットを経由したストレージへのパブリックなアクセスは完全にブロックされました
image.png
試しに先ほどの関数をもう一度テスト実行してみるとエラーになることがわかります
image.png

Blob Storageのプライベートエンドポイントを作成する

先ほどのストレージのネットワーク設定で、プライベートエンドポイント接続タブを開き、プライベートエンドポイントを追加していきます
image.png

名前とかは適当に入れて、リソースをクリック
image.png

次のリソースでは対象サブリソースで「blob」を選択して次に進みます
image.png

次の仮想ネットワークでは、作成した仮想ネットワークのdefaultサブネットを指定して次に進みます
image.png

次のDNSでは、プライベートDNSゾーンと統合する設定で進めます。設定値はデフォルトのままで良いです
image.png

これによって、プライベートエンドポイントように割り振られたIPアドレスと、先ほど入力して決めたプライベートエンドポイントのリソース名を紐づけるための名前解決を自動でやってくれるようになります。

次のタグは特に設定不要なので、そのままプライベートエンドポイントを作成してしまします。
リソースができるとこんな感じでプライベートエンドポイントが追加されます
image.png

現在の構成はこんな形です
image.png

Functionの受信トラフィックを制限する

今回はグローバルIPアドレスを指定する形で、指定したIP以外からのアクセスをブロックします。
いわゆるサービスエンドポイントによる制限です。

Functionのネットワークの設定画面を開き、公衆ネットワークアクセスの「アクセス制限なしで有効」をクリック
image.png

  • 公衆ネットワークアクセス:選択した仮想ネットワークとIPアドレスから有効
  • 一致しないルールのアクション:拒否

に設定し、追加アイコンからIPアドレスを追加します。
image.png

  • 名前:適当に入れる
  • アクション:許可
  • 優先度:100
  • 種類:IPv4
  • IPアドレスブロック:自身が使っているネットワークのグローバルIPアドレス

を指定して追加します(他の項目はデフォルトのまま)
image.png

リストに追加されたら忘れず保存ボタンをクリック
image.png

これによってFunctionへの社外IPからのアクセスがブロックされました。
image.png

FunctionのVNet統合を実施する

通常、Functionからの送信トラフィックはインターネットに向けて流れていくようになっていますが、VNet統合を行うことで、仮想ネットワークに向けて送信トラフィックを流すことで、仮想ネットワーク内のリソースにアクセスすることが出来るようになります。(あくまでもFunctionからの送信トラフィックの制御を行うためのものです)

Functionのネットワークの設定を開き、送信トラフィックの構成のところにある仮想ネットワーク統合の「未構成」をクリック
image.png

仮想ネットワーク統合の追加をクリック
image.png

作成したVnetのVNetIntegrateのサブネットを選択し、接続をクリックします
image.png

これによってFunctionから仮想ネットワーク経由でストレージにアクセスし情報を取得できるようになりました
雑なイメージですが、こんな形です
image.png

動作確認

外部からアクセスしてエラーになることを確認

コマンドプロンプトから関数を実行してみる

curl -X POST "<your function url>" -H "Content-Type: application/json" -d ""

image.png

許可されたネットワークからアクセスして成功することを確認

同じコマンドを実行してエラーにならず情報が取得できることを確認
image.png

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?