ペペロン頭脳

ソフトウェアエンジニアのメモ的なアレ。

Lambda+API Gatewayで画像を返す時に気をつけるべきx+1個のこと

qiita.com

この記事のおかげでやりたいことができた…のだが、
CloudFront以外全部押さえたのにレスポンスがバイナリで返ってこない!と4時間ぐらいハマったのであと1つの重要ポイントを書いておく。

CloudFrontかませないで、APIGWに直接アクセスしに行くケースの話です。

クライアントのAcceptヘッダはワイルドカード指定不可、明示必要

  • APIGWのバイナリメディアタイプ: image/jpeg
  • 呼び出しクライアントからのAcceptヘッダ: image/* あるいは */*

と指定すれば通ると思い込んでたんですよ。
でも返ってくるのはBASE64のテキスト。
マジで分からなくて組み合わせを試していった結果、クライアントからのワイルドカード指定はNGなんだとわかりました。タイプ明示する必要がある。

実験結果

実験はPostmanで実施しました。

APIからのレスポンスに含めているContent-Type APIGWバイナリメディアタイプ指定 クライアントAcceptヘッダ 結果
image/jpeg image/* */* NG
image/jpeg image/jpeg */* NG
image/jpeg image/* image/jpeg OK
image/jpeg image/* image/png, image/jpeg OK
image/jpeg image/* image/jpeg, image/* OK
image/jpeg image/* image/png, image/* OK(!?)
image/jpeg image/* image/*, image/jpeg NG
image/jpeg image/* image/* NG (!!)
image/jpeg image/* (none) NG
image/jpeg image/* image/png OK (!?)
image/jpeg image/jpeg image/png OK (!?)
image/jpeg image/jpeg image/* NG
image/jpeg image/png image/* NG
image/jpeg image/png image/png OK (!?)
image/jpeg image/png image/jpeg OK (!?)
image/jpeg image/png image/png, image/jpeg OK (!?)
image/jpeg image/png (none) NG


この結果から言えることは、

  • APIGW側バイナリメディアタイプはタイプ明示でもワイルドカードでもよいが、クライアントAcceptヘッダのワイルドカード指定はNG。受け付けてくれない
    • Acceptヘッダにワイルドカードよりも高い優先順位にタイプ明示があれば、それは正常に扱われる
  • jpegpng、指定が食い違うケースでもなぜかバイナリ変換されて返ってくる謎。
    • 少なくともAPIレスポンスに指定したContent-Typeは見ていないように思える
    • が、APIGWがjpegでクライアントAcceptがpngでも通るってどういう挙動なの…?

ちとよくわからない挙動もありつつ、
Acceptヘッダは*/*とかにせず、image/jpegとか明示が必要ということは確かな模様。