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に置きに行っている事例が公式以外で見当たらなかったのでまとめておきました。公式ドキュメントがちょっと散り散りに配置されている(伝わるだろうか…?)のはつらい気がする。
Author And Source
この問題について(APIGateway→直接S3にファイルを保存するAPIを作成する方法), 我々は、より多くの情報をここで見つけました https://qiita.com/rena_m/items/f98eb9fdbf7511f7abae著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .