API Gateway から直接S3バケットにアクセスしてみる

はじめに

API Gateway って裏にLambdaが定番だと思いますが、裏に配置できる物ってかなり多いんですよね。
f:id:rioner2525:20200228112532p:plain
Other AWS services とあるように API Gateway の裏に何でも配置できそうです。
Lambdaを介さないで済むなら、API Gateway から直接S3バケットにアクセスできた方がお金の節約になるなと思ったので記事にしておく次第です。

本題

API Gateway リソース設定

API Gateway を作成してリソースを作成しましょう。
ここでURLからS3バケットを指定できるように波括弧を使用してパスパラメータを使います。
リソースパスの部分に波括弧{}を追加するだけでよいです。
余談ですが...リソースパス下の情報では角括弧と書いてありますが角括弧は[]だと思っているので、この部分はAWSさんの記述ミスな気がしてます。 f:id:rioner2525:20200228114310j:plain
そしてアクセスしたいファイルの配置部分まで階層を指定できるようにリソースの下にさらにリソースを追加していきます。今回は3階層にしました。
f:id:rioner2525:20200228114916j:plain

API Gateway メソッド設定

ここからS3バケットのファイルにアクセスしたい方法に応じてメソッドを作成します。
今回はS3バケットにファイルを配置するため、PUTメソッドで作成してみます。
S3バケットからファイルをダウンロードしたい方はGETメソッドにしてください。

f:id:rioner2525:20200228120412j:plain
設定例はこんな感じです。

リソースの設定に応じてパス上書き部分は修正してください。
また、実行ロールにはS3に関するアクセス権限とAPI GatewayがアクセスできるPrincipal設定が必要です。

API Gateway リクエスト設定

ここまでの設定でメソッドリクエスのリクエストパスにそれぞれのリソースが自動で設定されているハズです。
f:id:rioner2525:20200228162607j:plain
では統合リクエスからこれらのリクエストパスを URL パス部分にマッピングしていきましょう。

f:id:rioner2525:20200228163618j:plain
この画像部分を編集していきます。

f:id:rioner2525:20200228163809j:plain
こんな感じにしましょう。

この設定を行うことでURLからきたパスをそのままS3バケットの階層として受け渡すことができるようになります。

S3バケットAPI Gateway 経由でアクセスしてみる

ここまでの設定でAPI Gateway から直接S3バケットにアクセスできる設定が完了しております。
というわけで早速アクセスを試してみましょう。
APIをデプロイして表示されるURLを叩いてみます。
※今回はパブリックAPIでデプロイしています。 f:id:rioner2525:20200228180051j:plain
f:id:rioner2525:20200228180143j:plain コピペ用

echo test > test.txt  
curl -XPUT -d test.txt https://API-ID.execute-api.ap-northeast-1.amazonaws.com/STAGE/bucket/key1/key2/key3  

このコマンドでtest.txtが指定したS3バケットの配置に格納されるハズです。
今回はtest.txtファイルをbucket/test/test2/test.txtのパスで叩いたので、その配置に格納されていました。

f:id:rioner2525:20200228180511j:plain
S3バケットに直接ファイルを格納できました

終わりに

API Gateway からLambdaを介さずに直接S3バケットにアクセスできました。
GASからAPIを叩くこともできるので私はGoogleスプレッドシートの内容をS3バケットjsonで送ったり、S3バケットから取得したファイルの情報をもとにスプレッドシートの内容を毎日自動更新したりといった感じで使っています。
Lambdaを叩かなくてよい分、多少コスト面でいい気分になれるので途中でファイルを加工する必要がなければ試す価値があるかと思っています!
以上です。