web-dev-qa-db-ja.com

Lambdaプロキシを使用するAWS API Gatewayは常にbase64文字列応答を生成します

API Gateway Lambdaプロキシ統合を使用していて、バイナリapplication/protobuf応答を返そうとしています。私が何をしても、応答本文は常にbase64でエンコードされた文字列です

  • APIGでapplication/protobufbinary media typesとして設定しています
  • 私のクライアント(JavaScript)はPOSTで次のヘッダーを送信しています:Accept: application/protobuf Content-Type: application/protobuf
  • 私のラムダはcontent-type: application/protobufで応答し、IsBase64Encodedラムダ応答をtrueに正しく設定しています

どのようにしてAPIGに文字列をbase64デコードさせますか?私が最初にこれを試したとき、私は数ヶ月前にこれを働いていたと誓います。

注:*/*binary media typesとして試してみました

背景を追加するいくつかの関連する投稿:

更新:

binary media type*/*に設定されている場合にのみ機能することがわかりました。これに設定すると、クライアントのAcceptヘッダーは影響を受けません。

(IsBase64Encodedがfalseまたは設定されていない場合でも)すべての応答がデコードされようとするため、*/*を使用することの多くの悪い副作用

Chromeネットワーク検査ツールは常にバイナリデータをPreviewタブでbase64エンコードとして表示するため、デコードしていないと思いました。Response タブ。

7
rynop

問題は、API Gatewayの前でCloudFrontを使用していて、AcceptヘッダーをOrigin(APIG)に渡していないことでした。

Lambdaプロキシでバイナリを処理することに関するドキュメントは素晴らしいものではないので、ここに簡単な要約を示します。

  • クライアントはAcceptヘッダーを送信する必要があります 1番目のメディアタイプが一致 API Gatewayでbinary media typesとして設定したもの
  • Lambdaは、バイナリメディアタイプを提供する場合、IsBase64Encodedをtrueに設定し、bodyをbase64エンコードする必要があります

クライアントのAcceptヘッダーがAPI Gatewayのbinary media typesのエントリと一致し、これらの条件が満たされている場合、API Gatewayはクライアントに応答を送信する前に変換(base64デコード)します。

このブログ投稿 (CloudFrontなしで)機能させる方法をステップバイステップで説明します。

これ は本格的な aws-blueprint で、CloudFrontで製品グレードのci/cdを取得します。

4
rynop