メニュー
Amazon API Gateway
開発者ガイド

Amazon S3 プロキシとして API を作成する

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

注記

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

Amazon S3 プロキシとしてのサンプル API の Swagger 定義」に示しているように、Amazon S3 プロキシとしてサンプル API をインポートすることもできます。Swagger 定義を使って API をインポートする方法については、API をインポートする を参照してください。

API Gateway コンソールを使用して API を作成するには、まず AWS アカウントにサインアップする必要があります。

AWS アカウントをお持ちでない場合は、次に説明する手順に従ってアカウントを作成してください。

AWS にサインアップするには

  1. https://aws.amazon.com/ を開き、[AWS アカウントの作成] を選択します。

  2. オンラインの手順に従います。

API に対して Amazon S3 アクションを呼び出す IAM 許可をセットアップする

API が必要な Amazon S3 アクションを呼び出せるようにするには、IAM ロールに適切な IAM ポリシーをアタッチする必要があります。次のセクションでは、必要に応じて IAM のロールとポリシーを確認および作成する方法について説明します。

API が Amazon S3 やバケット、オブジェクトを表示またはリストできるようにするには、IAM によって提供された AmazonS3ReadOnlyAccess ポリシーを IAM ロールで使用します。このポリシーの ARN は、以下に示すように arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess です。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "*" } ] }

このポリシードキュメントでは、Amazon S3 Get* および List* のいずれのアクションも Amazon S3 リソースのいずれに対しても呼び出せることが定義されています。

API が Amazon S3 やバケット、オブジェクトを更新できるようにするには、次のように、いずれかの Amazon S3 Put* アクションに対してカスタムポリシーを使用します。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:Put*", "Resource": "*" } ] }

API が Amazon S3 Get*List* アクション、Put* アクションと連携できるようにするには、ロ上記の読み取り専用と Put 専用のポリシーを IAM ロールに追加します。

API が Amazon S3 Post* アクションを呼び出せるようにするには、まs3:Post* アクション用の許可ポリシーを IAM ロールで使用しなければなりません。Amazon S3 アクションの完全なリストについては、「ポリシーでの Amazon S3 アクセス権限の指定」を参照してください。

API が Amazon S3 内のバケットとオブジェクトを作成、表示、更新、削除できるようにするには、IAM によって提供された AmazonS3FullAccess ポリシーを IAM ロールで使用します。ARN は、arn:aws:iam::aws:policy/AmazonS3FullAccess です。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "*" } ] }

使用したい IAM ポリシーを選択したら、IAM ロールを作成し、ポリシーにアタッチします。こうしてできた IAM したロールには、実行時に API Gateway がこのロールを引き受けるよう、次のような信頼ポリシーが含まれていなければなりません。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

IAM コンソールを使用してロールを作成するときは、[Amazon API Gateway] ロールタイプを選択して、この信頼ポリシーが自動的に含まれるようにできます。

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

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

Amazon S3 サービスの機能を公開する API のリソースを作成するには

  1. API Gateway コンソールで、「MyS3」という名前の API を作成します。この API のルートリソース (/) は Amazon S3 サービスを表します。

  2. API のルートリソースの下に、Folder という名前の子リソースを作成し、必要な [Resource Path] を [/{folder}] に設定します。

  3. API の Folder リソースに対し、Item という子リソースを作成します。必要な [Resource Path] を [/{item}] に設定します。

     Amazon S3 プロキシとして API Gateway で API を作成する

発信者の Amazon S3 バケットをリストするための API メソッドを公開する

発信者の Amazon S3 バケットのリストを取得する際、Amazon S3 上の GET Service アクションが呼び出されます。API のルートリソース (/) で、GET メソッドを作成します。GET メソッドを、Amazon S3と統合するよう、次のように設定します。

API の GET / メソッドを作成し、初期化するには

  1. ルートノード (/) 上で、[Resources] パネルの右上隅にある [Actions] ドロップダウンメニューから [Create method] を選択します。

  2. HTTP 動詞のドロップダウンリストから GET を選択し、メソッドの作成を開始するチェックマークアイコンを選択します。

     Amazon S3 との統合用にメソッドを作成する
  3. [/ - GET - Setup] ペインで、[Integration type] として [AWS Service Proxy] を選択します。

  4. リストから、[AWS Region] を選択します。

  5. [AWS Service] から、[S3] を選択します。

  6. [HTTP method] から、[GET] を選択します。

  7. [Action Type] で、[Use path override] を選択します。

  8. (オプション) [Path override] に「/」と入力します。

  9. IAM コンソールから先ほど作成した IAM ロールの ARN をコピーし、[Execution role] に貼り付けます。

  10. [Save] を選択して、このメソッドの設定を完了します。

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

注記

初回の設定後、メソッドの [Integration Request] ページでこれらの設定を変更できます。

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

IAM が GET / メソッドへのアクセスを制御できるようにするには

  1. [Method Execution] で [Method Request] を選択します。

  2. [Authorization] の横の鉛筆アイコンを選択します。

  3. ドロップダウンリストから [AWS_IAM] を選択します。

  4. チェックマークアイコンを選択して、設定を保存します。

     メソッドレスポンスタイプを宣言する

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

GET / メソッドのレスポンスタイプを宣言するには

  1. [Method Execution] ペインで、[Method Response] のボックスを選択します。API Gateway は、デフォルトで 200 のレスポンスを宣言します。

  2. [Add response] を選択し、入力テキストボックスに 400 と入力したら、宣言を終了するチェックマークを選択します。

  3. 上記の手順を繰り返し、500 のレスポンスタイプを宣言します。最終的な設定は、次のようになります。

     メソッドレスポンスタイプを宣言する

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

GET / メソッドのレスポンスヘッダーのマッピングを設定する

  1. API Gateway コンソールで、[Method Response] を選択します。200 レスポンスタイプに [Content-Type] ヘッダーを追加します。

     メソッドレスポンスヘッダーを宣言する
  2. [Integration Response] で、メソッドレスポンスの [Content-Type] に「integration.response.header.Content-Type」と入力します。

     統合レスポンスヘッダーをメソッドレスポンスヘッダーにマッピングする

    上記のヘッダーマッピングにより、API Gateway は、バックエンドからの Date ヘッダーをクライアントのために Timestamp ヘッダーに変換します。

  3. [Integration Response] で、[Add integration response] を選択し、残りのメソッドレスポンスステータスの [HTTP status regex] テキストボックスに適切な正規表現を入力します。すべてのメソッドレスポンスステータスで手順を繰り返します。

     統合レスポンスステータスコードを設定する

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

API のルートリソースに対する GET メソッドをテストする

  1. [Method Execution] に戻り、[Client] ボックスで [Test] を選択します。

  2. [GET / - Method Test] ペインの [Test] を選択します。結果は次のようになります。

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

注記

API Gateway コンソールを使用して Amazon S3 プロキシとして API をテストするには、対象の S3 バケットが、API のリージョンとは異なるリージョンからのものであることを確認します。それ以外の場合、500 Internal Server Error レスポンスが返される可能性があります。この制限は、デプロイされた API には適用されません。

API メソッドを公開して Amazon S3 にアクセスする

Amazon S3 バケットを処理するには、GET、PUT、DELETE の各メソッドを /{folder} リソース上で公開し、バケット内のオブジェクトをリストし、新しいバケットを作成し、既存のバケットを削除します。手順は、「発信者の Amazon S3 バケットをリストするための API メソッドを公開する」で説明されている手順と同様です。以下で、一般的なタスクの概要を説明し、重要な相違点に焦点を当てます。

GET、PUT、DELETE の各メソッドをフォルダリソース上で公開するには

  1. [Resources] ツリーの [/{folder}] ノードで、DELETE、GET、PUT の各メソッドを 1 つずつ作成します。

  2. 作成したメソッドとそれぞれ対応する Amazon S3 エンドポイントとの初期統合を設定します。次のスクリーンショットは、PUT /{folder} メソッドの設定です。DELETE /{folder}GET /{folder} の各メソッドについては、[HTTP method] の PUT の値をそれぞれ DELETEGET に置き換えます。

     PUT /{folder} メソッドを設定する

    Amazon S3 エンドポイントの URL でバケットを指定するために {bucket} パスパラメーターを使用したことを思い出してください。メソッドリクエストの {folder} パスパラメーターを統合リクエストの {bucket} パスパラメーターにマッピングする必要があります。

  3. {folder}{bucket} にマッピングするには

    1. [Method Execution]、[Integration Request] の順に選択します。

    2. [URL Path Parameters] を展開し、[Add path] を選択します。

    3. [Name] 列に bucket と入力し、Mapped from 列に method.request.path.folder と入力します。チェックマークアイコンを選択して、マッピングを保存します。

       PUT /{folder} メソッドを設定する
  4. [Method Request] で、Content-Type を [HTTP Request Headers] セクションに追加します。

     PUT /{folder} メソッドを設定する

    これは、API Gateway コンソールを使用していて、XML ペイロードに application/xml を指定しなければならない場合、テストの際に必要になります。

  5. [Integration Request] で、「発信者の Amazon S3 バケットをリストするための API メソッドを公開する」の手順に従って以下のヘッダーマッピングを設定します。

     PUT /{folder} メソッドのヘッダーマッピングを設定する

    x-amz-acl ヘッダーは、フォルダ (または対応する Amazon S3 バケット) に対するアクセス制御を指定するのに使用します。詳細については、「Amazon S3 PUT Bucket Request」を参照してください。Expect:'100-continue' ヘッダーを使うと、リクエストパラメーターが検証される場合のみリクエストペイロードが送信されるようになります。

  6. PUT メソッドをテストするには、[Method Execution] の [Client] ボックスで [Test] を選択します。

    1. [folder] にバケット名を入力します。

    2. [Content-Type] ヘッダーには、application/xml と入力します。

    3. [Request Body] で、ロケーションの制約としてバケットリージョンを指定します。このリージョンは、リクエストのペイロードとして XML フラグメントで宣言されています。たとえば、

      Copy
      <CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <LocationConstraint>{region}</LocationConstraint> </CreateBucketConfiguration>
       Amazon S3 バケットを作成する PUT メソッドをテストします。
  7. API の /{folder} リソースに対する GET および DELETE メソッドを作成して設定する前述の手順を繰り返します。

上の例は、指定のリージョンで新しいバケットを作成し、バケット内のオブジェクトのリストを表示し、バケットを削除する方法を示しています。他の Amazon S3 オペレーションでは、バケットのメタデータまたはプロパティを処理できます。たとえば、API が Amazon S3 の PUT /?notification アクションを呼び出してバケット上に通知を設定するようにしたり、PUT /?acl を呼び出してバケット上にアクセス制御リストを設定するようにセットアップできます。API の設定は同様ですが、Amazon S3 エンドポイントの URL に適切なクエリパラメーターを追加しなければならない点が異なります。実行時に、メソッドリクエストに適切な XML ペイロードを指定する必要があります。Amazon S3 バケットにおける GET と DELETE の各オペレーションのサポートについても同じことが言えます。バケット上で可能な &S3; アクションの詳細については、「Amazon S3 Operations on Buckets」を参照してください。

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

Amazon S3 では、GET、DELETE、HEAD、OPTIONS、POST、PUT の各アクションで特定のバケット内のオブジェクトにアクセスし、管理することができます。サポートされているアクションの一覧については、「Amazon S3 Operations on Objects」を参照してください。

このチュートリアルでは、PUT Object オペレーション、GET Object オペレーション、HEAD Object オペレーション、DELETE Object オペレーションをそれぞれ PUT /{folder}/{item}GET /{folder}/{item}HEAD /{folder}/{item}DELETE /{folder}/{item} の API メソッドを通じて公開します。

/{folder}/{item} 上の PUT、GET、DELETE の各メソッドの API セットアップは、/{folder} 上のそれと同様です。これについては、API メソッドを公開して Amazon S3 にアクセスする に記述があります。1 つの大きな違いは、{object} の追加のパスパラメータがメソッドリクエストの URL に追加され、このパスパラメータがバックエンドの {item} の Amazon S3 エンドポイント URL パスパラメータにマッピングされることです。

GET メソッドと DELETE メソッドにも同じことが当てはまります。

次のスクリーンショットは、API Gateway コンソールを使用し、{folder}/{item} リソース上で GET メソッドをテストしたときの出力を示します。リクエストは、指定の Amazon S3 バケット (apig-demo) 内の指定のファイル (README.txt) のコンテンツを正常に ("Welcome to README.txt") というプレーンテキストとして返しています。

 API の Folder/Item に対する GET Bucket の結果をテストする

REST API クライアントを使用して API を呼び出す

エンドツーエンドのチュートリアルとして、ここで、Postman を使って API を呼び出す方法を紹介しましょう。Postman は、AWS IAM 認証をサポートします。

Postman を使って Amazon の Amazon S3 プロキシ API を呼び出すには

  1. API をデプロイまたは再デプロイします。[Stage Editor] の最上部にある [Invoke URL] の横に表示された API のベース URL を書き留めます。

  2. Postman を起動します。

  3. [Authorization] を選択し、次に AWS Signature を選択します。[AccessKey] と [SecretKey] の各入力フィールドにそれぞれ IAM ユーザーアクセスキー ID とシークレットアクセスキーを入力します。[AWS Region] テキストボックスにお客様の API がデプロイされている AWS リージョンを入力します。[Service Name] 入力フィールドに execute-api と入力します。

    IAM マネジメントコンソールで、お使いの IAM ユーザーアカウントの [Security Credentials] タブからキーのペアを作成することができます。

  4. {region} リージョン内の Amazon S3 アカウントに apig-demo-5 という名前のバケットを追加するには

    注記

    バケット名がグローバルに一意であることを確認します。

    1. ドロップダウンリストから [PUT] を選択し、メソッド URL (https://api-id.execute-api.aws-region.amazonaws.com/stage/folder-name) を入力します。

    2. Content-Type ヘッダーの値を application/xml に設定します。コンテンツタイプを設定する前に、既存のヘッダーを削除しなければならない場合があります。

    3. [Body] メニュー項目を選択し、リクエストの本文として次の XML フラグメントを入力します。

      Copy
      <CreateBucketConfiguration> <LocationConstraint>{region}</LocationConstraint> </CreateBucketConfiguration>
    4. [Send] を選択してリクエストを送信します。成功したときは、空のペイロードを持つ 200 OK のレスポンスを受け取ります。

  5. バケットにテキストファイルを追加するには、上記の手順に従います。{folder} に対して apig-demo-5 というバケット名を指定し、URL の中の {item}Readme.txt というファイル名を指定し、Hello, World! というテキスト文字列を入力すると、リクエストは次のようになります:

    Copy
    PUT /S3/apig-demo-5/Readme.txt HTTP/1.1 Host: 9gn28ca086.execute-api.{region}.amazonaws.com Content-Type: application/xml X-Amz-Date: 20161015T062647Z Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-api/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date, Signature=ccadb877bdb0d395ca38cc47e18a0d76bb5eaf17007d11e40bf6fb63d28c705b Cache-Control: no-cache Postman-Token: 6135d315-9cc4-8af8-1757-90871d00847e Hello, World!

    すべてが正常に機能したときは、空のペイロードを持つ 200 OK レスポンスを受け取ります。

  6. 先ほど apig-demo-5 バケットに追加した Readme.txt ファイルのコンテンツを取得するには、次のような GET リクエストを実行します。

    Copy
    GET /S3/apig-demo-5/Readme.txt HTTP/1.1 Host: 9gn28ca086.execute-api.{region}.amazonaws.com Content-Type: application/xml X-Amz-Date: 20161015T063759Z Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ba09b72b585acf0e578e6ad02555c00e24b420b59025bc7bb8d3f7aed1471339 Cache-Control: no-cache Postman-Token: d60fcb59-d335-52f7-0025-5bd96928098a

    成功したときは、Hello, World! というテキスト文字列のペイロードを持つ 200 OK レスポンスを受け取ります。

  7. apig-demo-5 バケット内の項目をリストするには、次のリクエストを送信します。

    Copy
    GET /S3/apig-demo-5 HTTP/1.1 Host: 9gn28ca086.execute-api.{region}.amazonaws.com Content-Type: application/xml X-Amz-Date: 20161015T064324Z Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=4ac9bd4574a14e01568134fd16814534d9951649d3a22b3b0db9f1f5cd4dd0ac Cache-Control: no-cache Postman-Token: 9c43020a-966f-61e1-81af-4c49ad8d1392

    成功したときは、このリクエストを送信する前にバケットにファイルを追加した場合を除き、指定のバケット内に項目が 1 つだけ表示されている XML ペイロードを持った 200 OK レスポンスを受け取ります。

    Copy
    <?xml version="1.0" encoding="UTF-8"?> <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>apig-demo-5</Name> <Prefix></Prefix> <Marker></Marker> <MaxKeys>1000</MaxKeys> <IsTruncated>false</IsTruncated> <Contents> <Key>Readme.txt</Key> <LastModified>2016-10-15T06:26:48.000Z</LastModified> <ETag>"65a8e27d8879283831b664bd8b7f0ad4"</ETag> <Size>13</Size> <Owner> <ID>06e4b09e9d...603addd12ee</ID> <DisplayName>user-name</DisplayName> </Owner> <StorageClass>STANDARD</StorageClass> </Contents> </ListBucketResult>

注記

画像をアップロードまたはダウンロードするには、処理したコンテンツを [バイナリに変換] に設定する必要があります。