2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

API Gateway 経由で Amazon S3 へ画像ファイルをアップロードする

2
Last updated at Posted at 2025-12-19

はじめに

フロントエンドから API 経由で Amazon S3 へアップロードを行う機能を実装するための行った内容をまとめておこうと思います。

IAM ロール

まずは API Gateway で利用する IAM ロールの作成を行います。

IAM ロールの作成

「IAM > ロール」 から [ロールを作成] をクリック。
01_IAM-Role_01.png

信頼されたエンティティを選択

「信頼されたエンティティタイプ」AWS のサービス を選択し、ユースケース では API Gateway を選び [次へ] をクリックします。
01_IAM-Role_02.png

許可を追加

そのままの内容で [次へ] をクリック。
01_IAM-Role_03.png

名前、確認、および作成

「ロール名」を入力 (ここでは api-gateway-upload-to-s3)し [ロールを作成] をクリック。
01_IAM-Role_04.jpg

IAM ポリシーの設定

「IAM > ロール」 から先ほど作成したロールを選択(ここでは api-gateway-upload-to-s3)
02_IAM-Policy_01.png

「許可 > 許可を追加」 から [インラインポリシーを作成] をクリック
02_IAM-Policy_02.png

アクセス許可を設定

S3 の PutObjectGetObject (Get 操作は行わないためなくてもOK)にチェックを入れ、「Effect」許可 にチェックを入れる。
02_IAM-Policy_03.png
02_IAM-Policy_04.png

リソース は [特定] を選択し object の ARN を追加 をクリック。
02_IAM-Policy_05.png

ARN を指定

Resource bucket nameYOUR_BUCKET_NAME の部分に今回アクセスさせたい S3 バケット名を入力し [ARN を追加] をクリック。
02_IAM-Policy_06.png

[次へ] をクリック。
02_IAM-Policy_07.png

確認して作成

「ポリシー名」 を入力 (ここでは api-gateway-upload-to-s3) し [ポリシーの作成] をクリック。
02_IAM-Policy_08.png

許可ポリシーに api-gateway-upload-to-s3 が付与されていることを確認。
02_IAM-Policy_09.png

API Gateway リソースの作成

「API Gateway > API」 から [API を作成] をクリック。
11_API-Create_01.png

API タイプを選択

「REST API」[構築] をクリック。
11_API-Create_02.png

REST API を作成

API の詳細新しい API を選択し、 API 名 を入力 (ここでは api-gateway-upload-to-s3) し [次へ] をクリック。
11_API-Create_03.png

リソースが作成されていることを確認。
11_API-Create_04.png

アップロード先パスを受け取るリソースの作成

これから、API の URL で指定したファイル名をそのままアップロード先として扱えるようにする設定を行います。

作成したリソースより [リソースを作成] をクリック。
12_API-Resource_01.png

「リソースの詳細」のリソースパス /リソース名 (今回は {proxy}) を入力し [リソースを作成] をクリック。
12_API-Resource_02.png
このリソース (ここでは {proxy})を使用することで、リクエスト URL のパスをパスパラメータとして受け取り、S3 連携時のオブジェクトキーへマッピングできるようにします。

PUT メソッドの作成

このステップでは、API Gateway で受け取った PUT リクエストを 直接 S3 の PutObject API に連携し、URL のパスをアップロード先(S3 オブジェクトキー)として利用できるように設定します。

「リソース」{proxy} を選択し、[メソッドを作成] をクリック。
12_API-Resource_03.png

メソッドの詳細 で以下を選択し [メソッドを作成] をクリック。

  • メソッドタイプ:PUT
  • 統合タイプ:AWS のサービス
    項目 設定
    AWS リージョン ap-norhteast-1
    AWS のサービス Simple Storage Service (S3)
    HTTP メソッド PUT
    アクションタイプ パスオーバーライドを使用
    ・パスオーバーライド:{bucket}/{key}
    ・実行ロール:作成したロール ARN
    ※その他はデフォルトでOK

12_API-Resource_04.jpg

作成した PUT メソッドから 統合リクエスト[編集] をクリック。
13_API-Put_01.png

URL パスパラメータ に以下を入力し [保存] をクリック。

名前 マッピング先
bucket 'YOUR_BUCKET_NAME'
※バケット名は '' で囲う
key method.request.path.proxy

13_API-Put_02.png
bucket は常に指定した S3 バケットへアップロードするため、固定値を設定し、key{proxy} リソースで受け取った URL のパス部分をそのまま S3 のオブジェクトキーとして利用。

パスオーバーライドと URL パスパラメータの対応関係

この設定では、S3 の PutObject API を呼び出す際の
リクエストパス {bucket}/{key} を API Gateway 側で明示的に指定しています。

その際、{bucket} と {key} は固定値やリクエスト情報からマッピングされ、
以下の対応関係で S3 へリクエストが送信されます。

パスオーバーライドとは

API Gateway の AWS サービス統合 では、
バックエンドサービス(今回は S3)に対して送信する リクエストパス を
パスオーバーライド で指定します。

S3 の PutObject API は、以下の形式でリクエストを受け取ります。

/{bucket}/{key}

そのため、本設定ではパスオーバーライドに

{bucket}/{key}

を指定しています。

Content-Type の設定

API Gateway から S3 へ直接ファイルをアップロードする場合、リクエストヘッダーの Content-Type は自動では S3 に引き継がれません。

そのため、この設定を行わないと、S3 に保存されるオブジェクトの
Content-Type が以下のようになります。

Content-Type
application/octet-stream

これは「不明なバイナリデータ」を意味するため、次のような問題が発生します。

  • ブラウザで画像を開いても ダウンロード扱い になる
  • CloudFront 経由で配信した際に 正しい MIME タイプとならない
  • 将来的に Web 表示・配信用途で不具合が出る

そのため、本手順では API Gateway の 統合リクエスト にてクライアントから送信された Content-Type ヘッダーを、そのまま S3 に転送する設定を行います。

これにより、以下のように S3 オブジェクトへ正しいメタデータが設定されます。

アップロードファイル S3 上の Content-Type
JPEG 画像 image/jpeg
PNG 画像 image/png
PDF application/pdf

「メソッドリクエスト」[編集] をクリック。
13_API-Put_03.png

「HTTP リクエストヘッダー」Content-Type を入力し [保存] をクリック。
13_API-Put_04.png

統合リクエスト[編集] をクリック。
13_API-Put_05.png

「URL リクエストヘッダーのパラメータ」 で以下を入力し [保存] をクリック。

名前 マッピング先
Content-Type method.request.header.Content-Type

13_API-Put_06.png

API Gateway デプロイ

[API をデプロイ] をクリック。
14_API-Deploy_01.png

Deploy API で ステージ新しいステージ を指定し、ステージ名v1 (任意) と入力し [デプロイ] をクリックします。
14_API-Deploy_02.png

画像アップロード

今回は curl コマンドを使ってアップロードを行います。

まずは ステージ よりアップロード先となる URL を確認します。
13_API-Put_07.png

確認ができたら以下のコマンドでアップロードを行います。

curl
% curl -X PUT \
  "https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v1/sample.jpg" \
  -H "Content-Type: image/jpeg" \
  --data-binary @sample.jpg

正常に実行が完了すると、S3 バケットにファイルがアップロードされています。
21_s3-upload.png

おわりに

今回で API Gateway を使ってファイルアップロードができるようになりました。
ただ、これは基本的な部分なので、CORS 対応やその他のメソッドの設定など色々と試していきたいと思います。


参考

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?