API Gateway 経由で Amazon S3 に画像ファイルをアップロードするにはどうすればよいですか?
最終更新日: 2021 年 12 月 9 日
Amazon API Gateway 経由で Amazon Simple Storage Service (Amazon S3) に画像ファイルをアップロードしたいと考えています。どうすればよいですか?
簡単な説明
API Gateway を使用して S3 バケットにバイナリファイル(画像)をアップロードするには、API Gateway REST API のバイナリサポートを有効にする必要があります。
API が S3 バケットにアクセスできるようにするには、AWS Identity and Access Management (IAM) ロールを作成する必要もあります。IAM ロールには、API Gateway が S3 バケットで PutObject アクションを実行するためのアクセス許可が含まれている必要があります。
解決方法
API Gateway の IAM ロールを作成する
- [IAM コンソール] を開きます。
- ナビゲーションペインで、[ロール] を選択します。
- [ロールの作成] を選択します。
- [Select type of trusted entity] セクションで、[AWS service] を選択します。
- [Choose a use case] で、[API Gateway] を選択します。
- [Select your use case] セクションで、[API Gateway] を選択します。
- [Next: Permissions] を選択します。
注: このセクションでは、API Gateway がユーザーのアカウントにログをプッシュすることを許可する AWS managed service を表示します。S3 のアクセス許可は後で追加します。[ Next: Tags ] を選択します。 - (オプション) タグを追加し、続いて [Next: Review] を選択します。
- [Role name] に、ポリシーの名前を入力します。例: api-gateway-S3 へアップロード
- [ロールの作成] を選択します。
IAM ポリシーを作成して API Gateway ロールにアタッチする
- [IAM コンソール] を開きます。
- ナビゲーションペインで、[ロール] を選択します。
- 検索ボックスに、作成した新しい API Gateway ロールの名前を入力します。次に、[Role name] 列からそのロールを選択します 。
- [Permissions ] タブで、[Attach policcies] を選択します。
- [Create policy] を選択します。
- [Visual editor ] タブの [ Select a service ] ( サービスの選択 ) セクションで、[ Choose a service ] ( サービスの選択 ) を選択します 。
- [S3 ]と入力し、[ S3 ] を選択します。
- [ S3 で許可されるアクションを指定する ] ボックスに「 PutObject 」と入力し、[ PutObject ] を選択します。
- [ Resources ] を展開し、[Specific] を選択します。
- [Add ARN] を選択します。
- [ Bucket name ] に、バケットの名前を入力します。該当する場合、PreFix を含めてください。
- [ Object name ] に、オブジェクト名を入力します。
注: バケット名は、アップロードされたファイルの場所を指定します。オブジェクト名は、オブジェクト (つまり、ファイル名) がポリシー調整のために遵守しなければならないパターンを指定します。 - [Add] を選択します。
- [Next: Tags] を選択し、(オプション) タグを追加し、続いて [Next: Review] を選択します。
- [ 名前 ] に、ポリシーの名前を入力します。
- [Create policy] を選択します。
- ポリシー検索ボックスで、前に作成したポリシーの名前を入力し、そのポリシーを選択します。
- [ポリシーアクション] を選択して、 [アタッチ] を選択します。IAM ロールのリストが表示されます。
- 前に作成した API Gateway ロールを検索し、そのロールを選択します。
- [ポリシーのアタッチ] を選択します。
API Gateway REST API を作成する
リクエストを処理する API を作成する
- API Gateway コンソールにログインします。
- ナビゲーションペインで、[APIs] を選択します。
- [Create API] を選択します。
- [ Choose an API type ] セクションで、[Build for REST API] を選択します。
- [API Name] に API の名前を入力し、[Next] を選択します。
- [Create API] を選択します。
API のリソースを作成する
- API ページの [Resources] パネルで、[/] を選択します。
- [Actions] で、[Create Resource] を選択します。
- [Resource Name] に、[floder] を入力します。
- [Resource Path] に、{folder} を入力します。
- [リソースの作成] を選択します。
- Resourcesパネルで、先ほど作成した /{folder} リソースを選択します。
- [Actions] を選択してから、[Create Resource]を選択します。
- [Resource Name] に、[object] を入力します。
- [Resource Path] に、{object} を入力します。
- [リソースの作成] を選択します。
API の PUT メソッドを作成する
- API ページの [ Resources ] パネルで、[/{object}] を選択します。
- [Actions]を選択してから、[Create Method] を選択します。
- ドロップダウンメニューから [PUT] を選択し、チェックマークアイコンを選択します。
- コンソールの制限により、オプションが 3 つしか表示されない場合があります。この制限を回避するには、利用可能な統合タイプを一時的に設定し、後でAWS のサービスへの統合リクエストのエンドポイントを編集します。例えば、[Integration type] で [HTTP Proxy] を選択します。次に、[Endpoint URL] に https://postman-echo.com/get と入力します (「パラメータがありません:{proxy}」という警告は無視してください)。[Save] をクリックして変更を保存します。
- 次に、[Integration Request] を選択し、[Integration type] カテゴリで [AWS Service] を選択します。
- [AWS Region] では、[us-west-2] を選択します。
- [AWS Service] は 、[Simple Storage Service (S3)] を選択します。
- [AWS Subdomain] は空欄のままにします。
- [HTTP method] は、[PUT] を選択します。
- [ Action Type ] は、[ Use path override] を選択します。
- [ Path override (optional) ] は、 {bucket}/{key} と入力します。
- [ Execution role ] には、前に作成した IAM ロールの Amazon リソースネーム (ARN) を入力します。
- [ Content Handling ] は、[ Passthrough ] を選択します。
- [Save] を選択します。
PUT メソッドのパラメータマッピングを設定する
- API ページの [Resources] パネルで、[PUT] を選択します。
- [Integration Request] を選択します。
- [ URL Path Parameters ] を展開します。
- [ Add path] を選択します。
- [Name] に[buket] を入力します。
- [Mapped from] に method.request.path.folder を入力します。
- 行の最後にあるチェックマークアイコンを選択します。
- 手順 4 ~ 7 を繰り返します。手順 5 、[ Name ] を [key ] に設定します。手順 6 、 Mapped from method.request.path.objectを設定します。
API のバイナリメディアタイプを設定する
- API ページのナビゲーションペインで、[ Settings ] を選択します。
- [ Binary Media Types ] セクションで、[ Add Binary Media Type] を選択します。
- テキストボックスに、次の文字列を追加します: */*
注: 文字列を引用符で囲まないようにしてください。バイナリメディアタイプとして扱いたい特定の MIME タイプをワイルドカードで代用することができます。たとえば、「image/jpeg」 を選択すると、API Gateway で JPEG 画像がバイナリメディアタイプとして扱われます。*/* を追加すると、API Gateway はすべてのメディアタイプをバイナリメディアタイプとして扱います。 - [Save changes] を選択します。
API をデプロイする
- API ページのナビゲーションペインで、[ Resources ] を選択します。
- [Resources] ペインで、[Actions]、[Deploy API] の順にクリックします。
- [Deploy API] ウィンドウの [Deployment stage] で、[New Stage] を選択します。
- [Stage name] に、v1 と入力します。
- [Deploy] を選択します。
- ナビゲーションペインで、[Stages] を選択します。
- v1 ステージを選択します。これで、デプロイされた API スナップショットへのリクエストを実行するための呼び出し URL が表示されます。
- [Invoke URL] をコピーしておきます。
注: 詳細については、「Amazon API Gateway での REST API のデプロイ」を参照してください。
API を呼び出してイメージファイルを S3 にアップロードする
API の呼び出し URL に、オブジェクトのバケット名とファイル名を追加します。次に、任意のクライアントを使用して PUT HTTP リクエストを作成します。例えば、Postman アプリケーションです。
詳細については、「Amazon API Gateway での REST API の呼び出し」を参照してください。
PUT メソッドの HTTP リクエストの例
注: この例では、abc が API ID、mybucket が S3 バケット、myobject.jpeg がアップロードするローカルファイルであると仮定します。この例では、mybucket は {folder} に置き換えられて {bucket} にマッピングされ、myobject.jpeg は {object} に置き換えられ、{key} にマッピングされます。
https://abc.execute-api.ap-southeast-1.amazonaws.com/v1/mybucket/myobject.jpeg
重要: バイナリリストに */* が含まれている場合は、ファイルをアップロードするために PUT リクエストを行うことができます。バイナリリストに image.jpeg が含まれている場合は、Content-Type header をPUT リクエストに追加する必要があります。Content-Type headerを image/jpeg に設定する必要があります。