「Amazon API Gateway」から「Lambda」を通さずに「S3」へアクセスできるようにしてみる( `aws-cli` で構築)
はじめに
AWSを利用したサーバレスな事例が増えてきました。
例えば以下のような構成の事例がWeb上で掲載されています。
「API Gateway」 から 「Lambda」 を経由して 「DynamoDB」あるいは「S3」 にアクセスする例は、様々な方がWeb上に掲載しています。
「API Gateway」 から 「S3」 へ直接アクセスするための例はあまり見つからず、またあったとしても AWS-CLI を使って設定している例が見つからなかったため、整理してみました。
ちなみに設定した内容はAmazonが提供している以下のドキュメントを参考にしています。こちらのドキュメントは「AWS マネージメントコンソール」からポチポチ操作していく内容となっています。
作成する「API」概要
- S3にアクセスできる。(今回は読み取りのみ)
- アクセス用URLは
https://<host>/<S3-BUCKET-NAME>/<S3-OBJECT-KEY>
の形式とする。
準備
aws-cli
コマンドが利用できるjq
コマンドが利用できる
ja
はなくてもよいのですが、今回各AWS構成要素を作成した際のJSONレスポンスをパースしてできる限りコマンドラインのみの操作としたかったので利用してみました。
検証環境
手順
デプロイ直前までの流れは以下の通り。
(デプロイは次回実施してみる。)
- IAMの作成
- S3バケットの作成
- 「REST API」の作成
- 「REST API リソース」の作成
- 「REST API リソース」に対するメソッドの作成
- リソースに対してリクエスト、レスポンス設定を行う
- テスト
セットアップ時に事前に決めておかないといけない内容がいくつかあったため表にまとめておきました。
セットアップ手順は非常に長いですが 事前に決めておかないといけない情報は意外と少ないです。
設定項目(当エントリで登場する環境変数名) | 目的 | 設定値 |
---|---|---|
IAM_ROLE_NAME | 「API Gateway」に設定するロール名 | g-test-role-s3-full-access |
S3_BUCKET_NAME | アクセス対象の「S3バケット名」 | g-test-bucket |
APIGATEWAY_RESTAPI_NAME | 「REST API」名 | g-test-restapi |
AWS_DEFAULT_REGION | 各種設定を行う「リージョン」名 | ap-northeast-1 |
IAMの作成
まずは 「API Gateway」 に割り当てるIAMロールを作成します。
「API Gateway」かS3にアクセスできるようにします。
加えて、「S3」へのフルアクセスを付与しておきます。 (実サービスに適用する際には注意してください!)
S3バケットの作成
アクセスする対象の「S3バケット」を作成します。
「REST API」の作成
いよいよ「REST API」を作成していきます。
「REST API リソース」の作成
次に、作成した「REST API」に 「リソース」 を割り当てます
「リソース」 とはURLのパスのことです。(僕はそのように解釈しました。)
URLのパスですので、階層構造があります。
予めルートリソース( = "/"
) は作成されています。
自分でリソースを作成する際には親となるリソースを指定しなければなりません。
はじめに記載していたとおり、今回作成したいパスは
- アクセス用URLは
https://<host>/<S3-BUCKET-NAME>/<S3-OBJECT-KEY>
の形式とする。
としていたので、ルートリソースの他に2つ登録が必要です。
「REST API リソース」に対するメソッドの作成
作成した「リソース」がどんな 「HTTPリクエストメソッド」 を受け付けられるかを設定していきます。
今回は読み取りのみを設定したいので、 GET
メソッドだけ作成します。
GET
メソッドの設定対象のリソース(パス)は /{s3_bucket_name}/{s3_object_key}
です。
メソッド作成時には --request-parameters
を設定しないとパスを分解したときのパラメータ値が正しく取得できないことに注意。僕はこれでまる一日近くハマりました。
( AWS-CLI上はエラーが出ないのですが、後々「統合リクエスト」設定でCUI/GUIいずれでも操作できなくなってしまいます。仕様? )
リソースに対してリクエスト、レスポンス設定を行う
もう一息。
「GET
メソッド」が実行されたときに、「API Gateway」がS3と通信する方法について設定を行います。
パスとして受け取った s3_bucket_name
/ s3_object_key
の値を S3 に対して引き渡すための設定も行っています。
テスト
テストデータの作成
対象のバケットに、 test.json
というテストファイルを作成しておいておきます。
REST API コール
APIのコールが正しく行えるかを「AWS マネージメントコンソール」からテストしてみます。
↓
「クエリ文字列」の部分の表示が気持ち悪い。何かミスっていそうな気がするが先に進む。
↓
正しく動作していることがわかりました。
AWS-CLIを使ってコールしてみる
「AWS マネージメントコンソール」を使わずに、「AWS-CLI」を使ってコールすることもできます。
HTTPレスポンスコードが 200 、 "body" にもJSONが正しく出力されています。
【2019-03-16 追記】
一連の処理をシェルスクリプト化して Github で公開しました。
ひとこと
一部表示が怪しい部分がありましたがなんとか設定できました。
次回やり残しは以下の通り。
- デプロイ
POST
メソッドの設定
ディスカッション
コメント一覧
まだ、コメントがありません