APIGateway→直接S3にファイルを保存するAPIを作成する方法


概要

タイトルそのままです。 Lambdaを間に挟まず、 エクセルファイルをAPIGateway→S3にアップロードするAPIを作成しました。途中、主にバイナリデータの扱いで時間を消費したので備忘も兼ねてまとめます。

1.ベースとなるAPIをつくる

まず公式ドキュメントにしたがってAPIを作成します。

2.認証を設定する

IAM認証周りはこちらの記事を参考にしました。

3. base64を受け取ってバイナリに変換してもらう設定をする

これは設定にいくつかパターンがありえます。まずはこの公式ドキュメントの表を確認しましょう。今回は表で上から2行目の「テキストデータ+任意のデータ型+未定義+CONVERT_TO_BINARY => Base64でデコードされたバイナリBLOB」 にあてはまるように進めていきます。実はこれは最終的にたどり着いた解なので、私がハマったポイントを以下に紹介します。とりあえず作成したいだけの人は4まで飛ばしてください。

3-1. プチハマりポイント:FileReader

これはJSのFileReaderのハマりポイントですが、readAsDataURLを使っている場合は、MDNにあるように冒頭に data:*/*;base64,という文字列が挿入されるのでこれを外してからbodyに設定するようにしましょう。

3-2. ハマりポイント:binaryMediaType

実は、3で紹介している表を最初から参考にしていた訳ではありませんでした。初めはこの公式ドキュメントにしたがって、まずは統合リクエストのコンテンツの処理を「バイナリに変換」に設定→binaryMediaTypeの設定等を行ったのですが、上の表をみるとわかると通り、今回の場合はbinaryMediaTypeの設定がいらなかったのです。
APIをデプロイするとDLできるSDKからAPIを呼び出すと、200で成功するのですが、いざS3でファイルを開くとbase64からデコードできていない…。しかもこの間なぜかマネジメントコンソール上からのテストは成功(=バイナリに無事変換されてS3に渡されていた)していて余計に混乱の元となり、エンドポイントからのリクエストの投げ方が悪いのかとしばらく考えてしまいました。その後、この表を見つけてbinaryMediaTypeを消すことで、SDKからのリクエスト経由でもきちんと変換されたファイルがS3に渡るようになりました。

4.APIをテストする

マネジメントコンソールのテスト機能からテストしてみましょう。ヘッダーにContent-Typeを設定するのを忘れずに。

5.CORSの有効化する

マネジメントコンソールのAPIのページのメニューから、CORSの有効化を選択します。デプロイ前に必ず必要な作業なので忘れないようにしましょう。

6.APIをデプロイする

同じくメニューから、APIのデプロイをしましょう。

まとめ

ざっと見てもお分かりかと思いますが、ハマりポイント以外は 基本的にとっても簡単です。とりあえず公式をちゃんと読んでおけば大丈夫です。 ただし、私の場合バイナリに変換という処理を必要としていて少し時間を溶かした上に、あまり直接S3に置きに行っている事例が公式以外で見当たらなかったのでまとめておきました。公式ドキュメントがちょっと散り散りに配置されている(伝わるだろうか…?)のはつらい気がする。