背景
あるサイトの開発をした際にいくつかのAPIをServerlessFrameworkとAWS Lambdaの組み合わせで作った際にに、バイナリメディアを返すAPIを追加すると今まで動いていたAPI含め動かなくなったのでその時の問題点を記載していく。
問題
ServerlessFrameworkでは以下の形で簡単にCORSの対応をすることができる。
functions:
sample:
handler: handler.sample
events:
- http:
path: sample
method: get
cors: true
この形でcorsの対応を行うと、ServerlessFramework側でAPI Gatewayのモックサーバ設定を使ってOPTIONSリクエストを処理する部分を自動で作ってくれる。
通常JSONを返すようなAPIであれば特に問題は発生しないが、バイナリメディアを返すようなAPIを絡ませるとOPTIONSリクエストが全て失敗してしまうようになる。
原因
バイナリメディアを返すためにはAPI GatewayのBinary Media Typeを設定する必要がある。
今回返したいバイナリメディアはPDFだったため、正常にレスポンスを返すためには「*/*」を設定する必要がある。
しかし、これを設定すると全てのメディアタイプをバイナリメディアとして対応しようとしてしまうため、自動的に設定されるモックサーバではバイナリペイロードを処理できずにOPTIONSリクエストで失敗する状態が発生してしまう。
解決策
自前でCORS対応をする。
この時はServerlessFrameworkでCORSを有効化することを諦めて自前でCORS対応をするようにした。
モックサーバの設定をいじって処理できるようにするとよかったのだがドキュメントを見る限りではその設定を見つけることはできなかった。(無いよね??)