##はじめに
APIGateway+Lambdaを使って、RESTfullなAPIによるPDF生成APIをデプロイメントする時に色々とハマったので、その時の備忘録を記事にしました。
基本はServerlessFrameworkを使ったデプロイメントの自動化を目指して作業をしていった内容をまとめています。
##APIGatewayでメディアタイプの追加
まず、APIGatewayのバイナリレスポンス対応がどういうフローになるかを説明しておきます。
-
【リクエスト】
ブラウザ → (jsonリクエスト) → APIGateway → Lambda -
【レスポンス】
Lambda → (ファイルを文字列:Base64変換) → APIGateway → (文字列をデコード:Base64変換) → ブラウザ
上記のようにLambdaからはBase64変換されたバイナリデータの文字列が返却される事が期待されています。Lambdaで返却する時の処理として、ここがまずポイントになります。
###APIGatewayのバイナリサポート周辺
APIGatewayでPDFファイルを直接返す場合、APIGatewayでバイナリサポートを有効にする必要がある。
まず、ここにメディアタイプを追加する必要がある。
これをServerlessFrameworkのPluginで対応させる場合は以下のPluginを使って対応可能。
ちなみに、すごく紛らわしいがserverless-apigwy-binaryというPluginもある。これは後ほど説明するが、この↑バイナリメディアタイプを設定するものではないので、要注意。
統合リクエストの設定(英語名:Integration)
結構ハマった所。通常のServerlessFrameworkで生成されるテンプレートを使ってデプロイすると、統合リクエストは「Lambdaプロキシ統合の使用」にチェックが入った状態でデプロイされます。
ここを外すと、「統合レスポンス(英語名:IntegrationResponse)」が変更できるようになります。この時、統合リクエストのマッピングテンプレートは、マッピングテンプレートをどう使えば良いか習熟している場合は普通にそこを設定すれば良いのだろうけど、良くわからない場合は「テンプレートが定義されていない場合(推奨)」を選択しておきつつ、設定されてるマッピングテンプレートを全て削除しておくのが良いと思います。
##参考リンク