明日から本気だす

データベース好きなサポートエンジニアのメモです.

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 キータブでは、「API キーを使用量プランに追加」より、作成した API キーを紐付ける。

動作確認

最後に curl コマンドで確認する。

  • -Hx-api-key で作成した API キーを指定。
  • 同じく -HContent-Typetext/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

レスポンスコードが 403Forbidden が返ってくる場合は、IAM ロールの信頼関係の設定が誤っていないか確認。