VNet統合したシングルテナントLogic Appsで、Managed Identity認証を有効にしたAzure Blob Storageコネクターを使い、Blob storageにService/Private Endpointで接続しようとすると、HTTP 403で失敗してしまう

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

問い合わせ

いつもと違う方から、以下のような問い合わせが届いた。

現在Standard SKUのLogic Appsでワークフローを作成している。Managed Identityで認証させてBlob storageのBlobを取得するため、Azure Blob Storageコネクターをこのワークフローで使おうと検討して試行している。VNetに接続しないBlob storageの場合は問題なくこのコネクターで接続できたのだが、VNet統合し、Blob storageへのアクセスにService EndpointやPrivate Endpointを使うと、認証に失敗してアクセスできない。これを回避するにはどうすればよいか?

ネットワークトポロジーは以下のような感じ。

Logic Appsのコネクターとは、以下のようなもの。

Azure Blob Storage
https://docs.microsoft.com/connectors/azureblobconnector/

この中の、Blobコンテンツを取得する (v2) が今回課題になっているもの。

https://docs.microsoft.com/ja-jp/connectors/azureblobconnector/#blob-コンテンツを取得する-(v2)
https://docs.microsoft.com/en-us/connectors/azureblobconnector/#get-blob-content-(v2)

そして、エラーとはこのようなもの。

{
  "status": 403,
  "message": "This request is not authorized to perform this operation.\r\nclientRequestId: fc825355-0558-4b89-9da0-cb34febd3517",
  "error": {
    "message": "This request is not authorized to perform this operation."
  },
  "source": "azureblob-je.azconn-je-001.p.azurewebsites.net"
}

回避策

現時点では、このコネクターが正しく機能していないので、HTTPコネクターでBlob Storage REST APIを呼び出すしかない。Blob StorageのREST APIは以下を参照。

Get Blob
https://docs.microsoft.com/rest/api/storageservices/get-blob

具体的な構成方法

ふつうにコネクターに設定すればよいが、注意点は以下。

必須HTTP Header

Get Blobの場合、Authorization、Date (もしくはx-ms-date) 、そしてx-ms-versionを指定する必要がある。x-ms-dateは、以下の式を構成しておく。

formatDateTime(utcNow(),'r')

x-ms-versionは現在の最新でよいので、2021-06-08を指定する。AuthorizationはManaged Identity認証を使うので、ここでHTTP Headerとして明示的に指定する必要はない。

認証の構成

認証の設定フィールドは、”Add new parameter” をクリックすると現れる。ここで、以下のように設定する。Storageの場合、Audienceは必須なので注意。

  • 認証の種類 (Authentication type) : マネージドID (Managed identity)
  • マネージドID (Managed identity) : システム割り当てマネージドIDもしくは、ユーザー割り当てマネージドID
  • 対象ユーザー (Audience) : https://storage.azure.com/

なお、Audienceとして指定するURIは、API Managementのドキュメントがわかりやすい。

マネージド ID を使用してバックエンド サービスで認証する / Use managed identity to authenticate with a backend service
https://docs.microsoft.com/azure/api-management/api-management-authentication-policies#use-managed-identity-to-authenticate-with-a-backend-service

これらの設定が終了すると、以下のような設定になっているはず。ここでURIは

https://{storage account}.blob.core.windows.net/{Blob Container}/{Blob}

の形式で指定している。

これでおしまい。

テスト

以下は、上記の設定をHTTP Request/Responseではさみ、Query parameterとしてBlobのファイル名を指定できるLogic Appsを作成し実行してみた結果(いつものファイルなのはご愛敬)。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中