API Gateway から直接S3バケットにアクセスしてみる
はじめに
API Gateway って裏にLambdaが定番だと思いますが、裏に配置できる物ってかなり多いんですよね。
Other AWS services とあるように API Gateway の裏に何でも配置できそうです。
Lambdaを介さないで済むなら、API Gateway から直接S3バケットにアクセスできた方がお金の節約になるなと思ったので記事にしておく次第です。
本題
API Gateway リソース設定
API Gateway を作成してリソースを作成しましょう。
ここでURLからS3バケットを指定できるように波括弧を使用してパスパラメータを使います。
リソースパスの部分に波括弧{}
を追加するだけでよいです。
余談ですが...リソースパス下の情報では角括弧と書いてありますが角括弧は[]
だと思っているので、この部分はAWSさんの記述ミスな気がしてます。
そしてアクセスしたいファイルの配置部分まで階層を指定できるようにリソースの下にさらにリソースを追加していきます。今回は3階層にしました。
API Gateway メソッド設定
ここからS3バケットのファイルにアクセスしたい方法に応じてメソッドを作成します。
今回はS3バケットにファイルを配置するため、PUTメソッドで作成してみます。
S3バケットからファイルをダウンロードしたい方はGETメソッドにしてください。
リソースの設定に応じてパス上書き部分は修正してください。
また、実行ロールにはS3に関するアクセス権限とAPI GatewayがアクセスできるPrincipal設定が必要です。
API Gateway リクエスト設定
ここまでの設定でメソッドリクエストのリクエストパスにそれぞれのリソースが自動で設定されているハズです。
では統合リクエストからこれらのリクエストパスを URL パス部分にマッピングしていきましょう。
この設定を行うことでURLからきたパスをそのままS3バケットの階層として受け渡すことができるようになります。
S3バケットにAPI Gateway 経由でアクセスしてみる
ここまでの設定でAPI Gateway から直接S3バケットにアクセスできる設定が完了しております。
というわけで早速アクセスを試してみましょう。
APIをデプロイして表示されるURLを叩いてみます。
※今回はパブリックAPIでデプロイしています。
コピペ用
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のパスで叩いたので、その配置に格納されていました。
終わりに
API Gateway からLambdaを介さずに直接S3バケットにアクセスできました。
GASからAPIを叩くこともできるので私はGoogleスプレッドシートの内容をS3バケットにjsonで送ったり、S3バケットから取得したファイルの情報をもとにスプレッドシートの内容を毎日自動更新したりといった感じで使っています。
Lambdaを叩かなくてよい分、多少コスト面でいい気分になれるので途中でファイルを加工する必要がなければ試す価値があるかと思っています!
以上です。