API Managementを経由してblobをBlob storageへ格納したい(その2)

このエントリは2025/03/21現在の情報に基づいています。将来の機能追加や変更に伴い、記載事項からの乖離が発生する可能性があります。

問い合わせ

以下のエントリを読んだお初の人からお問い合わせをもらった。

現在API Managementを内部モードでVNETにデプロイしている。そしてVNETへの入口にはApplication Gatewayを配置している。このときに、Blob storageに外部からファイルアップロードさせたい。ただ、以下のような要件や制限があるため、どのような構成がよいか思案している。

  • 格納先のBlob storageはPrivate EndpointでVNETに引き込まれており、外部ネットワークからのアクセスを禁じている
  • 送信されるファイルサイズは4GB以上である

図にすると、以下のような構成らしい。

そして、Application Gatewayは、リクエストの最大サイズ4GBという制限があり、そのままではファイルを送信できない。

Azure Application Gateway の制限 / Azure Application Gateway limits
https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-application-gateway-limits

さてどうしたものか、ということのよう。

解決策の例

以下は一つの例であり、これが唯一の解決策ではない。

  1. ファイルを受け渡すためのBlob storageを新規で作成し、Private accessのみ許可しておく。
  2. APIMはファイル送信リクエストをもらったら、当該Blob storageへのアクセスを許可したSASキー付きのURLを返す。バックエンドサービスは何で作成しても問題ないが、おそらくはFunctionsが一番簡単。
  3. クライアントは受け取ったSASキー付きURLを使って、直接Blob storageにファイルをアップロードする。
  4. 元々アップロードしたかったStorageにObject replicationなどを使って移送する。

図にすると以下のよう。

注意点は以下の通り。

1. ネットワーク制限がある場合のSASトークン

通常、Private accessのBlob containerに対しても、SASトークンがあれば一時的にアクセスが可能だが、ネットワークの制約がある(今回はPrivate Endpointを構成済みで、当該Storage accountへの外部からのアクセスを全部拒否している)場合、SASトークンでPublic IP縛りにしてもアクセスできない。

そのため、別のストレージアカウントにファイル転送用Blob containerを作成し、Blob containerのObject replicationやFunctionsのTriggerを使ったコピー操作の実装が必要になることが多い。

2. SASトークンの有効期限

ファイルアップロード完了までの時間がどれぐらい掛かるのか、適切な時間間隔を見つけて設定する必要がある。30分でいいのか、1時間かかるのか、Internetを経由する場合は時間が読めないが、それでも長時間有効なSASトークンを作成するのはセキュリティ上よろしくない点は留意しておかねばならない。

この方式のよいところ

大きく以下の2点。特に前者のメリットが大きい。

  1. APIMを大きなBlobが通る必要がないため、API Gatewayのパフォーマンスが低下せず、通常のAPI利用への影響がなくなる
  2. SASトークンは送信元IPアドレスで制約をかけることができるため、同一Public IPを使っていない限り、第三者に奪取されてもアクセスできない。URL取得のためにアクセスしてきたリクエストのHTTP Headerで送信元Public IPを取得 (x-forwarded-for) できるので、これを使うことでPublic IP制限を構成できる(なお、SASトークンで露見しているPublic IPだけを変更したり削除したりしてもアクセスできない)。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください