API Gateway を利用して S3 にファイルをアップロードする
はじめに
API Gateway から Lambda を介さず S3 にファイルをアップロードした際の手順メモ。
設定後は curl
コマンドで API Gateway のエンドポイントに対してファイルを PUT し、S3 のバケットにファイルがアップロードされたところまで確認。
S3 バケット作成
マネージメントコンソールの Amazon S3 より、API Gateway を介してファイルをアップロードするバケットを作成しておく。バケットは 「パブリック・アクセスをすべてブロック」 のまま。その他の設定も基本的にデフォルトで OK だった。
IAM ロール作成
マネージメントコンソールの IAM より API Gateway から S3 へのアクセスするためのロールを作成する。信頼されたエンティティの選択で AWS サービスの API Gateway
を選択
ロール作成後に、該当ロールの インラインポリシーの追加 より、S3 バケットへの PUT を許可するポリシーを作成する。
作成した my-sample-20210218
バケットに PUT を許可する。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:Put*", "Resource": [ "arn:aws:s3:::my-sample-20210218/*" ] } ] }
信頼関係の「信頼されたエンティティ」が apigateway.amazonaws.com
以外となっている場合は 信頼関係の編集 からポリシードキュメントを変更する。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
API Gateway
REST API を作成
マネージメントコンソールの API Gateway より REST API を作成する。
新しいAPI
を選択し、「エンドポイントタイプ」を リージョン
にして API を作成
リソースの作成
API 作成後は「アクション」の「リソース作成」より、新しい子リソース {folder}
を追加し、同様に {folder}
の子リソースとして {item}
を追加する。
メソッドの作成
「アクション」の「メソッド作成」より、リソース {folder}/{item}
に PUT
メソッドを作成する。
項目 | 内容 |
---|---|
結合タイプ | AWSサービス |
AWS リージョン | ap-northeast-1 |
AWS サービス | Simple Storage Service(S3) |
HTTPメソッド | PUT |
アクションの種類 | パス上書きの使用 |
パスの上書き | {bucket}/{object} |
実行ロール | 作成した IAM ロールの ARN を指定 |
コンテンツの処理 | パススルー |
メソッド作成後に、「統合リクエスト」から URL パスパラメータを追加しパスのマッピングを設定する。
名前 | マッピング元 |
---|---|
bucket | method.request.path.folder |
object | method.request.path.item |
「メソッドリクエスト」から 「API キーの必要性」 を true
に変更する。IAM による認証を利用する場合は「許可」を AWS_IAM
に変更する。
デプロイ
「アクション」より「API のデプロイ」を選択する。「デプロイされるステージ」は v1
を指定。デプロイすると REST API のエンドポイントが公開される。
API キーの作成
使用量の作成
同じく使用量プランを作成し、作成した使用量プランにデプロイした API のステージを追加する。
API キータブでは、「API キーを使用量プランに追加」より、作成した API キーを紐付ける。
動作確認
最後に curl
コマンドで確認する。
-H
のx-api-key
で作成した API キーを指定。- 同じく
-H
のContent-Type
でtext/csv
を指定。指定しないと JSON 形式でアップロードされてしまう。 --upload-file
で S3 にアップロードするファイルを指定。-v
もしくは--verbose
で詳細表示。
$ curl -H "x-api-key: <作成した API キー>" -H 'Content-Type:text/csv' --upload-file test.csv https://<API Gateway のエンドポイント>/<作成したバケット>/<オブジェクト名> -v
レスポンスコードが 403
や Forbidden
が返ってくる場合は、IAM ロールの信頼関係の設定が誤っていないか確認。