チュートリアル: API Gateway で REST API を Amazon S3 のプロキシとして作成する - Amazon API Gateway

チュートリアル: API Gateway で REST API を Amazon S3 のプロキシとして作成する

このセクションでは、API Gateway で REST API を Amazon S3 のプロキシとして使用する例として、Amazon S3 の以下のオペレーションを公開するために REST API を作成して設定する方法について説明します。

Amazon S3 のプロキシとして、「Amazon S3 のプロキシとしてのサンプル API の OpenAPI 定義」に示すように、サンプル API をインポートすることもできます。このサンプルには、より多くの公開メソッドが含まれています。OpenAPI 定義を使用して API をインポートする方法については、「OpenAPI を使用した REST API の設定」を参照してください。

注記

API Gateway の API を Amazon S3 と統合するには、API Gateway と Amazon S3 の両方のサービスが利用できるリージョンを選択する必要があります。利用できるリージョンについては、「Amazon API Gateway エンドポイントとクォータ」を参照してください。

API で Amazon S3 のアクションを呼び出すための IAM アクセス許可を設定する

Amazon S3 のアクションを呼び出すことを API に許可するには、IAM ロールに適切な IAM ポリシーをアタッチする必要があります。

AWS のサービスプロキシの実行ロールを作成するには
  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. [ロール] を選択します。

  3. [Create role] (ロールの作成) を選択します。

  4. [信頼されたエンティティの種類を選択][AWS のサービス] を選択し、[API Gateway][API Gateway が CloudWatch Logs にログをプッシュすることを許可] の順に選択します。

  5. [次へ] を選択し、さらに [次へ] を選択します。

  6. [ロール名] に「APIGatewayS3ProxyPolicy」と入力し、[ロールの作成] を選択します。

  7. [ロール] リストで、作成したロールを選択します。ロールを検索するには、必要に応じてスクロールするか、検索バーを使用します。

  8. 選択したロールの [アクセス許可を追加] タブを選択します。

  9. ドロップダウンリストから [ポリシーをアタッチ] を選択します。

  10. 検索バーに「AmazonS3FullAccess」と入力し、[アクセス許可を追加] を選択します。

    注記

    このチュートリアルでは、わかりやすくするために管理ポリシーを使用しますが、独自の IAM ポリシーを作成して、必要な最小限のアクセス許可を付与するのがベストプラクティスです。

  11. 新しく作成したロール ARN をメモしておきます。これは後で使用します。

Amazon S3 のリソースを表す API のリソースを作成する

API のルート (/) リソースを、認証された呼び出し元の Amazon S3 バケットのコンテナとして使用します。また、特定の Amazon S3 バケットと特定の Amazon S3 オブジェクトを表すために、Folder リソースと Item リソースをそれぞれ作成します。フォルダ名とオブジェクトキーは、発信者により、リクエスト URL の一部としてパスパラメータの形式で指定されます。

注記

オブジェクトキーに / やその他の特殊文字が含まれているオブジェクトにアクセスする場合は、文字を URL エンコードする必要があります。たとえば、test/test.txttest%2Ftest.txt にエンコードする必要があります。

Amazon S3 サービスの機能を公開する API のリソースを作成するには
  1. Amazon S3 バケットを作成したのと同じ AWS リージョンで、MyS3 という名前の API を作成します。この API のルートリソース (/) は Amazon S3 サービスを表します。このステップでは、/{folder}/{item} という 2 つの追加のリソースを作成します。

  2. API のルートリソースを選択し、[リソースを作成] を選択します。

  3. [プロキシのリソース] はオフのままにします。

  4. [リソースパス] で、[/] を選択します。

  5. [リソース名] に「{folder}」と入力します。

  6. [CORS (Cross Origin Resource Sharing)] はオフのままにします。

  7. [リソースの作成] を選択します。

  8. /{folder} リソースを選択し、[リソースを作成] を選択します。

  9. 前のステップを使用して、/{folder} の子リソースを {item} という名前で作成します。

    最終的な API は次のようになります。

    
                API Gateway での Amazon S3 のプロキシとしての API の作成

呼び出し元の Amazon S3 バケットを一覧表示する API のメソッドを公開する

呼び出し元の Amazon S3 バケットの一覧を取得するには、Amazon S3 に対して GET サービスアクションを呼び出す必要があります。API のルートリソース (/) で、GET メソッドを作成します。GET メソッドを設定して Amazon S3 と統合するには、以下の手順に従います。

API の GET / メソッドを作成し、初期化するには
  1. / リソースを選択し、[メソッドを作成] を選択します。

  2. メソッドタイプとして、[GET] を選択します。

  3. [統合タイプ] で、[AWS のサービス] を選択します。

  4. [AWS リージョン] で、Amazon S3 バケットを作成した AWS リージョンを選択します。

  5. [AWS のサービス] で、[Amazon Simple Storage Service] を選択します。

  6. [AWS サブドメイン] は空白のままにします。

  7. [HTTP メソッド] で、[GET] を選択します。

  8. [アクションタイプ] で、[パスオーバーライドを使用] を選択します。パスの上書きを使用すると、API Gateway はクライアントのリクエストを対応する Amazon S3 の REST API のパス形式のリクエストとして Amazon S3 に転送します。このリクエストでは、Amazon S3 のリソースは s3-host-name/bucket/key 形式のリソースパスで表されます。API Gateway は s3-host-name を設定し、クライアントが指定した bucketkey をクライアントから Amazon S3 に渡します。

  9. [パスオーバーライド]] に「/」と入力します。

  10. [実行ロール] に、APIGatewayS3ProxyPolicy のロール ARN を入力します。

  11. [メソッドの作成] を選択します。

この設定には、フロントエンドの GET https://your-api-host/stage/ リクエストとバックエンドの GET https://your-s3-host/ が含まれます。

注記

初回の設定後、メソッドの [統合リクエスト] ページでこれらの設定を変更できます。

Amazon の API のこのメソッドを誰が呼び出すことができるかを制御するため、メソッド認証フラグをオンにし、AWS_IAM に設定します。

IAM で GET / メソッドへのアクセスをコントロールできるようにするには
  1. [メソッドリクエスト] タブの [メソッドリクエスト設定] で、[編集] を選択します。

  2. [認可] で、ドロップダウンメニューから [AWS_IAM] を選択します。

    
                メソッドレスポンスタイプを宣言する
  3. [Save (保存)] を選択します。

Amazon の API が発信者に正常なレスポンスと例外を正しく返せるようにするには、[メソッドレスポンス] で 200、400、500 のレスポンスを宣言します。200 レスポンスのデフォルトのマッピングを使用し、ここで宣言されていないステータスコードのバックエンドレスポンスが発信者に 200 レスポンスとして返されるようにします。

GET / メソッドのレスポンスタイプを宣言するには
  1. [メソッドレスポンス] タブの [レスポンス 200] で、[編集] を選択します。

  2. [ヘッダーを追加] を選択し、次の操作を行います。

    1. [ヘッダー名] に「Content-Type」と入力します。

    2. [ヘッダーの追加] を選択します。

    次の手順を繰り返して、Timestamp ヘッダーと Content-Length ヘッダーを作成します。

  3. [Save (保存)] を選択します。

  4. [メソッドレスポンス] タブの [メソッドレスポンス] で、[レスポンスを作成] を選択します。

  5. [HTTP ステータスコード] に「400」と入力します。

    このレスポンスにはヘッダーを設定しません。

  6. [Save (保存)] を選択します。

  7. 次の手順を繰り返して 500 レスポンスを作成します。

    このレスポンスにはヘッダーを設定しません。

成功の統合レスポンスは Amazon S3 からバケットの一覧を XML ペイロードとして返し、API Gateway のデフォルトのメソッドレスポンスは JSON ペイロードを返すため、バックエンドの Content-Type ヘッダーパラメータ値をフロントエンドの Content-Type ヘッダーパラメータ値とマッピングする必要があります。そうしないと、クライアントは、レスポンスの本文が実際には XML 文字列である場合に application/json のコンテンツタイプを受け取ってしまいます。以下に、設定の手順を示します。さらに、クライアントに Date や Content-Length などの他のヘッダーパラメータも表示します。

GET / メソッドのレスポンスヘッダーのマッピングを設定する
  1. [統合レスポンス] タブの [デフォルト - レスポンス] で、[編集] を選択します。

  2. Content-Length ヘッダーに、マッピング値として「integration.response.header.Content-Length」と入力します。

  3. Content-Type ヘッダーに、マッピング値として「integration.response.header.Content-Type」と入力します。

  4. Timestamp ヘッダーに、マッピング値として「integration.response.header.Date」と入力します。

  5. [Save (保存)] を選択します。結果は次のようになります。

    
                統合レスポンスヘッダーをメソッドレスポンスヘッダーにマッピングする
  6. [統合レスポンス] タブの [統合レスポンス] で、[レスポンスを作成] を選択します。

  7. [HTTP status regex (HTTP ステータスの正規表現)]に「4\d{2}」と入力します。これにより、すべての 4xx HTTP レスポンスのステータスコードがメソッドレスポンスにマッピングされます。

  8. [メソッドレスポンスのステータスコード] で [400] を選択します。

  9. [Create] (作成) を選択します。

  10. 次の手順を繰り返して、500 メソッドレスポンスの統合レスポンスを作成します。[HTTP status regex (HTTP ステータスの正規表現)]に「5\d{2}」と入力します。

ここで、設定してきた API をテストしてみましょう。

GET / メソッドをテストするには
  1. [テスト] タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

  2. [テスト] を選択します。結果は次の図のようになります。

    
                API のルートに対する GET bucket のテスト結果

Amazon S3 バケットにアクセスする API のメソッドを公開する

Amazon S3 バケットを使用するには、/{folder} リソースの GET メソッドを公開して、バケット内のオブジェクトを一覧表示します。手順は、呼び出し元の Amazon S3 バケットを一覧表示する API のメソッドを公開する で説明されている手順と同様です。その他のメソッドについては、サンプル API をこちら (Amazon S3 のプロキシとしてのサンプル API の OpenAPI 定義) でインポートできます。

フォルダリソースで GET メソッドを公開するには
  1. /{folder} リソースを選択し、[メソッドを作成] を選択します。

  2. メソッドタイプとして、[GET] を選択します。

  3. [統合タイプ] で、[AWS のサービス] を選択します。

  4. [AWS リージョン] で、Amazon S3 バケットを作成した AWS リージョンを選択します。

  5. [AWS のサービス] で、[Amazon Simple Storage Service] を選択します。

  6. [AWS サブドメイン] は空白のままにします。

  7. [HTTP メソッド] で、[GET] を選択します。

  8. [アクションタイプ] で、[パスオーバーライドを使用] を選択します。

  9. [パスオーバーライド] に「{bucket}」と入力します。

  10. [実行ロール] に、APIGatewayS3ProxyPolicy のロール ARN を入力します。

  11. [メソッドの作成] を選択します。

Amazon S3 エンドポイントの URL で {folder} パスパラメータを設定します。メソッドリクエストの {folder} パスパラメータを統合リクエストの {bucket} パスパラメータにマッピングする必要があります。

{folder}{bucket} にマッピングするには
  1. [統合リクエスト] タブの [統合リクエストの設定][編集] を選択します。

  2. [URL パスパラメータ][パスパラメータを追加] を選択します。

  3. [名前] に bucket と入力します。

  4. [マッピング元] として「method.request.path.folder」と入力します。設定は次のようになります。

    
                  GET /{folder} メソッドを設定する
  5. [Save (保存)] を選択します。

次に API をテストします。

/{folder} GET メソッドをテストするには
  1. [テスト] タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

  2. [パス][folder] に、バケットの名前を入力します。

  3. [テスト] を選択します。

    テスト結果には、バケット内のオブジェクトのリストが含まれます。

    
                  Amazon S3 バケットを作成する GET メソッドをテストします。

バケット内の Amazon S3 オブジェクトにアクセスする API のメソッドを公開する

Amazon S3 では、GET、DELETE、HEAD、OPTIONS、POST、PUT の各アクションで特定のバケット内のオブジェクトにアクセスし、管理することができます。このチュートリアルでは、{folder}/{item} リソースでバケットから画像を取得する GET メソッドを公開します。{folder}/{item} リソースのその他の用途については、サンプル API (Amazon S3 のプロキシとしてのサンプル API の OpenAPI 定義) を参照してください。

項目リソースで GET メソッドを公開するには
  1. /{item} リソースを選択し、[メソッドを作成] を選択します。

  2. メソッドタイプとして、[GET] を選択します。

  3. [統合タイプ] で、[AWS のサービス] を選択します。

  4. [AWS リージョン] で、Amazon S3 バケットを作成した AWS リージョンを選択します。

  5. [AWS のサービス] で、[Amazon Simple Storage Service] を選択します。

  6. [AWS サブドメイン] は空白のままにします。

  7. [HTTP メソッド] で、[GET] を選択します。

  8. [アクションタイプ] で、[パスオーバーライドを使用] を選択します。

  9. [パスオーバーライド] に、「{bucket}/{object}」と入力します。

  10. [実行ロール] に、APIGatewayS3ProxyPolicy のロール ARN を入力します。

  11. [メソッドの作成] を選択します。

Amazon S3 エンドポイント URL で {folder} パスパラメータと {item} パスパラメータを設定します。メソッドリクエストの パスパラメータを統合リクエストの パスパラメータにマッピングする必要があります。

このステップでは、次の作業を行います。

  • メソッドリクエストの {folder} パスパラメータを統合リクエストの {bucket} パスパラメータにマッピングします。

  • メソッドリクエストの {item} パスパラメータを統合リクエストの {object} パスパラメータにマッピングします。

{folder}{bucket} に、{item}{object} にマッピングするには
  1. [統合リクエスト] タブの [統合リクエストの設定] で、[編集] を選択します。

  2. [URL パスパラメータ] を選択します。

  3. [パスパラメータを追加] を選択します。

  4. [名前] に bucket と入力します。

  5. [マッピング元] として「method.request.path.folder」と入力します。

  6. [パスパラメータを追加] を選択します。

  7. [名前] に object と入力します。

  8. [マッピング元] として「method.request.path.item」と入力します。

  9. [Save (保存)] を選択します。

/{folder}/{object} GET メソッドをテストするには
  1. [テスト] タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

  2. [パス][folder] に、バケットの名前を入力します。

  3. [パス][item] に、項目の名前を入力します。

  4. [テスト] を選択します。

    レスポンス本文に項目の内容が含まれます。

    
            Amazon S3 バケットを作成する GET メソッドをテストします。

    リクエストは、指定した Amazon S3 バケット (DOC-EXAMPLE-BUCKET) の指定したファイル (test.txt) のコンテンツとして、プレーンテキストの (「Hello world」) を正しく返します。

API Gateway で UTF-8 でエンコードされた JSON 以外のコンテンツとみなされるバイナリファイルをダウンロードまたはアップロードするには、API に追加の設定が必要です。次のように説明されています。

S3 からバイナリファイルをダウンロードまたは S3 にアップロードするには
  1. 影響を受けるファイルのメディアの種類を API の binaryMediaTypes に登録します。これは、コンソールで登録できます。

    1. API の [API 設定] を選択します。

    2. [バイナリメディアタイプ] で、[メディアタイプを管理] を選択します。

    3. [バイナリメディアタイプを追加] を選択し、必要なメディアタイプ (例: image/png) を入力します。

    4. [Save changes] (変更の保存) を選択して設定を保存します。

  2. Content-Type ヘッダー (アップロードの場合) と Accept ヘッダー (ダウンロードの場合) をメソッドリクエストに追加し、必要なバイナリメディアタイプを指定するようにクライアントに要求して、統合リクエストにマッピングします。

  3. 登録リクエスト (アップロードの場合) および 統合レスポンス (ダウンロードの場合) で、[コンテンツの処理] を [Passthrough] に設定します。影響のあるコンテンツタイプで定義されているマッピングテンプレートがないことを確認します。詳細については、「統合パススルーの動作」と「VTL マッピングテンプレートを選択する」を参照してください。

ペイロードサイズの上限は 10 MB です。「REST API の設定および実行に関する API Gateway クォータ」を参照してください。

Amazon S3 のファイルのメタデータに正しいコンテンツタイプが追加されていることを確認してください。ストリーミング可能なメディアコンテンツの場合も、Content-Disposition:inline をメタデータに追加する必要がある場合があります。

API Gateway でのバイナリのサポートの詳細については、「API Gateway でのコンテンツタイプの変換」を参照してください。