

# API Gateway で REST API を開発する
<a name="rest-api-develop"></a>

 Amazon API Gateway では、REST API を、API Gateway [リソース](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html)と呼ばれるプログラム可能なエンティティのコレクションとして構築します。たとえば、[RestApi](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html) リソースを使用して[リソース](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html)エンティティのコレクションを含むことができる API を表します。

各 `Resource` エンティティは、[メソッド](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html)リソースを 1 つ以上持つことができます。`Method` は、クライアントが送信する受信リクエストであり、パスパラメータ、ヘッダー、またはクエリ文字列パラメータなどのリクエストパラメータを含めることができます。さらに、HTTP メソッドによっては、リクエストに本文を含めることができます。メソッドは、クライアントが公開された `Resource` にアクセスする方法を定義します。`Method` をバックエンドエンドポイント (統合エンドポイントとも呼ばれます) と統合するには、[統合](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html)リソースを作成します。これにより、受信リクエストが指定先の統合エンドポイント URI に転送されます。必要に応じて、バックエンド要件を満たすようにリクエストパラメータまたはリクエスト本文を変換したり、プロキシ統合を作成したりできます。プロキシ統合では、API Gateway がリクエスト全体を標準化された形式で統合エンドポイント URI に送信して、レスポンスをクライアントに直接送信します。

レスポンスでは、[MethodResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html) を作成してクライアントが受信するレスポンスを表し、[IntegrationResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html) リソースを作成してバックエンドから返されるレスポンスを表すことができます。統合レスポンスを使用して、データがクライアントに返される前にバックエンドレスポンスデータを変換するか、バックエンドレスポンスをそのままクライアントにパスすることができます。

## REST API のリソース例
<a name="rest-api-develop-example"></a>

次の図は、API Gateway が HTTP プロキシと `GET /pets` リソースの HTTP 非プロキシ統合に対してこのリクエスト/レスポンスモデルを実装する方法を説明しています。クライアントは API Gateway に `x-version:beta` ヘッダーを送信し、API Gateway はクライアントに `204` ステータスコードを送信します。

非プロキシ統合では、API Gateway は、統合リクエストと統合レスポンスを変更することで、バックエンド要件を満たすデータ変換を実行します。非プロキシ統合では、メソッドリクエストで本文にアクセスできます。ただしこれは統合リクエストで変換できます。統合エンドポイントが本文を含むレスポンスを返すと、統合レスポンスでアクセスして変換します。メソッドレスポンスで本文を変更することはできません。

プロキシ統合では、統合エンドポイントがリクエストとレスポンスを変更します。API Gateway は、統合リクエストや統合レスポンスを変更することはなく、受信リクエストをそのままバックエンドに送信します。

統合タイプを問わず、クライアントは API Gateway にリクエストを送信し、API Gateway は同期的に応答しました。

------
#### [ Non-proxy integration ]

![\[API Gateway の非プロキシ統合の図\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/develop-non-proxy.png)


------
#### [ Proxy integration ]

![\[API Gateway のプロキシ統合の図\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/develop-proxy.png)


------

次の実行ログの例は、前の例で API Gateway がログに記録する内容を説明しています。分かりやすいように、値と初期ログをいくつか省いてあります。

------
#### [ Non-proxy integration ]

```
Wed Feb 12 23:56:44 UTC 2025 : Starting execution for request: abcd-1234-5678
Wed Feb 12 23:56:44 UTC 2025 : HTTP Method: GET, Resource Path: /pets
Wed Feb 12 23:56:44 UTC 2025 : Method request path: {}
Wed Feb 12 23:56:44 UTC 2025 : Method request query string: {}
Wed Feb 12 23:56:44 UTC 2025 : Method request headers: {x-version=beta}
Wed Feb 12 23:56:44 UTC 2025 : Method request body before transformations: 
Wed Feb 12 23:56:44 UTC 2025 : Endpoint request URI: http://petstore-demo-endpoint.execute-api.com/petstore/pets
Wed Feb 12 23:56:44 UTC 2025 : Endpoint request headers: {app-version=beta}
Wed Feb 12 23:56:44 UTC 2025 : Endpoint request body after transformations: 
Wed Feb 12 23:56:44 UTC 2025 : Sending request to http://petstore-demo-endpoint.execute-api.com/petstore/pets
Wed Feb 12 23:56:45 UTC 2025 : Received response. Status: 200, Integration latency: 123 ms
Wed Feb 12 23:56:45 UTC 2025 : Endpoint response headers: {Date=Wed, 12 Feb 2025 23:56:45 GMT}
Wed Feb 12 23:56:45 UTC 2025 : Endpoint response body before transformations:
Wed Feb 12 23:56:45 UTC 2025 : Method response body after transformations: (null)
Wed Feb 12 23:56:45 UTC 2025 : Method response headers: {X-Amzn-Trace-Id=Root=1-abcd-12345}
Wed Feb 12 23:56:45 UTC 2025 : Successfully completed execution
Wed Feb 12 23:56:45 UTC 2025 : Method completed with status: 204
```

------
#### [ Proxy integration ]

```
Wed Feb 12 23:59:42 UTC 2025 : Starting execution for request: abcd-1234-5678
Wed Feb 12 23:59:42 UTC 2025 : HTTP Method: GET, Resource Path: /pets
Wed Feb 12 23:59:42 UTC 2025 : Method request path: {}
Wed Feb 12 23:59:42 UTC 2025 : Method request query string: {}
Wed Feb 12 23:59:42 UTC 2025 : Method request headers: {x-version=beta}
Wed Feb 12 23:59:42 UTC 2025 : Method request body before transformations: 
Wed Feb 12 23:59:42 UTC 2025 : Endpoint request URI: http://petstore-demo-endpoint.execute-api.com/petstore/pets
Wed Feb 12 23:59:42 UTC 2025 : Endpoint request headers: { x-version=beta}
Wed Feb 12 23:59:42 UTC 2025 : Endpoint request body after transformations: 
Wed Feb 12 23:59:42 UTC 2025 : Sending request to http://petstore-demo-endpoint.execute-api.com/petstore/pets
Wed Feb 12 23:59:43 UTC 2025 : Received response. Status: 204, Integration latency: 123 ms
Wed Feb 12 23:59:43 UTC 2025 : Endpoint response headers: {Date=Wed, 12 Feb 2025 23:59:43 GMT}
Wed Feb 12 23:59:43 UTC 2025 : Endpoint response body before transformations: 
Wed Feb 12 23:59:43 UTC 2025 : Method response body after transformations:
Wed Feb 12 23:59:43 UTC 2025 : Method response headers: {Date=Wed, 12 Feb 2025 23:59:43 GMT}
Wed Feb 12 23:59:43 UTC 2025 : Successfully completed execution
Wed Feb 12 23:59:43 UTC 2025 : Method completed with status: 204
```

------

同様の API をインポートして AWS マネジメントコンソール でテストするには、[API の例](api-gateway-create-api-from-example.md) を参照してください。

## 開発のための REST API のその他の関数
<a name="rest-api-develop-details"></a>

API Gateway は、REST API の開発のためにその他の関数をサポートしています。例えば、ユーザーが API を理解しやすいように、API のドキュメントを提供できます。これを行うには、サポートされている API エンティティに [DocumentationPart](https://docs.aws.amazon.com/apigateway/latest/api/API_DocumentationPart.html) リソースを追加します。

クライアントが API を呼び出す方法を制御するには、 [IAM アクセス許可](permissions.md)、[Lambda 認証](apigateway-use-lambda-authorizer.md)、または [Amazon Cognito ユーザープール](apigateway-integrate-with-cognito.md)を使用します。API の使用を計測するには、API リクエストを調整するように[使用量プラン](api-gateway-api-usage-plans.md)を設定します。これらは、API の作成時または更新時に有効にすることができます。

次の図は、REST API 開発で使用できる関数と、リクエスト/レスポンスモデルでこれらの関数を設定する場所を示しています。

![\[API Gateway 関数の図\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/develop-features.png)


API の作成方法の概要については、「[チュートリアル: Lambda プロキシ統合を使用して REST API を作成する](api-gateway-create-api-as-simple-proxy-for-lambda.md)」を参照してください。REST API の開発時に使用できる API Gateway 機能の詳細については、以下のトピックを参照してください。これらのトピックには、概念情報に加えて、API Gateway コンソール、API Gateway REST API、AWS CLI、またはいずれかの AWS SDK を使用して実行できる手順が含まれています。

**Topics**
+ [

## REST API のリソース例
](#rest-api-develop-example)
+ [

## 開発のための REST API のその他の関数
](#rest-api-develop-details)
+ [

# API Gateway での REST API の API エンドポイントタイプ
](api-gateway-api-endpoint-types.md)
+ [

# API Gateway での REST API のセキュリティポリシー
](apigateway-security-policies.md)
+ [

# API Gateway の REST API の IP アドレスタイプ
](api-gateway-ip-address-type.md)
+ [

# API Gateway の REST API のメソッド
](how-to-method-settings.md)
+ [

# API Gateway で REST API へのアクセスを制御および管理する
](apigateway-control-access-to-api.md)
+ [

# API Gateway での REST API の統合
](how-to-integration-settings.md)
+ [

# API Gateway での REST API のリクエスト検証
](api-gateway-method-request-validation.md)
+ [

# API Gateway での REST API のデータ変換
](rest-api-data-transformations.md)
+ [

# API Gateway での REST API のゲートウェイレスポンス
](api-gateway-gatewayResponse-definition.md)
+ [

# API Gateway での REST API の CORS
](how-to-cors.md)
+ [

# API Gateway での REST API のバイナリメディアタイプ
](api-gateway-payload-encodings.md)
+ [

# API Gateway で REST API を呼び出す
](how-to-call-api.md)
+ [

# API Gateway で OpenAPI を使用して REST API を開発する
](api-gateway-import-api.md)

# API Gateway での REST API の API エンドポイントタイプ
<a name="api-gateway-api-endpoint-types"></a>

*[API エンドポイント](api-gateway-basic-concept.md#apigateway-definition-api-endpoints)*タイプは、API のホスト名を参照します。API エンドポイントタイプは、API トラフィックの大部分の発信元となっている場所に応じて、*エッジ最適化*、*リージョン別*、または*プライベート*とすることができます。

## エッジ最適化 API エンドポイント
<a name="api-gateway-api-endpoint-types-edge-optimized"></a>

*[エッジ最適化 API エンドポイント](api-gateway-basic-concept.md#apigateway-definition-edge-optimized-api-endpoint)*は通常、リクエストを最寄りの CloudFront POP (Point of Presence) にルーティングします。これは、クライアントが地理的に分散されている場合に役立ちます。これは、API Gateway REST API のデフォルトのエンドポイントタイプです。

エッジ最適化された API では、[HTTP ヘッダー](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)の名前の最初の文字は大文字になります (例: `Cookie`)。

CloudFront は、リクエストをオリジンに転送する前に、Cookie 名の自然な順序で HTTP Cookie を並べ替えます。CloudFront が Cookie を処理する方法の詳細については、「[Cookie に基づいたコンテンツのキャッシュ](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Cookies.html)」を参照してください。

エッジ最適化された API に使用するカスタムドメイン名はすべてのリージョンに適用されます。

## リージョン API エンドポイント
<a name="api-gateway-api-endpoint-types-regional"></a>

*[リージョン API エンドポイント](api-gateway-basic-concept.md#apigateway-definition-regional-api-endpoint)*は、同じリージョン内のクライアントを対象としています。EC2 インスタンスで実行されているクライアントが同じリージョン内の API を呼び出すか、API が要求の高い少数のクライアントへのサービスを目的としている場合、リージョン API は接続のオーバーヘッドを減らします。

リージョン API の場合、ユーザーが使用するカスタムドメイン名は API がデプロイされているリージョンに固有です。複数のリージョンでリージョン別 API をデプロイする場合、すべてのリージョンで同じカスタムドメイン名を使用できます。カスタムドメインを Amazon Route 53 と組み合わせて使用すると、[レイテンシーベースのルーティング](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing-policy-latency)などのタスクを実行できます。詳細については、「[API Gateway でリージョン別カスタムドメイン名を設定する](apigateway-regional-api-custom-domain-create.md)」および「[API Gateway でエッジ最適化カスタムドメイン名を設定する](how-to-edge-optimized-custom-domain-name.md)」を参照してください。

リージョン別 API エンドポイントは、すべてのヘッダー名をそのまま渡します。

**注記**  
API クライアントが地理的に分散している場合にも、リージョン API エンドポイントを独自の Amazon CloudFront ディストリビューションと一緒に使用するのが合理的です。この場合、API Gateway は、サービスが制御する CloudFront ディストリビューションに API を関連付けないようにします。このユースケースの詳細については、「[独自の CloudFront ディストリビューションで API Gateway をセットアップする方法を教えてください](https://repost.aws/knowledge-center/api-gateway-cloudfront-distribution)」を参照してください。

## プライベート API エンドポイント
<a name="api-gateway-api-endpoint-types-private"></a>

*[プライベート API エンドポイント](api-gateway-basic-concept.md#apigateway-definition-private-api-endpoint)*は、Amazon Virtual Private Cloud (VPC) からしかアクセスできない API エンドポイントです。インターフェイス VPC エンドポイントは、VPC 内に作成するエンドポイントネットワークインターフェイス (ENI) です。詳細については、「[API Gateway のプライベート REST API](apigateway-private-apis.md)」を参照してください。

Private API エンドポイントは、すべてのヘッダー名をそのまま渡します。

# API Gateway で API エンドポイントタイプを変更する (パブリックまたはプライベート)
<a name="apigateway-api-migration"></a>

API エンドポイントタイプを変更するには、API の設定を更新する必要があります。API Gateway コンソール、AWS CLI、または API Gateway 用の AWS SDK を使用して、既存の API タイプを変更できます。現在の変更が完了するまでそのエンドポイントタイプを再度変更することはできませんが、API は使用可能になります。

次のエンドポイントタイプの変更がサポートされています。
+ エッジ最適化からリージョンまたはプライベートへ
+ リージョンからエッジ最適化またはプライベートへ
+ プライベートからリージョンへ

プライベート API をエッジ最適化 API に変更することはできません。

パブリック API をエッジ最適化からリージョン、またはその逆に変更する場合、エッジ最適化 API とリージョン API とでは動作が異なることがあります。たとえば、エッジ最適化 API は `Content-MD5` ヘッダーを削除します。バックエンドに渡される MD5 ハッシュ値はすべて、リクエスト文字列パラメータまたは body プロパティで表現できます。ただし、リージョン API は (ヘッダー名を別の名前に再マップする場合がありますが) このヘッダーを渡します。この違いを理解することは、エッジ最適化 API をリージョン API に更新する方法、またはリージョン API をエッジ最適化 API に更新する方法を決めるのに役立ちます。

**Topics**
+ [

## API Gateway コンソールを使用して API エンドポイントの種類を変更する
](#migrate-api-using-console)
+ [

## AWS CLI を使用して API エンドポイントタイプを変更する
](#migrate-api-using-aws-cli)

## API Gateway コンソールを使用して API エンドポイントの種類を変更する
<a name="migrate-api-using-console"></a>

API の API エンドポイントタイプを変更するには、次の一連の手順のいずれかを実行します。

**エンドポイントをリージョン別またはエッジ最適化 (またはその逆) からパブリックに変換するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

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

1. **[API の詳細]** セクションで **[編集]** を選択します。

1. **API エンドポイントタイプ**には、**[エッジ最適化]** または **[リージョン別]** を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

1. API を再デプロイします。これにより変更が有効になります。

**プライベートエンドポイントをリージョンエンドポイントに変換するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. VPC の外部からの API コールも VPC 内部と同様に成功するように、API のリソースポリシーを編集して、VPC または VPC エンドポイントの指定を削除します。

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

1. **[API の詳細]** セクションで **[編集]** を選択します。

1. **[API エンドポイントタイプ]** で、**[リージョン別]** を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

1. リソースポリシーを API から削除します。

1. API を再デプロイします。これにより変更が有効になります。

   エンドポイントタイプをプライベートからリージョンに移行するため、API Gateway によって IP アドレスタイプが IPv4 に変更されます。詳細については、「[API Gateway の REST API の IP アドレスタイプ](api-gateway-ip-address-type.md)」を参照してください。

**リージョンエンドポイントをプライベートエンドポイントに変換するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. VPC または VPC エンドポイントへのアクセスを許可するリソースポリシーを作成します。詳細については、「[ステップ 3: プライベート API のリソースポリシーをセットアップする](apigateway-private-api-create.md#apigateway-private-api-set-up-resource-policy)」を参照してください。

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

1. **[API の詳細]** セクションで **[編集]** を選択します。

1. **[API エンドポイントタイプ]** で、**[プライベート]** を選択します。

1. (オプション) **[VPC エンドポイント ID]** で、プライベート API と関連付ける VPC エンドポイント の ID を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

1. API を再デプロイします。これにより変更が有効になります。

   エンドポイントタイプをリージョンからプライベートに移行するため、API Gateway によって IP アドレスタイプがデュアルスタックに変更されます。詳細については、「[API Gateway の REST API の IP アドレスタイプ](api-gateway-ip-address-type.md)」を参照してください。

## AWS CLI を使用して API エンドポイントタイプを変更する
<a name="migrate-api-using-aws-cli"></a>

次の [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドは、エッジ最適化 API をリージョン別 API に更新します。

```
aws apigateway update-rest-api \
    --rest-api-id a1b2c3 \
    --patch-operations op=replace,path=/endpointConfiguration/types/EDGE,value=REGIONAL
```

成功のレスポンスには、`200 OK` ステータスコードと以下のようなペイロードが含まれます。

```
{
    "createdDate": "2017-10-16T04:09:31Z",
    "description": "Your first API with Amazon API Gateway. This is a sample API that integrates via HTTP with our demo Pet Store endpoints",
    "endpointConfiguration": {
        "types": "REGIONAL"
    },
    "id": "a1b2c3",
    "name": "PetStore imported as edge-optimized"
}
```

次の [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドは、リージョン別 API をエッジ最適化 API に更新します。

```
aws apigateway update-rest-api \
    --rest-api-id a1b2c3 \
    --patch-operations op=replace,path=/endpointConfiguration/types/REGIONAL,value=EDGE
```

[put-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-rest-api.html) は API 定義の更新用なので、API エンドポイントタイプの更新には適用されません。

# API Gateway での REST API のセキュリティポリシー
<a name="apigateway-security-policies"></a>

*セキュリティポリシー*は、API Gateway が提供する TLS の最小バージョンと暗号スイートの事前定義された組み合わせです。クライアントが API またはカスタムドメイン名への TLS ハンドシェイクを確立すると、セキュリティポリシーにより、API Gateway で受け入れられる TLS バージョンと暗号スイートが適用されます。セキュリティポリシーは、クライアントとサーバー間の改ざんや盗聴などのセキュリティの問題から API とカスタムドメイン名を保護します。

API Gateway は、レガシーセキュリティポリシーと拡張セキュリティポリシーをサポートしています。`TLS_1_0` および `TLS_1_2` はレガシーセキュリティポリシーです。これらのセキュリティポリシーを使用して下位互換性を確保します。`SecurityPolicy_` で始まるポリシーは、拡張セキュリティポリシーです。これらのポリシーは、規制対象のワークロード、高度なガバナンス、またはポスト量子暗号化に使用します。拡張セキュリティポリシーを使用する場合は、追加のガバナンスのためにエンドポイントアクセスモードも設定する必要があります。詳細については、「[エンドポイントアクセスモード](#apigateway-security-policies-endpoint-access-mode)」を参照してください。

## API Gateway がセキュリティポリシーを適用する方法
<a name="apigateway-security-policies-understanding"></a>

次の例は、API Gateway が `SecurityPolicy_TLS13_1_3_2025_09` セキュリティポリシーを例として使用してセキュリティポリシーを適用する方法を示しています。

`SecurityPolicy_TLS13_1_3_2025_09` セキュリティポリシーは、TLS 1.3 トラフィックを受け入れ、TLS 1.2 および TLS 1.0 トラフィックを拒否します。TLS 1.3 トラフィックの場合、セキュリティポリシーは次の暗号スイートを受け入れます。
+ `TLS_AES_128_GCM_SHA256`
+ `TLS_AES_256_GCM_SHA384`
+ `TLS_CHACHA20_POLY1305_SHA256`

API Gateway は、他の暗号スイートを受け付けません。例えば、セキュリティポリシーは、`AES128-SHA` 暗号スイートを使用する TLS 1.3 トラフィックを拒否します。サポートされる TLS バージョンと暗号の詳細については、「[Supported security policies](apigateway-security-policies-list.md)」を参照してください。

API Gateway へのアクセスに使用した TLS プロトコルと暗号クライアントをモニタリングするには、アクセスログで `$context.tlsVersion` および `$context.cipherSuite` コンテキスト変数を使用できます。詳細については、「[API Gateway で REST API をモニタリングする](rest-api-monitor.md)」を参照してください。

## エンドポイントアクセスモード
<a name="apigateway-security-policies-endpoint-access-mode"></a>

エンドポイントアクセスモードは、`SecurityPolicy_` で始まる拡張セキュリティポリシーを使用する REST API またはカスタムドメイン名に指定する必要がある追加のパラメータです。これは、リソースを作成するとき、またはセキュリティポリシーをレガシーポリシーから拡張ポリシーに変更するときに行います。

エンドポイントアクセスモードを `STRICT` に設定すると、REST API またはカスタムドメイン名へのリクエストは、次のチェックに合格する必要があります。
+ リクエストは、リソースと同じ API Gateway エンドポイントタイプから送信する必要があります。これは、リージョンエンドポイント、エッジ最適化エンドポイント、プライベートエンドポイントのいずれかです。
+ リージョンエンドポイントまたはプライベートエンドポイントを使用する場合、API Gateway は SNI ホストマッチングを使用します。エッジ最適化エンドポイントを使用する場合、API Gateway は CloudFront のドメインフロンティング保護に準拠します。詳細については、「[ドメインフロンティング](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html#alternate-domain-names-restrictions)」を参照してください。

これらの条件のいずれかが満たされない場合、API Gateway はリクエストを拒否します。可能であれば、`STRICT` エンドポイントアクセスモードを使用することをお勧めします。

厳格なエンドポイントアクセスモードを使用するように既存の API またはドメイン名を移行するには、まずセキュリティポリシーを拡張セキュリティポリシーに更新し、エンドポイントアクセスモードを `BASIC` に設定したままにします。トラフィックとアクセスログを検証したら、エンドポイントアクセスモードを `STRICT` に設定します。エンドポイントアクセスモードを `STRICT` から `BASIC` に移行すると、変更が伝播するまで、エンドポイントは約 15 分間使用できなくなります。

特定のアプリケーションアーキテクチャでは、エンドポイントアクセスモードを `STRICT` に設定せず、代わりにエンドポイントアクセスモードを `BASIC` に設定する必要があります。次の表は、REST API またはカスタムドメイン名で `STRICT` エンドポイントアクセスモードを使用できるようするための、いくつかのアプリケーションアーキテクチャと推奨事項を示しています。


| アーキテクチャ | 推奨される移行 | 
| --- | --- | 
| VPC エンドポイントを使用してパブリックカスタムドメイン名にアクセスします。 | このアーキテクチャでは、クロスエンドポイントタイプのトラフィックを使用します。[API Gateway でのプライベート API のカスタムドメイン名](apigateway-private-custom-domains.md) に移行することをお勧めします。 | 
|  任意のメソッドを使用して、カスタムドメイン名またはプライベート DNS 名を使用しないプライベート API を呼び出します。 | このアーキテクチャでは、ホストヘッダーと TLS ハンドシェイクで使用される SNI の間に不一致が生じ、CloudFront のドメインフロンティング制限に合格しません。プライベート DNS を使用するように VPC を移行することをお勧めします。 | 
| ドメインシャーディングを使用して、複数のドメインまたはサブドメインにコンテンツを配信します。 | このアーキテクチャでは、ホストヘッダーと TLS ハンドシェイクで使用される SNI の間に不一致が生じ、CloudFront のドメインフロンティング制限に合格しません。`HTTP/2` を使用して、このアンチパターンから移行することをお勧めします。 | 

エンドポイントアクセスモードを使用する際の考慮事項を次に示します。
+ API またはドメイン名のエンドポイントアクセスモードが `STRICT` の場合、エンドポイントタイプを変更することはできません。エンドポイントタイプを変更するには、まずエンドポイントアクセスモードを `BASIC` に変更します。
+ エンドポイントアクセスモードを `BASIC` から `STRICT` に変更すると、API Gateway が厳格なエンドポイントアクセスモードを適用するまでに 15 分の遅延が発生します。
+ セキュリティポリシーを `SecurityPolicy_` で始まるポリシーからレガシーポリシーに変更する場合は、エンドポイントアクセスモードを `""` に設定解除する必要があります。

## 考慮事項
<a name="apigateway-security-policies-considerations"></a>

API Gateway の REST API のセキュリティポリシーに関する考慮事項は次のとおりです。
+ セキュリティポリシーは、OpenAPI 定義ファイルにインポートできます。詳細については、「[x-amazon-apigateway-endpoint-access-modex-amazon-apigateway-security-policy](openapi-extensions-security-policy.md)」を参照してください。
+ API は、その API とは異なるセキュリティポリシーのカスタムドメイン名にマッピングできます。そのカスタムドメイン名を呼び出すと、API Gateway は API のセキュリティポリシーを使用して TLS ハンドシェイクをネゴシエートします。デフォルトの API エンドポイントを無効にすると、発信者が API を呼び出す方法が影響を受ける可能性があります。
+ セキュリティポリシーを変更すると、更新が完了するまでに約 15 分かかります。API の `apiStatus` をモニタリングできます。API が更新されると、`apiStatus` は `UPDATING` になり、完了すると `AVAILABLE` になります。API ステータスが `UPDATING` の場合、引き続き呼び出すことができます。
+ API Gateway は、すべての API でセキュリティポリシーをサポートしています。ただし、REST API のセキュリティポリシーのみを選択できます。API Gateway は、HTTP または WebSocket API の `TLS_1_2` セキュリティポリシーのみをサポートします。
+ API のセキュリティポリシーを `TLS_1_0` から `TLS_1_2` に更新することはできません。
+ 一部のセキュリティポリシーは、ECDSA 暗号スイートと RSA 暗号スイートの両方をサポートしています。このタイプのポリシーをカスタムドメイン名で使用すると、暗号スイートは RSA または ECDSA のいずれかのお客様が用意した証明書キータイプと一致します。このタイプのポリシーを REST API で使用すると、暗号スイートは RSA 証明書タイプと互換性のある暗号スイートと一致します。

# Supported security policies
<a name="apigateway-security-policies-list"></a>

次の表では、各 REST API エンドポイントタイプとカスタムドメイン名に指定できる[セキュリティポリシー](apigateway-security-policies.md)について説明します。これらのポリシーにより、受信接続を制御できます。API Gateway は、エグレスに TLS 1.2 のみをサポートします。API またはカスタムドメイン名のセキュリティポリシーはいつでも更新できます。

タイトルに `FIPS` が含まれるポリシーは、機密情報を保護する暗号モジュールのセキュリティ要件を規定する、米国およびカナダ政府の標準である連邦情報処理規格 (FIPS) と互換性があります。詳細については、「*AWS クラウドセキュリティコンプライアンス*」ページの「[連邦情報処理規格 (FIPS) 140](https://aws.amazon.com/compliance/fips/)」を参照してください。

FIPS ポリシーはすべて AWS-LC FIPS で検証済みの暗号化モジュールを利用しています。詳細については、サイト「*NIST Cryptographic Module Validation Program*」の「[AWS-LC Cryptographic Module](https://csrc.nist.gov/projects/cryptographic-module-validation-program/certificate/4631)」のページを参照してください。

タイトルに `PQ` が含まれるポリシーは、[ポスト量子暗号 (PQC)](https://aws.amazon.com/security/post-quantum-cryptography/) を使用して TLS 用のハイブリッドキー交換アルゴリズムを実装し、将来の量子コンピューティングの脅威に対するトラフィックの機密性を確保します。

タイトルに `PFS` が含まれるポリシーは、[Perfect Forward Secrecy (PFS)](https://en.wikipedia.org/wiki/Forward_secrecy) を使用して、セッションキーが侵害されないようにします。

タイトルに `FIPS` と `PQ` の両方が含まれるポリシーは、これらの機能の両方をサポートします。

## デフォルトのセキュリティポリシー
<a name="apigateway-security-policies-default"></a>

新しい REST API またはカスタムドメインを作成すると、リソースにはデフォルトのセキュリティポリシーが割り当てられます。次の表は、これらのリソースのデフォルトのセキュリティポリシーを示しています。


| **リソース** | **デフォルトセキュリティポリシー名** | 
| --- | --- | 
| リージョンの API | TLS\$11\$10 | 
| エッジ最適化 API | TLS\$11\$10 | 
| プライベート API | TLS\$11\$12 | 
| リージョンのドメイン | TLS\$11\$12 | 
| エッジ最適化ドメイン | TLS\$11\$12 | 
| プライベートドメイン | TLS\$11\$12 | 

## リージョン API とプライベート API とカスタムドメイン名でサポートされるセキュリティポリシー
<a name="apigateway-security-policies-non-edge"></a>

次の表では、リージョン API、プライベート API、カスタムドメイン名に指定できるセキュリティポリシーについて説明します。


| **セキュリティポリシー** | **サポートされる TLS バージョン** | **サポートされる暗号** | 
| --- | --- | --- | 
| SecurityPolicy\$1TLS13\$11\$13\$12025\$109 | TLS1.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 
| SecurityPolicy\$1TLS13\$11\$13\$1FIPS\$12025\$109 | TLS1.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 
| SecurityPolicy\$1TLS13\$11\$12\$1PFS\$1PQ\$12025\$109 | TLS1.3 TLS1.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 
| SecurityPolicy\$1TLS13\$11\$12\$1PQ\$12025\$109 | TLS1.3 TLS1.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 
| TLS\$11\$12 | TLS1.3 TLS1.2 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 
| TLS\$11\$10 |  TLS1.3 TLS1.2 TLS1.1 TLS1.0  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 

## エッジ最適化 API とカスタムドメイン名でサポートされるセキュリティポリシー
<a name="apigateway-security-policies-edge-optimized"></a>

次の表では、エッジ最適化 API およびエッジ最適化カスタムドメイン名に指定できるセキュリティポリシーについて説明します。


| **セキュリティポリシー名** | **サポートされる TLS バージョン** | **サポートされる暗号** | 
| --- | --- | --- | 
| SecurityPolicy\$1TLS13\$12025\$1EDGE | TLS1.3 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 
| SecurityPolicy\$1TLS12\$1PFS\$12025\$1EDGE |  TLS1.3 TLS1.2  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 
| SecurityPolicy\$1TLS12\$12018\$1EDGE |  TLS1.3 TLS1.2  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 
| TLS\$11\$10 |  TLS1.3 TLS1.2 TLS1.1 TLS1.0  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html) [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-security-policies-list.html)  | 

## OpenSSL および RFC の暗号名
<a name="apigateway-secure-connections-openssl-rfc-cipher-names"></a>

OpenSSL と IETF RFC 5246 では、同じ暗号に異なる名前を使用します。以下の表では、各暗号化方式の OpenSSL 名 から RFC 名までを示しています。詳細については、OpenSSL ドキュメントの「[ciphers](https://docs.openssl.org/1.1.1/man1/ciphers/)」を参照してください。


| **OpenSSL の暗号名** | **RFC の暗号名** | 
| --- | --- | 
| TLS\$1AES\$1128\$1GCM\$1SHA256 | TLS\$1AES\$1128\$1GCM\$1SHA256 | 
| TLS\$1AES\$1256\$1GCM\$1SHA384 | TLS\$1AES\$1256\$1GCM\$1SHA384 | 
| TLS\$1CHACHA20\$1POLY1305\$1SHA256 | TLS\$1CHACHA20\$1POLY1305\$1SHA256 | 
| ECDHE-RSA-AES128- GCM-SHA256 | TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 | 
| ECDHE-RSA-AES128-SHA256 | TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256  | 
| ECDHE-RSA-AES128-SHA | TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA | 
| ECDHE-RSA-AES256- GCM-SHA384 | TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384  | 
| ECDHE-RSA-AES256-SHA384 | TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA384  | 
| ECDHE-RSA-AES256-SHA | TLS\$1ECDHE\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA | 
| AES128-GCM-SHA256 | TLS\$1RSA\$1WITH\$1AES\$1128\$1GCM\$1SHA256 | 
| AES256-GCM-SHA384 | TLS\$1RSA\$1WITH\$1AES\$1256\$1GCM\$1SHA384 | 
| AES128-SHA256 | TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA256 | 
| AES256-SHA | TLS\$1RSA\$1WITH\$1AES\$1256\$1CBC\$1SHA | 
| AES128-SHA | TLS\$1RSA\$1WITH\$1AES\$1128\$1CBC\$1SHA | 
| DES-CBC3-SHA | TLS\$1RSA\$1WITH\$13DES\$1EDE\$1CBC\$1SHA | 

# セキュリティポリシーを変更する方法
<a name="apigateway-security-policies-update"></a>

API のセキュリティポリシーを変更することができます。カスタムドメイン名を介して API にトラフィックを送信する場合、API とカスタムドメイン名が同じセキュリティポリシーを持つ必要はありません。そのカスタムドメイン名を呼び出すと、API Gateway は API のセキュリティポリシーを使用して TLS ハンドシェイクをネゴシエートします。ただし、一貫性を保つために、カスタムドメイン名と API に同じセキュリティポリシーを使用することをお勧めします。

セキュリティポリシーを変更すると、更新が完了するまでに約 15 分かかります。API の `apiStatus` をモニタリングできます。API が更新されると、`apiStatus` は `UPDATING` になり、完了すると `AVAILABLE` になります。API が更新されても、呼び出すことができます。

------
#### [ AWS マネジメントコンソール ]

**API のセキュリティポリシーを変更するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. **[API の設定]**、**[Edit]** の順に選択します。

1. **[セキュリティポリシー]** で、`SecurityPolicy_` で始まる新しいポリシーを選択します。

1. **[エンドポイントアクセスモード]** で、**[厳格]** を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

   変更を有効にするには、API を再デプロイします。エンドポイントアクセスモードを [厳格] に変更したため、変更が完全に反映されるまでに約 15 分かかります。

------
#### [ AWS CLI ]

次の [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドは、API を更新して `SecurityPolicy_TLS13_1_3_2025_09` セキュリティポリシーを使用します。

```
aws apigateway update-rest-api \
    --rest-api-id abcd1234 \
    --patch-operations '[
        {
            "op": "replace",
            "path": "/securityPolicy",
            "value": "SecurityPolicy_TLS13_1_3_2025_09"
        }, 
        {
            "op": "replace",
            "path": "/endpointAccessMode",
            "value": "STRICT"
        }
    ]'
```

出力は次のようになります。

```
{
    "id": "abcd1234",
    "name": "MyAPI",
    "description": "My API with a new security policy",
    "createdDate": "2025-02-04T11:47:06-08:00",
    "apiKeySource": "HEADER",
    "endpointConfiguration": {
        "types": [
            "REGIONAL"
        ],
        "ipAddressType": "dualstack"
    },
    "tags": {},
    "disableExecuteApiEndpoint": false,
    "securityPolicy": "SecurityPolicy_TLS13_1_3_2025_09",
    "endpointAccessMode": "STRICT"
    "rootResourceId": "efg456"
}
```

次の [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドは、拡張セキュリティポリシーを使用して `TLS_1_0` セキュリティポリシーを使用していた API を更新します。

```
aws apigateway update-rest-api \
    --rest-api-id abcd1234 \
    --patch-operations '[
        {
            "op": "replace",
            "path": "/securityPolicy",
            "value": "TLS_1_0"
        }, 
        {
            "op": "replace",
            "path": "/endpointAccessMode",
            "value": ""
        }
    ]'
```

出力は次のようになります。

```
{
    "id": "abcd1234",
    "name": "MyAPI",
    "description": "My API with a new security policy",
    "createdDate": "2025-02-04T11:47:06-08:00",
    "apiKeySource": "HEADER",
    "endpointConfiguration": {
        "types": [
            "REGIONAL"
        ],
        "ipAddressType": "dualstack"
    },
    "tags": {},
    "disableExecuteApiEndpoint": false,
    "securityPolicy": "TLS_1_0",
    "rootResourceId": "efg456"
}
```

------

# API Gateway の REST API の IP アドレスタイプ
<a name="api-gateway-ip-address-type"></a>

API を作成する際、API を呼び出すことができる IP アドレスのタイプを指定します。IPv4 を選択して IPv4 アドレスを解決し、API を呼び出すことができます。デュアルスタックを選択すると、API の呼び出しを IPv4 アドレスと IPv6 アドレスの両方に許可できます。IP アドレスタイプをデュアルスタックに設定して、IP スペースの枯渇の問題を軽減したり、セキュリティ体制を強化したりすることをお勧めします。デュアルスタック IP アドレスタイプの利点の詳細については、「[IPv6 on AWS](https://docs.aws.amazon.com/whitepapers/latest/ipv6-on-aws/internet-protocol-version-6.html)」を参照してください。

API を IPv6 トラフィックのみに制限するには、リソースポリシーを作成して、ソース IP アドレスを IPv6 範囲のみに制限します。IP アドレスタイプは、API の設定を更新して、変更できます。この変更はすぐに有効になり、API を再デプロイする必要はありません。詳細については、[例: 送信元の IP アドレスまたは IP アドレスの範囲に基づき、API トラフィックを拒否する](apigateway-resource-policies-examples.md#apigateway-resource-policies-source-ip-address-example)を参照してください。

## IP アドレスタイプに関する考慮事項
<a name="api-gateway-ip-address-type-considerations"></a>

以下の考慮事項は、IP アドレスタイプの使用に影響する可能性があります。
+ すべてのリージョンおよびエッジ最適化 API のデフォルトの IP アドレスタイプは IPv4 です。
+ プライベート API は、デュアルスタック IP アドレスタイプのみを指定できます。
+ 既存の API の IP アドレスタイプを IPv4 からデュアルスタックに変更する場合、API へのアクセスを制御するポリシーが IPv6 呼び出しを考慮して更新されていることを確認します。IP アドレスタイプを変更すると、変更はすぐに有効になります。
+ API のエンドポイントタイプをリージョンまたはエッジ最適化からプライベートに移行すると、API Gateway によって IP アドレスタイプがデュアルスタックに変更されます。詳細については、「[API Gateway で API エンドポイントタイプを変更する (パブリックまたはプライベート)](apigateway-api-migration.md)」を参照してください。
+ API のエンドポイントタイプをプライベートからリージョンに移行する場合、IP アドレスタイプをデュアルスタックに設定する必要があります。エンドポイントの移行が完了したら、IP アドレスタイプを IPv4 に変更できます。詳細については、「[API Gateway で API エンドポイントタイプを変更する (パブリックまたはプライベート)](apigateway-api-migration.md)」を参照してください。
+ API は、その API とは異なる IP アドレスタイプのカスタムドメイン名にマッピングできます。デフォルトの API エンドポイントを無効にすると、発信者が API を呼び出す方法が影響を受ける可能性があります。
+ 外部定義ファイルを使用して API の IP アドレスタイプを設定することはできません。

# REST API の IP アドレスタイプを変更する
<a name="api-gateway-ip-address-type-change"></a>

IP アドレスタイプは、API の設定を更新して、変更できます。API の設定は、AWS マネジメントコンソール、AWS CLI、CloudFormation、または AWS SDK を使用して、更新できます。API の IP アドレスタイプを変更した場合、API を再デプロイしなくても変更が有効になります。IP アドレスタイプを変更する前に、API へのアクセスを制御するポリシーが IPv6 呼び出しを考慮して更新されていることを確認します。

------
#### [ AWS マネジメントコンソール ]

**REST API の IP アドレスタイプを変更するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. **[API の設定]**、**[Edit]** の順に選択します。

1. [IP アドレスタイプ] で、**[IPv4]** または **[デュアルスタック]** を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

   API の設定の変更はすぐに有効になります。

------
#### [ AWS CLI ]

次の [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドは、IP アドレスタイプがデュアルスタックになるように API を更新します。

```
aws apigateway update-rest-api \
    --rest-api-id abcd1234 \
    --patch-operations "op='replace',path='/endpointConfiguration/ipAddressType',value='dualstack'"
```

出力は次のようになります。

```
{
    "id": "abcd1234",
    "name": "MyAPI",
    "description": "My API with a dualstack IP address type",
    "createdDate": "2025-02-04T11:47:06-08:00",
    "apiKeySource": "HEADER",
    "endpointConfiguration": {
        "types": [
            "REGIONAL"
        ],
        "ipAddressType": "dualstack"
    },
    "tags": {},
    "disableExecuteApiEndpoint": false,
    "rootResourceId": "efg456"
}
```

------

# API Gateway の REST API のメソッド
<a name="how-to-method-settings"></a>

 API Gateway では、API メソッドに[メソッドリクエスト](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html)と[メソッドレスポンス](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html)が含まれます。API メソッドをセットアップし、バックエンドのサービスへのアクセスをリクエストするためにクライアントが実行しなければならない操作を定義し、その操作によってクライアントが受け取るレスポンスを定義します。入力では、クライアント用にメソッドリクエストパラメータか該当するペイロードを選択し、実行時に必須データやオプションデータを提供できます。出力では、メソッドレスポンスステータスコード、ヘッダー、該当する本文をターゲットとして定義し、クライアントに返される前のバックエンドレスポンスデータをマッピングできます。API の動作および入出力形式に関するデベロッパーの理解を促進するために、[API をドキュメント化](api-gateway-documenting-api.md)し、[無効なリクエスト](api-gateway-method-request-validation.md)に関する[適切なエラーメッセージを提供](api-gateway-gatewayResponse-definition.md#customize-gateway-responses)することができます。

API メソッドリクエストは、HTTP リクエストです。メソッドリクエストをセットアップするには、HTTP メソッド (または動詞)、API [リソース](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html)へのパス、ヘッダー、該当するクエリ文字列パラメータを設定します。HTTP メソッドが `POST`、`PUT`、または `PATCH` の場合、ペイロードも設定できます。たとえば、[PetStore サンプル API](api-gateway-create-api-from-example.md) を使用してペットを取得するには、`GET /pets/{petId}` の API メソッドリクエストを定義します。`{petId}` は、実行時に数字をとることができるパスパラメータです。

```
GET /pets/1
Host: apigateway.us-east-1.amazonaws.com
...
```

クライアントが誤ったパスを指定すると (`/pet/1` ではなく `/pets/one` や `/pets/1` など)、例外がスローされます。

API メソッドレスポンスは、指定のステータスコードの HTTP レスポンスです。非プロキシ統合では、メソッドレスポンスをセットアップしてマッピングの必須ターゲットまたはオプションたーげえとを指定する必要があります。これらは、統合レスポンスのヘッダーや本文を関連するメソッドレスポンスのヘッダーや本文に変換します。このマッピングは、そのまま統合を介してヘッダーまたは本文を渡す単純な [ID 変換](https://en.wikipedia.org/wiki/Identity_transform)です。たとえば、次の `200` メソッドレスポンスに、成功した統合レスポンスがそのまま通過する例を示します。

```
200 OK 
Content-Type: application/json
...

{
    "id": "1",
    "type": "dog",
    "price": "$249.99"
}
```

原理上は、バックエンドからの特定のレスポンスに対応するメソッドレスポンスを定義することができます。通常、これにはあらゆる 2XX、4XX、および 5XX レスポンスが含まれます。ただし、バックエンドが返すすべてのレスポンスを前もって把握できない可能性があるため、この手順は実用的でないことがあります。実際には、1 つのメソッドレスポンスをデフォルトとして指定し、バックエンドからの不明なレスポンスやマッピングされていないレスポンスを処理することができます。デフォルトとして 500 レスポンスを指定することをお勧めします。いずれの場合も、非プロキシ統合に対してメソッドレスポンスを 1 つ以上セットアップする必要があります。そうしなければ、バックエンドでリクエストが成功した場合であっても API Gateway が クライアントに 500 のエラーレスポンスを返します。

 Java SDK など厳密に型指定された SDK を API 用にサポートするには、メソッドリクエストの入力用とメソッドレスポンスの出力用のデータモデルを定義する必要があります。

## 前提条件
<a name="method-setting-prerequisites"></a>

API メソッドをセットアップする前に、以下について検証します。
+ メソッドが API Gateway で使用可能であることが必要です。「」の手順に従います[チュートリアル: HTTP 非プロキシ統合を使用して REST API を作成する](api-gateway-create-api-step-by-step.md)
+ メソッドと Lambda 関数を通信させるには、IAM で Lambda 呼び出しロールと Lambda 実行ロールを作成済みである必要があります。メソッドが で通信するための Lambda 関数も作成しておく必要がありますAWS Lambda ロールと関数を作成するには、[Lambda 非プロキシ統合用の Lambda 関数の作成](getting-started-lambda-non-proxy-integration.md#getting-started-new-lambda) の「[AWS Lambda 統合を選択するチュートリアル](getting-started-with-lambda-integration.md)」で説明する指示に従ってください。
+ メソッドを HTTP または HTTP プロキシ統合と通信させるには、メソッドが通信する HTTP エンドポイント URL をすでに作成してアクセスを確立している必要があります。
+  HTTP および HTTP プロキシエンドポイントの証明書が API Gateway によりサポートされていることを確認します。詳細については、「[API Gateway での HTTP および HTTP プロキシ統合のための API Gateway 対応の証明機関](api-gateway-supported-certificate-authorities-for-http-endpoints.md)」を参照してください。

**Topics**
+ [

## 前提条件
](#method-setting-prerequisites)
+ [

# API Gateway でメソッドリクエストをセットアップする
](api-gateway-method-settings-method-request.md)
+ [

# API Gateway でメソッドレスポンスをセットアップする
](api-gateway-method-settings-method-response.md)
+ [

# API Gateway コンソールを使用してメソッドをセットアップする
](how-to-set-up-method-using-console.md)

# API Gateway でメソッドリクエストをセットアップする
<a name="api-gateway-method-settings-method-request"></a>

メソッドリクエストのセットアップするには、[RestApi](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html) リソースを作成した後に次のタスクを実行する必要があります。

1.  新しい API を作成するか、既存の API [リソース](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html) エンティティを選択する。

1.  新しいまたは選択された API `Resource` の固有の HTTP 動詞になる API [メソッド](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html)リソースを作成する。このタスクは、さらに次のサブタスクに分けられます。
   +  HTTP メソッドをメソッドリクエストに追加する
   +  リクエストパラメータを設定する
   +  リクエストボディのモデルを定義する
   +  認可スキームを実行する
   +  リクエストの検証を有効化する 

これらのタスクは次のメソッドを使用して実行できます。
+  [API Gateway コンソール](how-to-set-up-method-using-console.md#how-to-method-settings-callers-console)
+  AWS CLI コマンド ([create-resource](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-resource.html) と [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html))
+  AWS SDK 関数 (Node.js の場合は [createResource](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/APIGateway.html#createResource-property) と [putMethod](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/APIGateway.html#putMethod-property) など)
+  API Gateway REST API ([resource:create](https://docs.aws.amazon.com/apigateway/latest/api/API_CreateResource.html) と [method:put](https://docs.aws.amazon.com/apigateway/latest/api/API_PutMethod.html))

**Topics**
+ [

## API リソースをセットアップする
](#setup-method-resources)
+ [

## HTTP メソッドをセットアップする
](#setup-method-add-http-method)
+ [

## メソッドリクエストパラメータをセットアップする
](#setup-method-request-parameters)
+ [

## メソッドリクエストモデルをセットアップする
](#setup-method-request-model)
+ [

## メソッドリクエスト認可をセットアップする
](#setup-method-request-authorization)
+ [

## メソッドリクエスト検証をセットアップする
](#setup-method-request-validation)

## API リソースをセットアップする
<a name="setup-method-resources"></a>

API Gateway API で、API [リソース](https://docs.aws.amazon.com/apigateway/latest/api/API_GetResources.html)エンティティとしてアドレス可能なリソースを階層上部のルートリソース (`/`) とともに公開します。ルートリソースは API のベース URL に関連し、API エンドポイントとステージ名を構成します。API Gateway コンソールで、この基本 URI は **Invoke URI** と呼ばれ、API のデプロイ後に API のステージエディタに表示されます。

API エンドポイントは、デフォルトのホスト名やカスタムドメイン名にすることができます。デフォルトのホスト名は次の形式になります。

```
{api-id}.execute-api.{region}.amazonaws.com
```

この形式で、*\$1api-id\$1* は、API Gateway によって生成された API 識別子を示します。`{region}` 変数は、API 作成時に選択した AWS リージョン (`us-east-1` など) を表します。カスタムドメイン名は、有効のインターネットドメインの下に存在するユーザーが使いやすい任意の名前です。たとえば、`example.com` のインターネットドメインを登録している場合は、あらゆる `*.example.com` がカスタムドメイン名として有効です。詳細については、「[カスタムドメイン名を作成する](how-to-custom-domains.md)」を参照してください。

[PetStore サンプル API](api-gateway-create-api-from-example.md) では、ルートリソース (`/`) がペットストアを公開します。`/pets` リソースは、ペットストアで使用可能なペットのコレクションを表します。`/pets/{petId}` は、指定の識別子 (`petId`) の個別のペットを公開します。`{petId}` のパスパラメータは、リクエストパラメータの一部です。

API リソースをセットアップするには、親として既存のリソースを選択した後、親リソースの下の子リソースを選択します。最初に親となるルートリソースから開始します。この親に子リソースを追加し、その子リソースに新しい親として別のリソースをする手順を親識別子まで繰り返します。その後、名前の付いたリソースを親に追加します。

次の [get-resources](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-resources.html) コマンドは、API のすべてのリソースを取得します。

```
aws apigateway get-resources --rest-api-id apiId
```

PetStore サンプル API では、出力は次のようになります。

```
{
    "items": [
        {
            "path": "/pets", 
            "resourceMethods": {
                "GET": {}
            }, 
            "id": "6sxz2j", 
            "pathPart": "pets", 
            "parentId": "svzr2028x8"
        }, 
        {
            "path": "/pets/{petId}", 
            "resourceMethods": {
                "GET": {}
            }, 
            "id": "rjkmth", 
            "pathPart": "{petId}", 
            "parentId": "6sxz2j"
        }, 
        {
            "path": "/", 
            "id": "svzr2028x8"
        }
    ]
}
```

各アイテムは、ルートリソースを除くリソース (`id`) の識別子、直接の親 (`parentId`)、リソース名 (`pathPart`) をリストします。ルートリソースは他と異なり、親を持ちません。親としてリソースを選択した後、次のコマンドを使用して子リソースを追加します。

```
aws apigateway create-resource --rest-api-id apiId \
    --parent-id parentId \
    --path-part resourceName
```

例えば、PetStore Web サイトで販売するペットフードを追加するには、次のコマンドを使用します。

```
aws apigateway create-resource --rest-api-id a1b2c3 \
    --parent-id svzr2028x8 \
    --path-part food
```

出力は次のようになります。

```
{
    "path": "/food", 
    "pathPart": "food", 
    "id": "xdsvhp", 
    "parentId": "svzr2028x8"
}
```

### プロキシリソースを使用して API セットアップを効率化する
<a name="api-gateway-proxy-resource"></a>

ビジネスの成長に応じて、PetStore のオーナーはフードや玩具などのペット関連のアイテムを商品に追加する場合があります。これをサポートするため、ルートリソースの下に `/food` や `/toys` などのリソースを追加できます。各販売カテゴリの下で、`/food/{type}/{item}` や `/toys/{type}/{item}` などのリソースをさらに追加する必要もあります。この手順には手間がかかる場合があります。ミドルレイヤー `{subtype}` をリソースパスに追加してパス階層を `/food/{type}/{subtype}/{item}` や `/toys/{type}/{subtype}/{item}` などに変更すると、この変更によって既存の API のセットアップは無効になります。これを回避するため、API Gateway [プロキシリソース](api-gateway-set-up-simple-proxy.md)を使用して 1 度にすべての API リソースのセットを公開できます。

API Gateway はプロキシリソースを、リクエストが送信された際に指定されるリクエストのプレースホルダーとして定義しています。プロキシリソースは、greedy パスパラメータと呼ばれることも多い `{proxy+}` の特別なパスパラメータで示されます。`+` マークは、付加されている子リソースを示します。`/parent/{proxy+}` プレースホルダ―は、`/parent/*` のパスパターンに一致するすべてのリソースを表します。greedy パスのパラメータ名には、任意の文字列を使用できます。

次の [create-resource](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-resource.html) コマンドは、ルート (`/{proxy+}`) の下にプロキシリソースを作成します。

```
aws apigateway create-resource --rest-api-id apiId \
    --parent-id rootResourceId \
    --path-part {proxy+}
```

出力は次のようになります。

```
{
    "path": "/{proxy+}", 
    "pathPart": "{proxy+}", 
    "id": "234jdr", 
    "parentId": "svzr2028x8"
}
```

`PetStore` API の例では、`/{proxy+}` を使用して `/pets` と `/pets/{petId}` の両方を表すことができます。このプロキシリソースは、`/food/{type}/{item}` や `/toys/{type}/{item}` または `/food/{type}/{subtype}/{item}` や `/toys/{type}/{subtype}/{item}` など、他のリソース (既存のものや追加されるもの) も参照できます。バックエンド開発者はリソース階層を決定し、クライアント開発者はそれを理解する必要があります。API Gateway は単純に、クライアントがバックエンドに送信したものをすべてパスします。

API のプロキシリソースは、複数の場合があります。例えば、次のプロキシリソースは API 内で許可されます。ただし、`/parent/{proxy+}` は `/parent/{child}/{proxy+}` と同じ親ではないものとします。

```
/{proxy+}
/parent/{proxy+}
/parent/{child}/{proxy+}
```

プロキシリソースに非プロキシの兄弟がない場合、兄弟リソースはプロキシリソースの表現から除外されます。前の例では、`/{proxy+}` はルートリソースの下の `/parent[/*]` リソース以外のあらゆるリソースを表します。言い換えると、特定のリソースに対するメソッドリクエストは、リソース階層の同じレベルの一般的なリソースに対するメソッドリクエストより優先されます。

次の表では、API Gateway が API の `prod` ステージの次のリソースにリクエストをルーティングする方法を示しています。

```
ANY /{proxy+}
GET /pets/{proxy+}
GET /pets/dog
```


| リクエスト | 選択されたルート | 説明 | 
| --- | --- | --- | 
|  `GET https://api-id.execute-api.region.amazonaws.com/prod/pets/dog`  |  `GET /pets/dog`  |  リクエストはこのリソースに完全に一致します。  | 
|  `GET https://api-id.execute-api.region.amazonaws.com/prod/pets/cats`  |  `GET /pets/{proxy+}`  |  `/pets/{proxy+}` greedy パス変数がこのリクエストを受け取ります。  | 
|  `GET https://api-id.execute-api.region.amazonaws.com/prod/animals`  |  `GET /{proxy+}`  |  `/{proxy+}` greedy パス変数がこのリクエストを受け取ります。  | 

プロキシリソースは、子リソースを持つことができません。`{proxy+}` の後の API リソースは冗長かつあいまいです。API では次のプロキシリソースは許可されません。

```
/{proxy+}/child
/parent/{proxy+}/{child}
/parent/{child}/{proxy+}/{grandchild+}
```

## HTTP メソッドをセットアップする
<a name="setup-method-add-http-method"></a>

API メソッドリクエストは、API Gateway [メソッド](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html)リソースに封入されます。メソッドリクエストをセットアップするには、最初に `Method` リソースをインスタンス化し、少なくとも 1 つの HTTP メソッドを設定して、同メソッドに少なくとも 1 つの認可タイプを設定する必要があります。

API Gateway はプロキシリソースに厳密に関連付けられており、`ANY` の HTTP メソッドをサポートします。この `ANY` メソッドは、実行時に指定されるすべての HTTP メソッドを表します。これにより、単一の API メソッドのセットアップを `DELETE`、`GET`、`HEAD`、`OPTIONS`、`PATCH`、`POST` および `PUT` のサポートされるすべての HTTP メソッドに使用できます。

同様に非プロキシリソースに `ANY` メソッドをセットアップできます。`ANY` メソッドをプロキシリソースと組み合わせることで、API のすべてのリソースに対し、サポートされる HTTP メソッドのための単一の API メソッドのセットアップを使用できます。さらに、バックエンドは既存の API セットアップを無効化することなく進化できます。

 API メソッドをセットアップする前に、メソッドを呼び出すことができるユーザーについて考慮します。プランに従って認可タイプを設定します。オープンアクセスの場合は、`NONE` に設定します。IAM アクセス許可を使用するには、認可タイプを`AWS_IAM`に設定します。Lambda オーソライザー関数を使用するには、このプロパティを `CUSTOM` に設定します。Amazon Cognito ユーザープールを使用するには、認可タイプを`COGNITO_USER_POOLS`に設定します。

次の [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) コマンドは、IAM アクセス許可を使用してアクセスを制御する `ANY` 動詞のメソッドリクエストを作成します。

```
aws apigateway put-method --rest-api-id vaz7da96z6 \
    --resource-id 6sxz2j \
    --http-method ANY \
    --authorization-type AWS_IAM
```

別の認可タイプで API メソッドリクエストを作成するには、「[メソッドリクエスト認可をセットアップする](#setup-method-request-authorization)」を参照してください。

## メソッドリクエストパラメータをセットアップする
<a name="setup-method-request-parameters"></a>

リクエストパラメータは、クライアントがメソッドリクエストの完了に必要な入力データや実行コンテクストを提供する方法の 1 つです。メソッドパラメータは、パスパラメータ、ヘッダー、クエリ文字列パラメータにできます。メソッドリクエストのセットアップの一環として、必要なリクエストパラメータを宣言し、クライアントが使用できるようにする必要があります。非プロキシ統合では、これらのリクエストパラメータをバックエンド要件に適合する形式に変換できます。

たとえば、`GET /pets/{petId}` メソッドリクエストでは `{petId}` パス変数は必須リクエストパラメータです。このパスパラメータは、`put-method` の AWS CLI コマンドを呼び出す際に宣言できます。次の [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) コマンドは、パスのパラメータを必須とするメソッドを作成します。

```
aws apigateway put-method --rest-api-id vaz7da96z6 \
    --resource-id rjkmth \
    --http-method GET \
    --authorization-type "NONE" \
    --request-parameters method.request.path.petId=true
```

必須ではないパラメータは、`false` で `request-parameters` に設定できます。例えば、`GET /pets` メソッドで `type` のオプションのクエリ文字列パラメータと `age` のオプションのヘッダーパラメータを使用する場合は、次の [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) コマンドを使用してそれらのパラメータを宣言できます。

```
aws apigateway put-method --rest-api-id vaz7da96z6 \
    --resource-id 6sxz2j \
    --http-method GET \
    --authorization-type "NONE" \
    --request-parameters method.request.querystring.type=false,method.request.header.age=false
```

この省略形式の代わりに、JSON 文字列を使用して `request-parameters` 値を設定できます。

```
'{"method.request.querystring.type":false,"method.request.header.age":false}'
```

このようにセットアップすると、クライアントはペットをタイプ別にクエリできます。

```
GET /pets?type=dog
```

 その後、クライアントは次のように子犬である犬を求めてクエリを実行できます。

```
GET /pets?type=dog
age:puppy
```

メソッドリクエストパラメータを統合リクエストパラメータにマッピングする方法の詳細については、「[API Gateway での REST API の統合](how-to-integration-settings.md)」を参照してください。

## メソッドリクエストモデルをセットアップする
<a name="setup-method-request-model"></a>

ペイロードに入力データを取ることができる API メソッドでは、モデルを使用できます。モデルは [JSON スキーマのドラフト 4](https://datatracker.ietf.org/doc/html/draft-zyp-json-schema-04) で表され、リクエストボディのデータ構造を説明します。モデルにより、クライアントは入力としてメソッドリクエストペイロードを作成する方法を決定できます。さらに重要なことに、API Gateway はモデルを使用し、API Gateway コンソールで統合をセットアップするために[リクエストを検証し](api-gateway-method-request-validation.md)、[SDK を作成し](how-to-generate-sdk.md)、マッピングテンプレートを初期化します。[モデル](https://docs.aws.amazon.com/apigateway/latest/api/API_Model.html)の作成方法については、「[データモデルを理解する](models-mappings-models.md)」を参照してください。

メソッドペイロードはコンテンツタイプに応じて異なる形式になる場合があります。モデルは適用されたペイロードのメディアタイプに対してインデックス作成されます。API Gateway は、`Content-Type` リクエストヘッダーを使用してコンテンツタイプを決定します。メソッドリクエストモデルをセットアップするには、`"media-type":"model-name"` `requestModels` コマンドを呼び出す際に AWS CLI 形式のキー値のペアを `put-method` マップに追加します。

コンテンツタイプに関係なく同じモデルを使用するには、キーとして `$default` を指定します。

例えば、PetStore サンプル API の `POST /pets` メソッドリクエストの JSON ペイロードにモデルを設定するには、次の [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) コマンドを使用できます。

```
aws apigateway put-method \
    --rest-api-id vaz7da96z6 \
    --resource-id 6sxz2j \
    --http-method POST \
    --authorization-type "NONE" \
    --request-models '{"application/json":"petModel"}'
```

ここで `petModel` は、ペットを説明する [https://docs.aws.amazon.com/apigateway/latest/api/API_Model.html](https://docs.aws.amazon.com/apigateway/latest/api/API_Model.html) リソースの `Model` プロパティ値です。実際のスキーマ定義は、`schema` リソースの [https://docs.aws.amazon.com/apigateway/latest/api/API_Model.html#schema](https://docs.aws.amazon.com/apigateway/latest/api/API_Model.html#schema) プロパティの JSON 文字列値として表されます。

 Java または厳密に型指定された API のその他の SDK では、入力データはスキーマ定義から取得された `petModel` クラスとしてキャストされます。リクエストモデルを使用すると、作成された SDK 内の入力データは、デフォルトの `Empty` モデルから取得された `Empty` クラスにキャストされます。この場合、クライアントは正しいデータクラスをインスタンス化して必要な入力を提供することができません。



## メソッドリクエスト認可をセットアップする
<a name="setup-method-request-authorization"></a>



 API メソッドを呼び出すことができるユーザーを制御するため、メソッドの [[認可タイプ](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html#authorizationType)] を設定できます。このタイプを使用し、IAM ロールとポリシー (`AWS_IAM`)、Amazon Cognito ユーザープール (`COGNITO_USER_POOLS`)、Lambda オーソライザー (`CUSTOM`) など、サポートされているオーソライザーのいずれかを有効にできます。

API メソッドへのアクセスを認可する IAM アクセス許可を使用するには、`authorization-type` 入力プロパティを **AWS\$1IAM** に設定します。このオプションを設定すると、API Gateway は、発信者の証明情報に基づいて、リクエストにある発信者の署名を検証します。検証されたユーザーにメソッドを呼び出す権限がある場合、リクエストは承諾されます。それ以外の場合、リクエストは拒否され、発信者は未承認エラーレスポンスを受信します。発信者に API メソッドを呼び出す権限がない限り、メソッドの呼び出しは成功しません。以下の IAM ポリシーでは、同じ AWS アカウント 内で作成されたすべての API メソッドを呼び出す権限を発信者に付与します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke"
            ],
            "Resource": "arn:aws:execute-api:*:*:*"
        }
    ]
}
```

------

詳細については、「[IAM アクセス許可を使用して REST API へのアクセスを制御する](permissions.md)」を参照してください。

現在、このポリシーは API 所有者の AWS アカウント 内のユーザー、グループ、ロールにのみ付与できます。別の AWS アカウント のユーザーは、`execute-api:Invoke` アクションを呼び出すために必要なアクセス許可がある API 所有者の AWS アカウント 内のロールを引き受けることが許可されている場合のみ、API メソッドを呼び出すことができます。クロスアカウントアクセス許可の詳細については、「[IAM ロールの使用](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)」を参照してください。

AWS CLI や AWS SDK を使用するか、[Signature Version 4 (SigV4) 署名](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html)を実装する [Postman](https://www.postman.com/) などの REST API クライアントを使用できます。

Lambda オーソライザーを使用して API メソッドへのアクセスを承認するには、`authorization-type` 入力プロパティを `CUSTOM` に設定し、[https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html#authorizerId](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html#authorizerId) 入力プロパティを既存の Lambda オーソライザーの [https://docs.aws.amazon.com/apigateway/latest/api/API_Authorizer.html#id](https://docs.aws.amazon.com/apigateway/latest/api/API_Authorizer.html#id) プロパティ値に設定します。参照された Lambda オーソライザーは、`TOKEN` または `REQUEST` タイプになります。Lambda オーソライザーの作成については、「[API Gateway Lambda オーソライザーを使用する](apigateway-use-lambda-authorizer.md)」を参照してください。

Amazon Cognito ユーザープールを使用して API メソッドへのアクセスを承認するには、`authorization-type` 入力プロパティを `COGNITO_USER_POOLS` に設定し、[https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html#authorizerId](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html#authorizerId) 入力プロパティを作成済みの `COGNITO_USER_POOLS` オーソライザーの [https://docs.aws.amazon.com/apigateway/latest/api/API_Authorizer.html#id](https://docs.aws.amazon.com/apigateway/latest/api/API_Authorizer.html#id) プロパティ値に設定します。Amazon Cognito ユーザープールオーソライザーの詳細な作成方法については、「[Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する](apigateway-integrate-with-cognito.md)」を参照してください。

## メソッドリクエスト検証をセットアップする
<a name="setup-method-request-validation"></a>

API メソッドリクエストをセットアップする際は、リクエスト検証を有効化できます。最初に[リクエストバリデーター](https://docs.aws.amazon.com/apigateway/latest/api/API_RequestValidator.html)を作成する必要があります。次の [create-request-validator](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-request-validator.html) コマンドは、本文のみを検証するリクエストバリデーターを作成します。

```
aws apigateway create-request-validator \
    --rest-api-id 7zw9uyk9kl \
    --name bodyOnlyValidator \
    --validate-request-body  \
    --no-validate-request-parameters
```

出力は次のようになります。

```
{
    "validateRequestParameters": false, 
    "validateRequestBody": true, 
    "id": "jgpyy6", 
    "name": "bodyOnlyValidator"
}
```

このリクエストバリデーターにより、メソッドリクエストの設定の一部としてリクエストの検証を使用できます。次の [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) コマンドは、受信リクエスト本文が `PetModel` と一致する必要があり、2 つのリクエストパラメータを必須としないメソッドリクエストを作成します。

```
aws apigateway put-method \
    --rest-api-id 7zw9uyk9kl \
    --resource-id xdsvhp \
    --http-method PUT \
    --authorization-type "NONE" \
    --request-parameters '{"method.request.querystring.type": false, "method.request.querystring.page":false}' \ 
    --request-models '{"application/json":"petModel"}' \
    --request-validator-id jgpyy6
```

リクエストの検証にリクエストパラメータを含めるには、リクエストバリデーターで `validateRequestParameters` を `true` に設定し、`put-method` コマンドで特定のリクエストパラメータを `true` に設定する必要があります。

# API Gateway でメソッドレスポンスをセットアップする
<a name="api-gateway-method-settings-method-response"></a>

API メソッドレスポンスは、クライアントが受信する API メソッドリクエストの出力をカプセル化します。出力データには、HTTP ステータスコード、一部のヘッダー、さらに場合によっては本文が含まれます。

非プロキシ統合を使用すると、指定されたレスポンスパラメータと本文は、関連する統合レスポンスデータからマッピングできます。また、マッピングに従って特定の静的な値を割り当てることができます。これらのマッピングは統合レスポンスで指定されています。マッピングは、そのままで統合レスポンスを通過する同一の変換になることがあります。

プロキシ統合により、API Gateway はバックエンドレスポンスを自動的にメソッドレスポンスにパスします。API メソッドレスポンスをセットアップする必要はありません。ただし、Lambda プロキシ統合の場合、Lambda 関数は API Gateway 用に[この出力形式](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-output-format)で結果を返し、統合レスポンスをメソッドレスポンスにマッピングする必要があります。

プログラム上、メソッドレスポンスのセットアップは、API Gateway の [MethodResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html) リソースの作成および [statusCode](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#statusCode)、[responseParameters](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#responseParameters)、[responseModels](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#responseModels) のプロパティの設定を意味します。

API メソッドにステータスコードを設定する場合、予期せぬステータスコードのあらゆる統合レスポンスを処理するためのデフォルト設定を 1 つ選択する必要があります。これはキャスティングやマッピングされないサーバー側エラーのレスポンスになるため、デフォルトとして `500` を設定することが合理的です。ここでは説明のために、API Gateway コンソールはデフォルトとして `200` レスポンスを設定しています。しかし、これは `500` レスポンスにリセットできます。

メソッドレスポンスを設定するには、先にメソッドリクエストを作成している必要があります。

## メソッドレスポンスステータスコードをセットアップする
<a name="setup-method-response-status-code"></a>

メソッドレスポンスのステータスコードは、レスポンスのタイプを定義します。たとえば、200、400、500 のレスポンスは、それぞれ正常なクライアント側エラーレスポンスを示します。

メソッドレスポンスステータスコードをセットアップするには、[https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#statusCode](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#statusCode) プロパティを HTTP ステータスコードに設定します。次の [put-method-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method-response.html) コマンドは、`200` メソッドレスポンスを作成します。

```
aws apigateway put-method-response \
    --rest-api-id vaz7da96z6 \ 
    --resource-id 6sxz2j \
    --http-method GET \
    --status-code 200
```

## メソッドレスポンスパラメータをセットアップする
<a name="setup-method-response-parameters"></a>

メソッドレスポンスパラメータは、関連するメソッドリクエストへのレスポンスとしてクライアントが受信するヘッダーを定義します。レスポンスパラメータは、API Gateway が API メソッドの統合レスポンスに示されたマッピングに応じて統合レスポンスパラメータをマッピングするターゲットも指定します。

メソッドレスポンスパラメータをセットアップするには、`responseParameters` 形式の `MethodResponse` キー値のペアの [https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#responseParameters](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#responseParameters) マップに追加します。次の [put-method-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method-response.html) コマンドは、`my-header` ヘッダーを設定します。

```
aws apigateway put-method-response \
        --rest-api-id vaz7da96z6 \
        --resource-id 6sxz2j \
        --http-method GET \
        --status-code 200  \
        --response-parameters method.response.header.my-header=false
```

## メソッドレスポンスモデルをセットアップする
<a name="setup-method-response-models"></a>

 

 メソッドレスポンスモデルは、メソッドレスポンス本文の形式を定義します。メソッドレスポンスモデルのセットアップは、API のために厳密に型指定された SDK を作成する際に必要です。これにより、出力が Java や Objective-C の適切なクラスに確実にキャストされるようになります。それ以外の場合は、モデルの設定はオプションです。

レスポンスモデルを設定する前に、API Gateway でモデルを作成する必要があります。そのために、`[create-model](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-model.html)` コマンドを呼び出すことができます。次の [create-model](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-model.html) コマンドは、`GET /pets/{petId}` メソッドリクエストへのレスポンスの本文を記述する `PetStorePet` モデルを作成します。

```
aws apigateway create-model \
    --rest-api-id vaz7da96z6 \
    --content-type application/json \
    --name PetStorePet \
    --schema '{ \
                  "$schema": "http://json-schema.org/draft-04/schema#", \
                  "title": "PetStorePet", \
                  "type": "object", \
                  "properties": { \
                    "id": { "type": "number" }, \
                    "type": { "type": "string" }, \
                    "price": { "type": "number" } \
                  } \
              }'
```

結果は、API Gateway [https://docs.aws.amazon.com/apigateway/latest/api/API_Model.html](https://docs.aws.amazon.com/apigateway/latest/api/API_Model.html) リソースとして作成されます。

メソッドレスポンスモデルをセットアップしてペイロード形式を定義するには、"application/json":"PetStorePet" キー値のペアを [https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html) リソースの [https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#responseModels](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#responseModels) マップに追加します。次の [put-method-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method-response.html) コマンドは、レスポンスモデルを使用してペイロード形式を定義するメソッドレスポンスを作成します。

```
aws apigateway put-method-response \
    --rest-api-id vaz7da96z6 \
    --resource-id 6sxz2j \
    --http-method GET \
    --status-code 200  \
    --response-parameters method.response.header.my-header=false \
    --response-models '{"application/json":"PetStorePet"}'
```

# API Gateway コンソールを使用してメソッドをセットアップする
<a name="how-to-set-up-method-using-console"></a>

REST API コンソールを使用してメソッドを作成する場合、統合リクエストとメソッドリクエストの両方を設定します。デフォルトでは、API Gateway はメソッドの `200` メソッドレスポンスを作成します。

以下の手順では、メソッドリクエスト設定を編集する方法と、メソッドに追加のメソッドレスポンスを作成する方法を示します。

**Topics**
+ [

## API Gateway コンソールで API Gateway メソッドリクエストを編集する
](#how-to-method-settings-callers-console)
+ [

## API Gateway コンソールで API Gateway メソッドレスポンスをセットアップする
](#how-to-method-response-settings-console)

## API Gateway コンソールで API Gateway メソッドリクエストを編集する
<a name="how-to-method-settings-callers-console"></a>

 以下の手順では、メソッドリクエストを作成済みであることを前提としています。メソッドの作成方法の詳細については、「[API Gateway コンソールを使用して API 統合リクエストを設定する](how-to-method-settings-console.md)」を参照してください。

1. **[リソース]** ペインで、メソッドを選択し、**[メソッドリクエスト]** タブを選択します。

1. **[メソッドリクエストの設定]** セクションで、**[編集]** を選択します。

1. **[承認]** で、使用可能なオーソライザーを選択します。

   1. すべてのユーザーでメソッドへのオープンアクセスを有効化するには、**[なし]** を選択します。デフォルト設定が変更されていない場合、このステップはスキップできます。

   1. IAM アクセス許可を使用してメソッドへのクライアントアクセスを制御するには、[`AWS_IAM`] を選択します。これを選択した場合、適切な IAM ポリシーがアタッチされた IAM ロールのユーザーのみがこのメソッドを呼び出すことができます。

      IAM ロールを作成するには、以下のような形式のアクセスポリシーを指定します。

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "execute-api:Invoke"
            ],
            "Resource": [
              "arn:aws:execute-api:us-east-1:111111111111:aaabbb/*/GET/"
            ]
          }
        ]
      }
      ```

------

      このアクセスポリシーにおいて、`arn:aws:execute-api:us-east-1:111111111111:aaabbb/*/GET/` はメソッドの ARN です。メソッドの ARN は、**[リソース]** ページでメソッドを選択することで確認できます。これらの IAM アクセス許可の詳細については、「[IAM アクセス許可を使用して REST API へのアクセスを制御する](permissions.md)」を参照してください。

      IAM ロールを作成するには、チュートリアル「[Lambda 非プロキシ統合用の Lambda 関数の作成](getting-started-lambda-non-proxy-integration.md#getting-started-new-lambda)」の手順を応用できます。

   1.  Lambda オーソライザーを使用するには、トークンまたはリクエストオーソライザーを選択します。この選択肢をドロップダウンメニューに表示するには、Lambda オーソライザーを作成します。Lambda オーソライザーの詳細な作成方法については、「[API Gateway Lambda オーソライザーを使用する](apigateway-use-lambda-authorizer.md)」を参照してください。

   1.  Amazon Cognito ユーザープールを使用するには、[**Cognito ユーザープールオーソライザー**] で使用可能なユーザープールを選択します。この選択をドロップダウンメニューに表示するには、Amazon Cognito でユーザープールを作成し、API Gateway で Amazon Cognito ユーザープールオーソライザーを作成します。Amazon Cognito ユーザープール認証の作成方法については、「[Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する](apigateway-integrate-with-cognito.md)」を参照してください。

1.  リクエスト検証を指定するには、**[リクエストの検証]** ドロップダウンメニューから値を選択します。リクエスト検証を無効にするには、**[なし]** を選択します。各オプションの詳細については、「[API Gateway での REST API のリクエスト検証](api-gateway-method-request-validation.md)」を参照してください。

1. **[API キーの必要性]** を選択すると、API キーを要求できるようになります。有効にすると、API キーは[使用量プラン](api-gateway-api-usage-plans.md)で使用され、クライアントトラフィックを絞り込みます。

1. (オプション) API Gateway で生成されたこの API の Java SDK にオペレーション名を割り当てるには、**[オペレーション名]** に名前を入力します。たとえば、`GET /pets/{petId}` のメソッドリクエストでは、対応する Java SDK のオペレーション名は、デフォルトで `GetPetsPetId` です。この名前はメソッドの HTTP 動詞 (`GET`) とリソースパスの変数名 (`Pets` と `PetId`) から構成されています。オペレーション名を `getPetById` に設定した場合、SDK オペレーション名は `GetPetById` になります。

1. クエリ文字列パラメータをメソッドに追加するには、以下の操作を実行します。

   1. **[URL クエリ文字列パラメータ]** を選択してから、**[クエリ文字列の追加]** を選択します。

   1. **[名前]** に、クエリ文字列パラメータの名前を入力します。

   1. 新しく作成されたクエリ文字列パラメータがリクエスト検証に使用される場合は、**[必須]** を選択します。リクエスト検証の詳細については、「[API Gateway での REST API のリクエスト検証](api-gateway-method-request-validation.md)」を参照してください。

   1. 新しく作成されたクエリ文字列パラメータがキャッシングキーの一部として使用される場合は、**[キャッシュ]** を選択します。キャッシングの詳細については、「[メソッドパラメータまたは統合パラメータをキャッシュキーとして使用して、キャッシュされたレスポンスにインデックスを付ける](api-gateway-caching.md#enable-api-gateway-cache-keys)」を参照してください。

   クエリ文字列パラメータを削除するには、**[削除]** を選択します。

1. メソッドにヘッダーパラメータを追加するには、以下の操作を実行します。

   1. **[HTTP リクエストヘッダー]** を選択した後、**[ヘッダーの追加]** を選択します。

   1. **[名前]** に、ヘッダーの名前を入力します。

   1. 新しく作成されたヘッダーがリクエスト検証に使用される場合は、**[必須]** を選択します。リクエスト検証の詳細については、「[API Gateway での REST API のリクエスト検証](api-gateway-method-request-validation.md)」を参照してください。

   1. 新しく作成されたヘッダーがキャッシングキーの一部として使用される場合は、**[キャッシュ]** を選択します。キャッシングの詳細については、「[メソッドパラメータまたは統合パラメータをキャッシュキーとして使用して、キャッシュされたレスポンスにインデックスを付ける](api-gateway-caching.md#enable-api-gateway-cache-keys)」を参照してください。

   ヘッダーを削除するには、**[削除]** を選択します。

1.  `POST`、`PUT`、または `PATCH` HTTP 動詞でメソッドリクエストのペイロード形式を宣言するには、**[リクエスト本文]** を選択して以下を実行します。

   1. [**モデルの追加**] を選択します。

   1. **[コンテンツタイプ]** に MIME タイプ (`application/json` など) を入力します。

   1. **[モデル]** では、ドロップダウンメニューからモデルを選択します。API で現在使用可能なモデルには、すでに作成して API の [[モデル](https://docs.aws.amazon.com/apigateway/latest/api/API_Model.html)] コレクションに追加しているモデルに加え、デフォルトの `Empty` および `Error` モデルが含まれます。モデル作成についての詳細は、[REST API のデータモデル](models-mappings-models.md) を参照してください。
**注記**  
 モデルはペイロードの予測されるデータ形式をクライアントに通知するのに便利です。スケルトンベースのマッピングテンプレートを作成するのに役立ちます。API の厳密に型指定された SDK を Java、C\$1、Objective-C、および Swift などの言語で作成することが重要です。ペイロードに対するリクエスト検証が有効になっている場合にのみ必要です。

1. **[保存]** を選択します。

## API Gateway コンソールで API Gateway メソッドレスポンスをセットアップする
<a name="how-to-method-response-settings-console"></a>

 API メソッドには、1 つ以上のレスポンスを含めることができます。各レスポンスは HTTP ステータスコードでインデックス作成されます。デフォルトでは、API Gateway コンソールはメソッドレスポンスに `200` レスポンスを追加します。たとえばこれを修正し、メソッドが `201` を返すように設定できます。アクセス拒否の `409`や、初期化されていないステージ変数が使用されている場合の `500` など、その他のレスポンスを追加することもできます。

 API Gateway コンソールを使用してレスポンスを変更、削除、または API メソッドに追加するには、次の手順に従います。

1. **[リソース]** ペインで、メソッドを選択し、**[メソッドレスポンス]** タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

1. **[メソッドレスポンスの設定]** セクションで、**[レスポンスを作成]** を選択します。

1. **[HTTP ステータスコード]** には、`200`、`400`、または `500` などの HTTP ステータスコードを入力します。

    バックエンドが返したレスポンスに対応するメソッドレスポンスが定義されていない場合、API Gateway はクライアントにレスポンスを返しません。代わりに、`500 Internal server error` エラーレスポンスを返します。

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

1.  **[ヘッダー名]** に名前を入力します。

    バックエンドからクライアントにヘッダーを返すには、メソッドレスポンスにヘッダーを追加します。

1.  **[モデルを追加]** を選択して、メソッドレスポンス本文の形式を定義します。

   **[コンテンツタイプ]** にレスポンスペイロードのメディアタイプを入力し、**[モデル]** ドロップダウンメニューからモデルを選択します。

1. **[保存]** を選択します。

既存のレスポンスを変更するには、メソッドレスポンスに移動し、**[編集]** を選択します。**HTTP ステータスコード**を変更するには、**[削除]** を選択し、新しいメソッドレスポンスを作成します。

バックエンドから返されたすべてのレスポンスで、互換性のあるレスポンスをメソッドレスポンスとして設定する必要があります。ただし、バックエンドの結果がクライアントに返される前にメソッドレスポンスにマッピングされない場合を除き、メソッドレスポンスのヘッダーとペイロードモデルの設定はオプションです。API のために厳密に型指定された SDK を作成している場合は、メソッドレスポンスペイロードモデルも重要です。

# API Gateway で REST API へのアクセスを制御および管理する
<a name="apigateway-control-access-to-api"></a>

API Gateway は API へのアクセスを制御し管理する複数のメカニズムをサポートしています。

認証と認可に次のメカニズムを使用することができます。
+ **リソースポリシー**を使用して、特定のソース IP アドレスまたは VPC エンドポイントから、API およびメソッドへのアクセスを許可、または拒否するリソースベースのポリシーを作成できます。詳細については、「[API Gateway リソースポリシーを使用して REST API へのアクセスを制御する](apigateway-resource-policies.md)」を参照してください。
+ **標準 AWS IAM ロールとポリシー**は、API 全体または個々のメソッドに適用できる柔軟で堅牢なアクセスコントロールを提供します。IAM ロールとポリシーを使用して、API を作成および管理できるユーザーと、API を呼び出すことができるユーザーを制御できます。詳細については、「[IAM アクセス許可を使用して REST API へのアクセスを制御する](permissions.md)」を参照してください。
+ **IAM タグ**は、アクセスをコントロールするために、IAM ポリシーと共に使用できます。詳細については、「[タグを使用して API Gateway REST API リソースへのアクセスをコントロールする](apigateway-tagging-iam-policy.md)」を参照してください。
+ **インターフェイス VPC エンドポイント用のエンドポイントポリシー** では、 IAM リソースポリシーをインターフェイス VPC エンドポイントにアタッチして、[プライベート API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html) のセキュリティを向上させることができます。詳細については、「[API Gateway でプライベート API 用の VPC エンドポイントポリシーを使用する](apigateway-vpc-endpoint-policies.md)」を参照してください。
+ **Lambda オーソライザー**は、ヘッダー、パス、クエリ文字列、ステージ変数、コンテキスト変数のリクエストパラメータで記述される情報と同様に、べアラートークン認証を使用して REST API メソッドへのアクセスを制御する Lambda 関数です。Lambda 認証は、REST API メソッドを呼び出すことができるユーザーを制御するために使用されます。詳細については、「[API Gateway Lambda オーソライザーを使用する](apigateway-use-lambda-authorizer.md)」を参照してください。
+ **Amazon Cognito ユーザープール**を使用して、REST API に関するカスタマイズ可能な認証と認可のソリューションを作成できます。Amazon Cognito ユーザープールは、REST API メソッドを呼び出すことができるユーザーを制御するために使用されます。詳細については、「[Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する](apigateway-integrate-with-cognito.md)」を参照してください。

アクセスコントロールに関連する他のタスクを実行するために、以下のメカニズムを使用できます。
+ **Cross-Origin Resource Sharing (CORS)** を使用して、クロスドメインのリソースリクエストへの REST API の応答を制御できます。詳細については、「[API Gateway での REST API の CORS](how-to-cors.md)」を参照してください。
+ **クライアント側 SSL 証明書**を使用して、バックエンドシステムへの HTTP リクエストが API Gateway からのものであることを確認します。詳細については、「[API Gateway のバックエンド認証用 SSL 証明書の生成と設定](getting-started-client-side-ssl-authentication.md)」を参照してください。
+ **AWS WAF** を使用して、API Gateway API を一般的なウェブの脆弱性から保護することができます。詳細については、「[AWS WAF を使用して API Gateway の REST API を保護する](apigateway-control-access-aws-waf.md)」を参照してください。

次のメカニズムを使用して、承認済みクライアントに付与したアクセス許可を追跡して制限できます。
+ **使用量プラン**によって、顧客に **API キー**を提供でき、各 API キーの API ステージとメソッドの使用状況を追跡および制限できます。詳細については、「[API Gateway での REST API の使用量プランと API キー](api-gateway-api-usage-plans.md)」を参照してください。

# API Gateway リソースポリシーを使用して REST API へのアクセスを制御する
<a name="apigateway-resource-policies"></a>

Amazon API Gateway の*リソースポリシー*は、JSON ポリシードキュメントです。指定されたプリンシパル (通常、IAM ロールまたはグループ) で API を呼び出せるかどうかにかかわらず、制御する API にアタッチします。API Gateway リソースポリシーを使用すると、API を以下から安全に呼び出すことができます。
+ 指定された AWS アカウントのユーザー
+ 指定されたソース IP アドレス範囲または CIDR ブロック
+ 指定された Virtual Private Cloud (VPC) または VPC エンドポイント (任意のアカウント)

リソースポリシーを API Gateway の API エンドポイントタイプにアタッチするには、AWS マネジメントコンソール、AWS CLI、または AWS SDK を使用できます。[プライベート API ](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html)の場合は、リソースポリシーを VPC エンドポイントポリシーとともに使用して、どのプリンシパルがどのリソースやアクションにアクセスできるかを制御することができます。詳細については、「[API Gateway でプライベート API 用の VPC エンドポイントポリシーを使用する](apigateway-vpc-endpoint-policies.md)」を参照してください。

 API Gateway リソースポリシーは、IAM アイデンティティベースのポリシーとは異なります。IAM アイデンティティベースのポリシーは、IAM ユーザー、グループ、またはロールにアタッチされ、実行できるアクションとリソースを定義します。API Gateway リソースポリシーはリソースにアタッチされます。API Gateway リソースポリシーは、IAM ポリシーと組み合わせて使用できます。詳細については、「[アイデンティティベースのポリシーおよびリソースベースのポリシー](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)」を参照してください。

**Topics**
+ [

# Amazon API Gateway のアクセスポリシー言語の概要
](apigateway-control-access-policy-language-overview.md)
+ [

# API Gateway リソースポリシーが認可ワークフローに与える影響
](apigateway-authorization-flow.md)
+ [

# API Gateway リソースポリシーの例
](apigateway-resource-policies-examples.md)
+ [

# API Gateway リソースポリシーを作成して API にアタッチする
](apigateway-resource-policies-create-attach.md)
+ [

# AWSAPI Gateway リソースポリシーで使用できる の条件キー
](apigateway-resource-policies-aws-condition-keys.md)

# Amazon API Gateway のアクセスポリシー言語の概要
<a name="apigateway-control-access-policy-language-overview"></a>

このページでは、Amazon API Gateway リソースポリシーで使用される基本的な要素について説明します。

リソースポリシーは、IAM ポリシーと同じ構文を使用して指定されます。ポリシー言語の詳細については、*IAM ユーザーガイド*の「[IAM ポリシーの概要](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)」と「[AWS Identity and Access Management ポリシーリファレンス](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)」を参照してください。

指定されたリクエストを AWS のサービスが許可または拒否する方法については、「[リクエストの許可または拒否を決定する](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)」を参照してください。

## アクセスポリシーの一般的なエレメント
<a name="apigateway-common-elements-in-an-access-policy"></a>

基本的に、リソースポリシーには以下のエレメントが含まれます。
+ **リソース** – アクセス許可を許可または拒否できる Amazon API Gateway のリソースが API です。ポリシーでは、Amazon リソースネーム (ARN) を使用して、リソースを識別します。略式構文を使用することもできます。この構文はリソースポリシーの保存時に API Gateway によって完全な ARN に自動的に展開されます。詳細については、「[API Gateway リソースポリシーの例](apigateway-resource-policies-examples.md)」を参照してください。

  完全な `Resource` 要素の形式については、「[API Gateway で API を実行するためのアクセス許可のリソース形式](api-gateway-control-access-using-iam-policies-to-invoke-api.md#api-gateway-iam-policy-resource-format-for-executing-api)」を参照してください。
+ **アクション** – Amazon API Gateway により、リソースごとに一連のオペレーションがサポートされています。許可 (または拒否) するリソースのオペレーションは、アクションキーワードを使用して識別します。

  たとえば、`execute-api:Invoke` アクセス権限は、クライアントリクエスト時の API の呼び出しをユーザーに許可します。

  `Action` エレメントの形式については、「[API Gateway で API を実行するためのアクセス許可のアクション形式](api-gateway-control-access-using-iam-policies-to-invoke-api.md#api-gateway-iam-policy-action-format-for-executing-api)」を参照してください。
+ **エフェクト** – ユーザーが特定のアクションをリクエストする際のエフェクト – 値は `Allow` または `Deny` のいずれかになります。また、明示的にリソースへのアクセスを拒否すると、別のポリシーによってアクセスが許可されている場合でも、ユーザーはそのリソースにアクセスできなくなります。
**注記**  
「暗黙的な拒否」は、「デフォルトでは拒否」と同じ意味です。  
「暗黙的な拒否」は「明示的な拒否」とは異なります。詳細については、「[デフォルトによる拒否と明示的な拒否の違い](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#AccessPolicyLanguage_Interplay)」を参照してください。
+ **プリンシパル** – ステートメントのアクションやリソースへのアクセスが許可されているアカウントまたはユーザーを指します。リソースポリシーでは、プリンシパルは、このアクセス許可を受け取るユーザーまたはアカウントを指します。

以下のリソースポリシーの例は、前の一般的なポリシーのエレメントを示しています。このポリシーは、指定した*リージョン*で指定した *account-id* の API へのアクセスを、送信元 IP アドレスがアドレスブロック *123.4.5.6/24* にあるすべてのユーザーに許可します。このポリシーでは、ユーザーの送信元 IP がこの範囲外の場合、API へのアクセスはすべて拒否されます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:*"
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "123.4.5.6/24"
                }
            }
        }
    ]
}
```

------

# API Gateway リソースポリシーが認可ワークフローに与える影響
<a name="apigateway-authorization-flow"></a>

API にアタッチされたリソースポリシーを API Gateway が評価すると、以降のセクションのフローチャートに示すように、結果は API に対して定義した認証タイプによって影響を受けます。

**Topics**
+ [

## API Gateway リソースポリシーのみ
](#apigateway-authorization-flow-resource-policy-only)
+ [

## Lambda オーソライザーとリソースポリシー
](#apigateway-authorization-flow-lambda)
+ [

## IAM 認証とリソースポリシー
](#apigateway-authorization-flow-iam)
+ [

## Amazon Cognito 認証とリソースポリシー
](#apigateway-authorization-flow-cognito)
+ [

## ポリシー評価の結果のテーブル
](#apigateway-resource-policies-iam-policies-interaction)

## API Gateway リソースポリシーのみ
<a name="apigateway-authorization-flow-resource-policy-only"></a>

このワークフローでは、API Gateway リソースポリシーは API にアタッチされますが、認証タイプは API に対して定義されません。ポリシーの評価により、発信者のインバウンド条件に基づいて、明示的な許可の検索が呼び出されます。暗黙的な拒否または明示的な拒否により、発信者が拒否されます。

![\[リソースポリシーの承認フローのみ。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/apigateway-auth-resource-policy-only.png)


以下に、このようなリソースポリシーの例を示します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:api-id/",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
                }
            }
        }
    ]
}
```

------

## Lambda オーソライザーとリソースポリシー
<a name="apigateway-authorization-flow-lambda"></a>

このワークフローでは、Lambda オーソライザーはリソースポリシーに加えて API に対して設定されます。リソースポリシーは 2 つの段階で評価されます。Lambda オーソライザーを呼び出す前に、API Gateway はまずポリシーを評価し、明示的な拒否をチェックします。見つかった場合、呼び出し元は即座にアクセスを拒否されます。それ以外の場合、Lambda オーソライザーが呼び出され、[ポリシードキュメント](api-gateway-lambda-authorizer-output.md)を返します。これはリソースポリシーと一緒に評価されます。オーソライザーがキャッシュを使用する場合、API Gateway はキャッシュされたポリシードキュメントを返すことがあります。結果は、[[テーブル A]](#apigateway-resource-policies-iam-policies-interaction) に基づいて決定されます。

次のリソースポリシー例では、VPC エンドポイント ID が `vpce-1a2b3c4d` である VPC エンドポイントからのみ、呼び出しを許可します。認証前の評価中は、下例の VPC エンドポイントからの呼び出しのみが、Lambda オーソライザーを評価することを許可されます。残りの呼び出しはすべてブロックされます。この認可ワークフローは、プライベート API にカスタムドメイン名を使用する場合も同じです。

![\[リソースポリシーと Lambda オーソライザーの承認フロー。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/apigateway-auth-lambda-resource-policy.png)


------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:us-east-1:111111111111:api-id/"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-1a2b3c4d"
                }
            }
        }
    ]
}
```

------

## IAM 認証とリソースポリシー
<a name="apigateway-authorization-flow-iam"></a>

このワークフローでは、リソースポリシーに加えて API に対して IAM 認証を設定します。IAM サービスを使用してユーザーを認証した後、API は、ユーザーにアタッチされたポリシーとリソースポリシーの両方を評価します。この結果は、発信者が API 所有者と同じ AWS アカウント にいるか、API 所有者とは別の AWS アカウント にいるかに応じて異なります。

呼び出し元と API 所有者が別のアカウントである場合、IAM ポリシーとリソースポリシーの両方により、呼び出し元は明示的に続行が許可されます 詳細については、[[テーブル B]](#apigateway-resource-policies-iam-policies-interaction) を参照してください。

ただし、呼び出し元および API 所有者が同じ AWS アカウント である場合、IAM ユーザーポリシーまたはリソースポリシーで、呼び出し元の続行を明示的に許可する必要があります 詳細については、[[テーブル A]](#apigateway-resource-policies-iam-policies-interaction) を参照してください。

![\[リソースポリシーと IAM 認証の認可フロー。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/apigateway-auth-iam-resource-policy.png)


以下に、クロスアカウントリソースポリシーの例を示します。このリソースポリシーでは、IAM ポリシーに Allow Effect が含まれていることを想定し、VPC ID が `vpc-2f09a348` である VPC からの呼び出しのみが許可されます。詳細については、[[テーブル B]](#apigateway-resource-policies-iam-policies-interaction) を参照してください。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:us-east-1:111111111111:api-id/"
            ],
            "Condition" : {
                "StringEquals": {
                    "aws:SourceVpc": "vpc-2f09a348"
                    }
            }
        }
    ]
}
```

------

## Amazon Cognito 認証とリソースポリシー
<a name="apigateway-authorization-flow-cognito"></a>

このワークフローでは、リソースポリシーに加えて、API 用に [Amazon Cognito ユーザープール](apigateway-integrate-with-cognito.md)が設定されます。API Gateway は、最初に Amazon Cognito を介して発信者の認証を試みます。これは通常、発信者から提供された [JWT トークン](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)を介して実行されます。認証が成功した場合、リソースポリシーは個別に評価され、明示的な許可が必要です。拒否の場合は拒否になり、「許可も拒否もしない」でも拒否になります。Amazon Cognito ユーザープールと一緒に使用される可能性のあるリソースポリシーの例を以下に示します。

![\[リソースポリシーと Amazon Cognito オーソライザーの承認フロー。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/apigateway-auth-cognito-resource-policy.png)


次の例では、指定されたソース IP からのみ呼び出しを許可するリソースポリシーの例を示します。Amazon Cognito 認証トークンには許可が含まれていると想定します 詳細については、[[テーブル B]](#apigateway-resource-policies-iam-policies-interaction) を参照してください。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:111111111111:api-id/",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
                }
            }
        }
    ]
}
```

------

## ポリシー評価の結果のテーブル
<a name="apigateway-resource-policies-iam-policies-interaction"></a>

テーブル A に結果の動作が表示されるのは、API Gateway API へのアクセスが IAM ポリシーによって制御されているか、同じ AWS アカウント 内にある Lambda オーソライザーと API Gateway リソースポリシーによって制御されている場合です。


| **IAM ポリシー (または Lambda オーソライザー)** | **API Gateway リソースポリシー** | **結果として生じる動作** | 
| --- | --- | --- | 
| 許可 | 許可 | 許可 | 
| 許可 | 許可も拒否もしない | 許可 | 
| 許可 | 拒否 | 明示的な拒否 | 
| 許可も拒否もしない | 許可 | 許可 | 
| 許可も拒否もしない | 許可も拒否もしない | 暗黙的な拒否 | 
| 許可も拒否もしない | 拒否 | 明示的な拒否 | 
| 拒否 | 許可 | 明示的な拒否 | 
| 拒否 | 許可も拒否もしない | 明示的な拒否 | 
| 拒否 | 拒否 | 明示的な拒否 | 

テーブル B に結果の動作が表示されるのは、API Gateway API へのアクセスが IAM ポリシーによって制御されているか、異なる AWS アカウント 内にある Amazon Cognito ユーザープールオーソライザーと API Gateway リソースポリシーによって制御されている場合です。どちらかがサイレントである (許可でも拒否でもない) 場合、クロスアカウントアクセスは拒否されます。これは、クロスアカウントアクセスでは、リソースポリシーと IAM ポリシーの両方、または Amazon Cognito ユーザープールオーソライザーが明示的にアクセス権を付与する必要があるためです。


| **IAM ポリシー (または Amazon Cognito ユーザープールオーソライザー)** | **API Gateway リソースポリシー** | **結果として生じる動作** | 
| --- | --- | --- | 
| 許可 | 許可 | 許可 | 
| 許可 | 許可も拒否もしない | 暗黙的な拒否 | 
| 許可 | 拒否 | 明示的な拒否 | 
| 許可も拒否もしない | 許可 | 暗黙的な拒否 | 
| 許可も拒否もしない | 許可も拒否もしない | 暗黙的な拒否 | 
| 許可も拒否もしない | 拒否 | 明示的な拒否 | 
| 拒否 | 許可 | 明示的な拒否 | 
| 拒否 | 許可も拒否もしない | 明示的な拒否 | 
| 拒否 | 拒否 | 明示的な拒否 | 

# API Gateway リソースポリシーの例
<a name="apigateway-resource-policies-examples"></a>

このページでは、API Gateway リソースポリシーの一般的なユースケースの例をいくつか紹介します。

以下のポリシー例では、API リソースの指定に略式構文を使用しています。この略式構文では、完全な Amazon リソースネーム (ARN) を指定する代わりに、簡略化された方法を使用して API リソースを参照できます。API Gateway がポリシーを保存するとき、簡略化された構文を完全な ARN に変換します。たとえば、リソースポリシー `execute-api:/stage-name/GET/pets` でリソースを指定できます。API Gateway がリソースポリシーを保存する際に、リソースを `arn:aws:execute-api:us-east-2:123456789012:aabbccddee/stage-name/GET/pets` に変換します。API Gateway は、現在のリージョン、AWS アカウント ID、およびリソースポリシーが関連付けられている REST API の ID を使用して、完全な ARN を構築します。`execute-api:/*` を使用して、現在の API のすべてのステージ、メソッド、パスを表すことができます。アクセスポリシー言語の詳細については、「[Amazon API Gateway のアクセスポリシー言語の概要](apigateway-control-access-policy-language-overview.md)」を参照してください。

**Topics**
+ [

## 例: 別の AWS アカウントのロールによる API の使用を許可する
](#apigateway-resource-policies-cross-account-example)
+ [

## 例: 送信元の IP アドレスまたは IP アドレスの範囲に基づき、API トラフィックを拒否する
](#apigateway-resource-policies-source-ip-address-example)
+ [

## 例: プライベート API の使用時に、送信元 IP アドレスまたは範囲に基づいて API トラフィックを拒否する
](#apigateway-resource-policies-source-ip-address-vpc-example)
+ [

## 例: ソース VPC または VPC エンドポイントに基づいてプライベート API トラフィックを許可する
](#apigateway-resource-policies-source-vpc-example)

## 例: 別の AWS アカウントのロールによる API の使用を許可する
<a name="apigateway-resource-policies-cross-account-example"></a>

次のリソースポリシーの例は、[Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html) (SigV4) または [Signature Version 4a](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html#how-sigv4a-works) (SigV4a) プロトコルを使用して、1 つの AWS アカウントの API アクセス権を異なる AWS アカウントの 2 つのロールに付与します。具体的には、`account-id-2` によって識別される AWS アカウントのデベロッパーおよび管理者ロールでは、AWS アカウントの `pets` リソース (API) に対して `GET` アクションを実行する `execute-api:Invoke` アクションが許可されます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:role/developer",
                    "arn:aws:iam::111122223333:role/Admin"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/stage/GET/pets"
            ]
        }
    ]
}
```

------

## 例: 送信元の IP アドレスまたは IP アドレスの範囲に基づき、API トラフィックを拒否する
<a name="apigateway-resource-policies-source-ip-address-example"></a>

以下のリソースポリシーの例は、指定された 2 つの送信元 IP アドレスブロックから API への受信トラフィックを拒否 (ブロック) します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
               "execute-api:/*"
            ],
            "Condition" : {
                "IpAddress": {
                    "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ]
                }
            }
        }
    ]
}
```

------

IAM ユーザーポリシーまたは API Gateway リソースポリシーを使用して API Gateway または API Gateway API へのアクセスを制御する場合、IPv6 アドレスの範囲が含まれるようにポリシーが更新されていることを確認します。IPv6 アドレスを処理するようにポリシーが更新されていない場合、デュアルスタックエンドポイントの使用が開始されると、API Gateway へのクライアントのアクセスが影響を受ける可能性があります。詳細については、「[IAM ポリシーでの IPv6 アドレスの使用](api-ref.md#api-reference-service-endpoints-dualstack-iam)」を参照してください。

## 例: プライベート API の使用時に、送信元 IP アドレスまたは範囲に基づいて API トラフィックを拒否する
<a name="apigateway-resource-policies-source-ip-address-vpc-example"></a>

次のリソースポリシーの例は、指定された 2 つの送信元 IP アドレスブロックからプライベート API への受信トラフィックを拒否 (ブロック) します。プライベート API を使用する場合、`execute-api` の VPC エンドポイントは元のソース IP アドレスを 書き換えます。`aws:VpcSourceIp` 条件は、元のリクエスタ IP アドレスに対してリクエストをフィルタリングします。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
               "execute-api:/*"
            ],
            "Condition" : {
                "IpAddress": {
                    "aws:VpcSourceIp": ["192.0.2.0/24", "198.51.100.0/24"]
                }
            }
        }
    ]
}
```

------

## 例: ソース VPC または VPC エンドポイントに基づいてプライベート API トラフィックを許可する
<a name="apigateway-resource-policies-source-vpc-example"></a>

次のリソースポリシーの例では、指定された Virtual Private Cloud (VPC) または VPC エンドポイントからのみ、プライベート API への受信トラフィックを許可します。

このリソースポリシーの例では、ソース VPC を指定します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                   "aws:SourceVpc": "vpc-1a2b3c4d"
                }
            }
        }
    ]
}
```

------

このリソースポリシーの例では、ソース VPC エンドポイントを指定します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-1a2b3c4d"
                }
            }
        }
    ]
}
```

------

# API Gateway リソースポリシーを作成して API にアタッチする
<a name="apigateway-resource-policies-create-attach"></a>

API 実行サービスを呼び出して API にアクセスすることをユーザーに許可するには、API Gateway リソースポリシーを作成して API にアタッチする必要があります。ポリシーを API にアタッチすると、ポリシー内のアクセス許可が API のメソッドに適用されます。リソースポリシーを更新する場合は、API をデプロイする必要があります。

**Topics**
+ [

## 前提条件
](#apigateway-resource-policies-prerequisites)
+ [

## リソースポリシーを API Gateway API にアタッチする
](#apigateway-resource-policies-create-attach-procedure)
+ [

## リソースポリシーのトラブルシューティング
](#apigateway-resource-policies-troubleshoot)

## 前提条件
<a name="apigateway-resource-policies-prerequisites"></a>

 API Gateway リソースポリシーを更新するには、`apigateway:UpdateRestApiPolicy` アクセス許可と `apigateway:PATCH` アクセス許可が必要です。

エッジ最適化 API またはリージョン API の場合、リソースポリシーを作成時またはデプロイ後に API にアタッチできます。プライベート API の場合、リソースポリシーなしで API をデプロイすることはできません。詳細については、「[API Gateway のプライベート REST API](apigateway-private-apis.md)」を参照してください。

## リソースポリシーを API Gateway API にアタッチする
<a name="apigateway-resource-policies-create-attach-procedure"></a>

次の手順は、リソースポリシーを API Gateway API にアタッチする方法を示しています。

------
#### [ AWS マネジメントコンソール ]

**リソースポリシーを API Gateway API にアタッチするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. 左のナビゲーションペインで、**[リソースポリシー]** を選択します。

1. [**Create policy**] (ポリシーの作成) を選択します。

1. (オプション) **[テンプレートを選択]** を選択してサンプルポリシーを生成します。

   ポリシーの例では、プレースホルダーは、二重波括弧 (`"{{placeholder}}"`) で囲まれています。各プレースホルダー (波括弧を含む) を必要な情報に置き換えます。

1. どのテンプレート例も使用しない場合は、リソースポリシーを入力します。

1. **[Save changes]** (変更の保存) をクリックします。

API が API Gateway コンソールで以前にデプロイ済みの場合、リソースポリシーを有効にするには再デプロイする必要があります。

------
#### [ AWS CLI ]

AWS CLI を使用して新しい API を作成し、それにリソースポリシーをアタッチするには、次の [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドを使用します。

```
aws apigateway create-rest-api \
    --name "api-name" \
    --policy "{\"jsonEscapedPolicyDocument\"}"
```

AWS CLI を使用して既存の API にリソースポリシーをアタッチするには、次の [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドを使用します。

```
aws apigateway update-rest-api \
    --rest-api-id api-id \
    --patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'
```

リソースポリシーを別の `policy.json` ファイルとしてアタッチし、[create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドに含めることもできます。次の [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドは、リソースポリシーをアタッチした新しい API を作成します。

```
aws apigateway create-rest-api \
    --name "api-name" \
    --policy file://policy.json
```

`policy.json` は、API Gateway リソースポリシー ([例: 送信元の IP アドレスまたは IP アドレスの範囲に基づき、API トラフィックを拒否する](apigateway-resource-policies-examples.md#apigateway-resource-policies-source-ip-address-example) など) です。

------
#### [ AWS CloudFormation ]

CloudFormation を使用して、リソースポリシーを持つ API を作成できます。次の例では、サンプルリソースポリシー [例: 送信元の IP アドレスまたは IP アドレスの範囲に基づき、API トラフィックを拒否する](apigateway-resource-policies-examples.md#apigateway-resource-policies-source-ip-address-example) を使用して REST API を作成します。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: testapi
      Policy:
        Statement:
          - Action: 'execute-api:Invoke'
            Effect: Allow
            Principal: '*'
            Resource: 'execute-api:/*'
          - Action: 'execute-api:Invoke'
            Effect: Deny
            Principal: '*'
            Resource: 'execute-api:/*'
            Condition:
              IpAddress: 
                'aws:SourceIp': ["192.0.2.0/24", "198.51.100.0/24" ]
        Version: 2012-10-17		 	 	 
  Resource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      RestApiId: !Ref Api
      ParentId: !GetAtt Api.RootResourceId
      PathPart: 'helloworld'
  MethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref Resource
      HttpMethod: GET
      ApiKeyRequired: false
      AuthorizationType: NONE
      Integration:
        Type: MOCK
        RequestTemplates:
          application/json: '{"statusCode": 200}'
        IntegrationResponses:
          - StatusCode: 200
            ResponseTemplates:
              application/json: '{}'
      MethodResponses:
        - StatusCode: 200
          ResponseModels:
            application/json: 'Empty'
  ApiDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn:
      - MethodGet
    Properties:
      RestApiId: !Ref Api
      StageName: test
```

------

## リソースポリシーのトラブルシューティング
<a name="apigateway-resource-policies-troubleshoot"></a>

次のトラブルシューティングガイダンスは、リソースポリシーの問題を解決するのに役立ちます。

### API が \$1"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:\$1\$1\$1\$1\$1\$1\$1\$1/\$1\$1\$1\$1/\$1\$1\$1\$1/"\$1 を返します
<a name="apigateway-resource-policies-troubleshoot-auth"></a>

リソースポリシーで、プリンシパルを次のように AWS プリンシパルに設定する場合:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111111111111:role/developer",
                    "arn:aws:iam::111111111111:role/Admin"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/stage/GET/pets"
            ]
        }
    ]
}
```

------

API のすべてのメソッドに `AWS_IAM` 認可を使用する必要があります。使用しない場合、API は前のエラーメッセージを返します。メソッドの `AWS_IAM` 認可を有効にする方法の詳細については、「[API Gateway の REST API のメソッド](how-to-method-settings.md)」を参照してください。

### リソースポリシーが更新されません
<a name="apigateway-resource-policies-troubleshoot-deploy"></a>

 API 作成後にリソースポリシーを更新する場合は、更新後のポリシーをアタッチしてから API をデプロイし、変更を伝達する必要があります。ポリシーのみ、更新または保存した場合、API のランタイム動作が変更されることはありません。API のデプロイの詳細については、「[API Gateway で REST API をデプロイする](how-to-deploy-api.md)」を参照してください。

### リソースポリシーから次のエラーが返されます: 無効なポリシードキュメント。ポリシー構文を確認し、プリンシパルが有効であることを確認してください。
<a name="apigateway-resource-policies-troubleshoot-invalid-principal"></a>

このエラーのトラブルシューティングを行うには、まずポリシー構文を確認することをお勧めします。詳細については、「[Amazon API Gateway のアクセスポリシー言語の概要](apigateway-control-access-policy-language-overview.md)」を参照してください。また、指定したすべてのプリンシパルが有効であり、削除されていないことを確認することをお勧めします。

さらに、API が[オプトインリージョン](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#optinregion)にある場合は、リソースポリシー内のすべてのアカウントでリージョンが有効になっていることを確認します。

# AWSAPI Gateway リソースポリシーで使用できる の条件キー
<a name="apigateway-resource-policies-aws-condition-keys"></a>

次の表は、API Gateway で API のリソースポリシーに使用できる AWS の条件キーを認可タイプごとに示しています。

AWS の条件キーの詳細については、「[AWS グローバル条件コンテキストキー](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)」を参照してください。


| **条件キー**:  | **条件** | ** が必要ですか?`AuthN`** | **認可タイプ** | 
| --- | --- | --- | --- | 
| aws:CurrentTime | なし | いいえ | すべて | 
| aws:EpochTime | なし | いいえ | すべて | 
| aws:TokenIssueTime | キーは、一時的セキュリティ認証情報を使用して署名されているリクエストにのみ存在します。 | はい | IAM | 
| aws:MultiFactorAuthPresent | キーは、一時的セキュリティ認証情報を使用して署名されているリクエストにのみ存在します。 | はい | IAM | 
| aws:MultiFactorAuthAge | キーは、MFA がリクエストに存在する場合にのみ存在します。 | はい | IAM | 
| aws:PrincipalAccount | なし | はい | IAM | 
| aws:PrincipalArn | なし | はい | IAM | 
| aws:PrincipalOrgID | このキーは、プリンシパルが組織のメンバーである場合にのみリクエストコンテキストに含まれます。 | はい | IAM | 
| aws:PrincipalOrgPaths | このキーは、プリンシパルが組織のメンバーである場合にのみリクエストコンテキストに含まれます。 | はい | IAM | 
| aws:PrincipalTag | このキーは、プリンシパルが、タグがアタッチされた IAM ユーザーである場合にリクエストコンテキストに含まれます。これは、タグまたはセッションタグがアタッチされた IAM ロールを使用するプリンシパルのために含まれます。 | はい | IAM | 
| aws:PrincipalType | なし | はい | IAM | 
| aws:Referer | キーは、値が HTTP ヘッダーの呼び出し元によって渡されている場合にのみ存在します。 | いいえ | すべて | 
| aws:SecureTransport | なし | いいえ | すべて | 
| aws:SourceArn | なし | いいえ | すべて | 
| aws:SourceIp | なし | いいえ | すべて | 
| aws:SourceVpc | このキーはプライベート API でのみ使用できます。 | いいえ | すべて | 
| aws:SourceVpce | このキーはプライベート API でのみ使用できます。 | いいえ | すべて | 
| aws:VpcSourceIp | このキーはプライベート API でのみ使用できます。 | いいえ | すべて | 
| aws:UserAgent | キーは、値が HTTP ヘッダーの呼び出し元によって渡されている場合にのみ存在します。 | いいえ | すべて | 
| aws:userid | なし | はい | IAM | 
| aws:username | なし | はい | IAM | 

# IAM アクセス許可を使用して REST API へのアクセスを制御する
<a name="permissions"></a>

 [IAM アクセス許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html) を使用して Amazon API Gateway API へのアクセスを制御するには、次の 2 つの API Gateway コンポーネントプロセスへのアクセスを制御します。
+  API Gateway で API の作成、デプロイ、管理を行うには、API Gateway の API 管理コンポーネントでサポートされている必要なアクションを行うためのアクセス許可を API デベロッパーに付与する必要があります。
+  デプロイされた API を呼び出したり、API キャッシュを更新したりするには、API Gateway の API 実行コンポーネントでサポートされている必要な IAM アクションを行うためのアクセス許可を API の発信者に付与する必要があります。

 2 つのプロセスのアクセス制御には、以下で説明するように、異なるアクセス権限モデルが必要です。

## API を作成および管理するための API Gateway アクセス許可モデル
<a name="api-gateway-control-access-iam-permissions-model-for-managing-api"></a>

 API デベロッパーが API Gateway で API を作成および管理することを許可するには、指定した API デベロッパーが必要な [API エントリ](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html)を作成、更新、デプロイ、表示、または削除することを許可する [IAM アクセス許可ポリシーを作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)する必要があります。アクセス許可ポリシーをユーザー、ロール、またはグループにアタッチします。

アクセス権限を付与するにはユーザー、グループ、またはロールにアクセス許可を追加します。
+ AWS IAM アイデンティティセンター のユーザーとグループ:

  アクセス許可セットを作成します。「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[アクセス許可セットを作成する](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)」の手順に従ってください。
+ IAM 内で、ID プロバイダーによって管理されているユーザー:

  ID フェデレーションのロールを作成します。詳細については *IAM ユーザーガイド* の [サードパーティー ID プロバイダー (フェデレーション) 用のロールを作成する](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html) を参照してください。
+ IAM ユーザー:
  + ユーザーが担当できるロールを作成します。手順については *IAM ユーザーガイド* の [IAM ユーザーのロールの作成](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html) を参照してください。
  + (お奨めできない方法) ポリシーをユーザーに直接アタッチするか、ユーザーをユーザーグループに追加します。*IAM ユーザーガイド* の [ユーザー (コンソール) へのアクセス許可の追加](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console) の指示に従います。

アクセス権限モデルを使用する方法の詳細については、「[API Gateway のアイデンティティベースのポリシー](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies)」を参照してください。

## API を呼び出すための API Gateway アクセス許可モデル
<a name="api-gateway-control-access-iam-permissions-model-for-calling-api"></a>

API の呼び出しや API キャッシュの更新を API 発信者に許可するには、ユーザー認証が有効な API メソッドを呼び出すことを、特定の API 発信者に許可する IAM ポリシーを作成する必要があります。API デベロッパーは、メソッドの `authorizationType` プロパティを `AWS_IAM` に設定して、発信者が認証対象のユーザーの認証情報を送信することを要求します。API Gateway は、Signature Version 4a (SigV4a) と Signature Version 4 (SigV4) をサポートし、ユーザーの認証情報を認証します。詳細については、「[AWS Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)」を参照してください。次に、ユーザー、グループ、またはロールにポリシーをアタッチします。

この IAM アクセス許可ポリシーのステートメントで、IAM `Resource`エレメントには、特定の HTTP 動詞および API Gateway [リソースパス](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html)によって識別されるデプロイ API されたメソッドのリストが含まれます。IAM `Action` エレメントには、API Gateway の必要な API 実行アクションが含まれます。これらのアクションには、`execute-api:Invoke` や `execute-api:InvalidateCache` が含まれます。`execute-api` は、API Gateway の基盤となる API 実行コンポーネントを示します。

アクセス権限モデルを使用する方法の詳細については、「[API を呼び出すためのアクセスの制御](api-gateway-control-access-using-iam-policies-to-invoke-api.md)」を参照してください。

 API をバックエンドの AWS のサービス (AWS Lambda など) と統合する場合、API Gateway には、統合された AWS のリソースに API 発信者に代わってアクセスする (Lambda 関数を呼び出すなど) ための許可も必要になります。これらのアクセス許可を付与するには、**API Gateway 用の AWS のサービス**タイプの IAM ロールを作成します。IAM 管理コンソールでこのロールを作成すると、API Gateway がこのロールを引き受けることを許可された信頼されたエンティティであることを宣言する以下の IAM 信頼ポリシーがロールに含まれます。

------
#### [ JSON ]

****  

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

------

CLI の [create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html) コマンドまたは対応する SDK メソッドを呼び出して IAM ロールを作成する場合、上記の信頼ポリシーを `assume-role-policy-document` の入力パラメータとして指定する必要があります。このようなポリシーを、IAM マネジメントコンソールで直接作成、または AWS CLI [create-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/create-policy.html) コマンド、もしくは対応する SDK メソッドを呼び出して作成しないでください。

API Gateway で統合された AWS のサービスを呼び出すには、このロールに、統合された AWS のサービスを呼び出すための適切な IAM アクセス許可ポリシーもアタッチする必要があります。たとえば、Lambda 関数を呼び出すには、IAM ロールに次の IAM アクセス許可ポリシーを含める必要があります。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "*"
        }
    ]
}
```

------

Lambda がサポートするリソースベースのアクセスポリシーは、信頼ポリシーとアクセス許可ポリシーの両方を組み合わせたものです。API Gateway コンソールを使用して API を Lambda 関数と統合すると、コンソールがユーザーに代わって (ユーザーの合意を得て) Lambda 関数でリソースベースのアクセス許可を設定するため、この IAM ロールを明示的に設定することは要求されません。

**注記**  
 AWS のサービスへのアクセス制御を有効にするには、発信者ベースのアクセス許可モデルを使用して、発信者のユーザーまたはグループにアクセス許可ポリシーを直接アタッチするか、ロールベースのアクセス許可モデルを使用して、API Gateway が引き受けることができる IAM ロールにアクセス許可ポリシーをアタッチすることができます。アクセス権限ポリシーは 2 つのモデル間で異なる場合があります。たとえば、呼び出し元ベースのポリシーはアクセスをブロックしますが、ロールベースのポリシーはアクセスを許可します。この差異を利用して、ユーザーが API Gateway API 経由でのみ AWS のサービスにアクセスするよう要求できます。

# API を呼び出すためのアクセスの制御
<a name="api-gateway-control-access-using-iam-policies-to-invoke-api"></a>

このセクションでは、IAM アクセス許可を使用して API へのアクセスを制御するためのアクセス許可モデルについて説明します。IAM 認可が有効な場合、クライアントは Signature Version 4a (SigV4a) および Signature Version 4 (SigV4) を使用して、AWS 認証情報でリクエストに署名する必要があります。詳細については、「[AWS Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)」を参照してください。

このセクションでは、テンプレートの IAM ポリシーステートメントとポリシーステートメントのリファレンスを示します。ポリシーステートメントのリファレンスには、API 実行サービスに関連する `Action` フィールドと `Resource` フィールドの形式が含まれています。これらのリファレンスを使用して、IAM ポリシーステートメントを作成します。IAM ポリシーステートメントを作成するときは、API Gateway リソースポリシーが承認ワークフローにどのように影響するかを検討する必要がある場合があります。詳細については、「[API Gateway リソースポリシーが認可ワークフローに与える影響](apigateway-authorization-flow.md)」を参照してください。

プライベート API の場合、API Gateway リソースポリシーと VPC エンドポイントポリシーを組み合わせて使用する必要があります。詳細については、次のトピックを参照してください。
+ [API Gateway リソースポリシーを使用して REST API へのアクセスを制御する](apigateway-resource-policies.md)
+ [API Gateway でプライベート API 用の VPC エンドポイントポリシーを使用する](apigateway-vpc-endpoint-policies.md)

## IAM ポリシーを使用した API Gateway API メソッドの呼び出しを誰に許可するかを制御する
<a name="api-gateway-who-can-invoke-an-api-method-using-iam-policies"></a>

 デプロイされた API を IAM のアクセス許可を使用して呼び出すことを誰に許可するか誰に許可しないかを制御するには、必要なアクセス許可を設定した IAM ポリシードキュメントを作成します。そのようなポリシードキュメントのテンプレートを以下に示します。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Permission",
      "Action": [
        "execute-api:Execution-operation"           
      ],
      "Resource": [
        "arn:aws:execute-api:region:123456789012:api-id/stage/METHOD_HTTP_VERB/Resource-path"
      ]
    }
  ]
}
```

------

 この場合、含まれているアクセス許可を付与または拒否するかどうかに応じて、`Permission` は `Allow` または `Deny` に置き換えられます。`Execution-operation` は、API 実行サービスでサポートされているオペレーションに置き換えられます。`METHOD_HTTP_VERB` は、指定されたリソースによってサポートされている HTTP 動詞を表します。`Resource-path` は、`[Resource](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html)` をサポートしている、デプロイされた API `METHOD_HTTP_VERB` インスタンスの URL パスのプレースホルダーです。詳細については、「[API Gateway で API を実行するための IAM ポリシーのステートメントの参照](#api-gateway-calling-api-permissions)」を参照してください。

**注記**  
IAM ポリシーが有効になるには、API メソッドで IAM 認証を有効にしている必要があり、そのためには API メソッドの `AWS_IAM` プロパティとして `[authorizationType](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html#authorizationType)` を設定します。認証を有効にしない場合、これらの API メソッドはパブリックにアクセス可能になります。

 たとえば、指定された API で公開されているペットのリストを表示するユーザーアクセス許可を付与するものの、リストにペットを追加するユーザーアクセス許可を拒否する場合は、次のステートメントを IAM ポリシーに含めます。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "execute-api:Invoke"           
      ],
      "Resource": [
        "arn:aws:execute-api:us-east-1:111111111111:api-id/*/GET/pets"
      ]
    },
    {
      "Effect": "Deny",
      "Action": [
        "execute-api:Invoke"           
      ],
      "Resource": [
        "arn:aws:execute-api:us-east-1:111111111111:api-id/*/POST/pets"
      ]
    }
  ]
}
```

------

`GET /pets/{petId}` として設定された API によって公開されている特定のペットを表示するユーザーアクセス許可を付与するには、IAM ポリシーに以下のステートメントを含めることができます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke"
            ],
            "Resource": [
                "arn:aws:execute-api:us-east-1:111122223333:api-id/*/GET/pets/a1b2"
            ]
        }
    ]
}
```

------

## API Gateway で API を実行するための IAM ポリシーのステートメントの参照
<a name="api-gateway-calling-api-permissions"></a>

次の情報で API を実行するためのアクセス許可の IAM ポリシーステートメントのアクションおよびリソース形式について説明します。

### API Gateway で API を実行するためのアクセス許可のアクション形式
<a name="api-gateway-iam-policy-action-format-for-executing-api"></a>

API 実行の `Action` 式には、以下の一般的な形式があります。

```
execute-api:action
```

ここで、*action* は使用可能な API; 実行アクションです。
+ **\$1**。以下のすべてのアクションを表します。
+ [**呼び出し**] は、クライアントリクエストに応じて、API を呼び出すために使用されます。
+ [**InvalidateCache**] は、クライアントリクエストに応じて、API キャッシュを無効にするために使用されます。

### API Gateway で API を実行するためのアクセス許可のリソース形式
<a name="api-gateway-iam-policy-resource-format-for-executing-api"></a>

API 実行の `Resource` 式には、以下の一般的な形式があります。

```
arn:aws:execute-api:region:account-id:api-id/stage-name/HTTP-VERB/resource-path-specifier
```

各パラメータの意味は次のとおりです。
+ *region* は、メソッドのデプロイされた API に対応する AWS リージョン (**us-east-1**、またはすべての **\$1** リージョンを表す AWS) です。
+ *account-id* は、REST API 所有者の 12 桁の AWS アカウント ID です。
+ *api-id* は、メソッドの API に割り当てられた識別子 API Gateway です。
+ *stage-name* は、メソッドに関連付けられたステージの名前です。
+ *HTTP-VERB* はメソッドの HTTP 動詞です。GET、POST、PUT、DELETE、PATCH のいずれかになります。
+ *resource-path-specifier* は、目的のメソッドへのパスです

**注記**  
ワイルドカード (`*`) を指定すると、`Resource` 式はそのワイルドカードを式の残りの部分に適用します。

以下に示しているのは、いくつかのリソース式の例です。
+ 任意のステージの任意のリソースパス、任意の AWS リージョンの任意の API には **arn:aws:execute-api:\$1:\$1:\$1**。
+ 任意のステージの任意のリソースパス、AWS リージョンが `us-east-1` の任意の API には **arn:aws:execute-api:us-east-1:\$1:\$1**。
+ 任意のステージの任意のリソースパス、AWS リージョンが us-east-1 で識別子が *api-id* の API には **arn:aws:execute-api:us-east-1:\$1:*api-id*/\$1**。
+ ステージ `test` のリソースパス、AWS リージョンが us-east-1 で識別子が *api-id* の API には **arn:aws:execute-api:us-east-1:\$1:*api-id*/`test`/\$1**。

詳細については[API Gateway Amazon リソースネーム (ARN) リファレンス](arn-format-reference.md)を参照してください。

# API 実行アクセス許可の IAM ポリシーの例
<a name="api-gateway-iam-policy-examples-for-api-execution"></a>

アクセス権限モデルおよび他の背景情報については、「[API を呼び出すためのアクセスの制御](api-gateway-control-access-using-iam-policies-to-invoke-api.md)」を参照してください。

以下のポリシーステートメントは、識別子が `a123456789` の API の、ステージが `test` の `mydemoresource` のパスで任意の POST メソッドを呼び出す許可をユーザーに付与するもので、対応する API が us-east-1 の AWS リージョンにデプロイされていることを前提としています。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "execute-api:Invoke"
      ],
      "Resource": [
        "arn:aws:execute-api:us-east-1:*:a123456789/test/POST/my-demo-resource-path/*"
      ]
    }
  ]
}
```

------

以下のポリシーステートメントの例では、任意の `petstorewalkthrough/pets` リージョンの、識別子が `a123456789` の API の、任意のステージの、リソースパスが AWS の、任意のメソッドを呼び出すアクセス権限をユーザーに付与します。ただし、該当する API がそのリージョンにデプロイされているとします。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "execute-api:Invoke"
      ],
      "Resource": [
        "arn:aws:execute-api:*:*:a123456789/*/*/petstorewalkthrough/pets"
      ]
    }
  ]
}
```

------

# API Gateway でプライベート API 用の VPC エンドポイントポリシーを使用する
<a name="apigateway-vpc-endpoint-policies"></a>

プライベート API のセキュリティを向上させるには、VPC エンドポイントポリシーを作成できます。VPC エンドポイントポリシーは、VPC エンドポイントにアタッチする IAM リソースポリシーです。詳細については、「[VPC エンドポイントによるサービスのアクセスコントロール](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)」を参照してください。

VPC エンドポイントポリシーを作成して、以下のタスクを実行できます。
+ 特定の組織やリソースにのみ、VPC エンドポイントにアクセスして API を呼び出すことを許可します。
+ API へのトラフィックを制御するために、セッションベースやロールベースのポリシーは使用しないで、単一のポリシーを使用します。
+ オンプレミスから AWS に移行する際に、アプリケーションのセキュリティ境界を厳しくします。

## VPC エンドポイントポリシーに関する考慮事項
<a name="apigateway-vpc-endpoint-policies-considerations"></a>

VPC エンドポイントポリシーに関する考慮事項は、以下のとおりです。
+ 呼び出し元の ID は、`Authorization` ヘッダー値に基づいて評価されます。VPC エンドポイントポリシーが最初に評価され、次に API Gateway はメソッドリクエストで設定された認可のタイプに基づいてリクエストを評価します。次の表は、`Authorization` ヘッダー値の内容に基づいて VPC エンドポイントポリシーがどのように評価されるかを示しています。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-vpc-endpoint-policies.html)
+ アクセスコントロールが Lambda や Amazon Cognito オーソライザーなどのベアラートークンの使用に依存している場合は、[リソースのプロパティ](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resource-properties)を使用してセキュリティ境界を制御できます。
+  認証コントロールが IAM 認証を使用している場合は、[リソースのプロパティ](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resource-properties)と[プリンシパルのプロパティ](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resource-principal)を使用してセキュリティ境界を制御できます。
+ VPC エンドポイントポリシーは、API Gateway リソースポリシーと一緒に使用できます。API Gateway リソースポリシーは、どのプリンシパルが API にアクセスできるかを指定します。エンドポイントポリシーは、誰が VPC にアクセスできるか、どの API を VPC エンドポイントから呼び出せるかを指定します。プライベート API にはリソースポリシーが必要ですが、カスタム VPC エンドポイントポリシーを作成する必要はありません。

## VPC エンドポイントポリシーの例
<a name="apigateway-vpc-endpoint-policies-examples"></a>

Amazon API Gateway で Amazon Virtual Private Cloud エンドポイントポリシーを作成し、以下を指定できます。
+ アクションを実行できるプリンシパル。
+ 実行可能なアクション。
+ 自身に対してアクションを実行できたリソース。

これは、認可ヘッダーの内容によって異なる場合があります。詳細については、「[VPC エンドポイントポリシーに関する考慮事項](#apigateway-vpc-endpoint-policies-considerations)」を参照してください。その他のポリシーの例については、GitHub ウェブサイトの「[Data perimeter policy examples](https://github.com/aws-samples/data-perimeter-policy-examples)」を参照してください。

VPC エンドポイントにポリシーをアタッチするには 、VPC コンソールを使用する必要があります。詳細については、「[VPC エンドポイントによるサービスのアクセスコントロール](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)」を参照してください。

## 例 1: 2 つの API へのアクセスを許可する VPC エンドポイントポリシー
<a name="apigateway-vpc-endpoint-policies-example-1"></a>

次のポリシー例では、ポリシーが関連付けられている VPC エンドポイントを経由して 2 つの特定の API へのアクセスを許可しています。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Principal": "*",
            "Action": [
                "execute-api:Invoke"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:execute-api:us-east-1:123412341234:a1b2c3d4e5/*",
                "arn:aws:execute-api:us-east-1:123412341234:aaaaa11111/*"
            ]
        }
    ]
}
```

------

## 例 2: GET メソッドへのアクセスを許可する VPC エンドポイントポリシー
<a name="apigateway-vpc-endpoint-policies-example-2"></a>

次のポリシー例では、ポリシーが関連付けられている VPC エンドポイントを経由して特定の API の`GET` メソッドへのアクセスを許可しています。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Principal": "*",
            "Action": [
                "execute-api:Invoke"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:execute-api:us-east-1:123412341234:a1b2c3d4e5/stageName/GET/*"
            ]
        }
    ]
}
```

------

## 例 3: 特定の API への特定のユーザーアクセスを許可する VPC エンドポイントポリシー
<a name="apigateway-vpc-endpoint-policies-example-3"></a>

次のポリシー例では、ポリシーが関連付けられている VPC エンドポイントを経由して特定の API への特定のユーザーアクセスを許可しています。

この場合、特定の IAM プリンシパルへのアクセスをポリシーで制限するため、メソッドの `authorizationType` を `AWS_IAM` または `NONE` に設定する必要があります。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Principal": {
                "AWS": [
                    "arn:aws:iam::123412341234:user/MyUser"
                ]
            },
            "Action": [
                "execute-api:Invoke"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:execute-api:us-east-1:123412341234:a1b2c3d4e5/*"
            ]
        }
    ]
}
```

------

## 例 4: 特定のカスタムドメイン名と、そのドメインにマッピングされたすべての API へのアクセスをユーザーに許可する VPC エンドポイントポリシー
<a name="apigateway-vpc-endpoint-policies-example-4"></a>

次のポリシー例では、ポリシーがアタッチされている VPC エンドポイントを経由して、プライベート API の特定のカスタムドメイン名へのアクセスをユーザーに許可します。このポリシーでは、ユーザーが VPC エンドポイントとカスタムドメイン名との間にドメイン名アクセスの関連付けを作成していて、そのカスタムドメイン名とそれにマッピングされているプライベート API へのアクセスが許可されている限り、そのカスタムドメイン名にマッピングされているすべての API を呼び出すことができます。詳細については、「[API Gateway でのプライベート API のカスタムドメイン名](apigateway-private-custom-domains.md)」を参照してください。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "execute-api:Invoke",
      "Resource": [
        "*"
      ],
       "Condition": {
        "ArnEquals": {
          "execute-api:viaDomainArn": "arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.test.com+f4g5h6",
        }
      }
    }
  ]
}
```

------

## 例 5: 特定の API およびドメインリソースへのアクセスを許可または拒否する VPC エンドポイントポリシー
<a name="apigateway-vpc-endpoint-policies-example-5"></a>

次のポリシー例では、特定の API およびドメインリソースへのアクセスをユーザーに許可します。このポリシーでは、ユーザーが VPC エンドポイントとカスタムドメイン名との間にドメイン名アクセスの関連付けを作成していて、そのカスタムドメイン名とそれにマッピングされているプライベート API へのアクセスが許可されている限り、その許可されたプライベート API とドメインリソースを呼び出すことができます。詳細については、「[API Gateway でのプライベート API のカスタムドメイン名](apigateway-private-custom-domains.md)」を参照してください。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "execute-api:Invoke",
      "Resource": [
        "arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.test.com+f4g5h6",
        "arn:aws:execute-api:us-west-2:111122223333:a1b2c3d4e5/*"
      ]
    },
    {
      "Effect": "Deny",
      "Principal": {
        "AWS": "*"
      },
      "Action": "execute-api:Invoke",
      "Resource": [
        "arn:aws:execute-api:us-west-2:111122223333:a1b2c3d4e5/admin/*",
        "arn:aws:execute-api:us-west-2:111122223333:bcd123455/*"
      ]
    }
  ]
}
```

------

## 例 6: 組織に属するプリンシパルとリソースによるアクセスを許可または拒否する VPC エンドポイントポリシー
<a name="apigateway-vpc-endpoint-policies-example-6"></a>

次のポリシー例では、組織に属するプリンシパルとリソースへのアクセスを許可します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Condition": {
                "StringEquals": {
                    "aws:ResourceOrgID": "o-abcd1234",
                    "aws:PrincipalOrgID": "o-abcd1234"
                }
            },
            "Action": "*",
            "Resource": "*",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Sid": "AllowRequestsByOrgsIdentitiesToOrgsResources"
        }
    ]
}
```

------

# API Gateway でタグを使用して REST API へのアクセスを制御する
<a name="apigateway-control-access-tags"></a>

REST API に対する許可は、IAM ポリシーの属性ベースのアクセスコントロールを使用して微調整できます。

詳細については、「[タグを使用して API Gateway REST API リソースへのアクセスをコントロールする](apigateway-tagging-iam-policy.md)」を参照してください。

# API Gateway Lambda オーソライザーを使用する
<a name="apigateway-use-lambda-authorizer"></a>

Lambda オーソライザー (以前はカスタムオーソライザーと呼ばれていました) は、API へのアクセスを制御するために使用します。****クライアントが API のメソッドへのリクエストを行うと、API Gateway は Lambda オーソライザーを呼び出します。Lambda オーソライザーは、発信者の ID を入力として受け取り、IAM ポリシーを出力として返します。

Lambda オーソライザーを使用して、カスタム認可スキームを実装します。スキームでは、リクエストパラメータを使用して、発信者のアイデンティティを判断したり、OAuth や SAML などのベアラートークン認証戦略を使用したりできます。Lambda オーソライザーは、API Gateway REST API コンソール、AWS CLI、または AWS SDK を使用して作成します。

## Lambda オーソライザーの認可ワークフロー
<a name="api-gateway-lambda-authorizer-flow"></a>

次の図は、Lambda オーソライザーの認可ワークフローを示しています。

![\[API Gateway Lambda 認可ワークフロー\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/custom-auth-workflow.png)


**API Gateway Lambda 認可ワークフロー**

1. クライアントは、API Gateway API でメソッドを呼び出し、ベアラートークンまたはリクエストパラメータを渡します。

1. API Gateway は、メソッドリクエストが Lambda オーソライザーで設定されているかどうかを確認します。存在する場合、API Gateway は Lambda 関数を呼び出します。

1. Lambda 関数は発信者を認証します。関数は次の方法で認証できます。
   + OAuth プロバイダーを呼び出して OAuth アクセストークンを取得します。
   + SAML プロバイダーを呼び出して SAML アサーションを取得します。
   + リクエストパラメータ値に基づいて IAM ポリシーを生成します。
   + データベースから認証情報を取得します。

1. Lambda 関数は、IAM ポリシーとプリンシパル識別子を返します。Lambda 関数がこの情報を返さない場合、呼び出しは失敗します。

1. API Gateway は IAM ポリシーを評価します。
   + アクセスが拒否された場合、API Gateway は `403 ACCESS_DENIED` などの適切な HTTP ステータスコードを返します。
   + アクセスが許可されている場合、API Gateway はメソッドを呼び出します。

     認可のキャッシュを有効にすると、API Gateway でポリシーがキャッシュされるため、Lambda オーソライザー関数は再度呼び出されません。ポリシーが API 全体のすべてのリソースとメソッドに適用されていることを確認します。

`403 ACCESS_DENIED` または `401 UNAUTHORIZED` ゲートウェイレスポンスはカスタマイズできます。詳細については[API Gateway での REST API のゲートウェイレスポンス](api-gateway-gatewayResponse-definition.md)を参照してください。

## Lambda オーソライザーのタイプの選択
<a name="api-gateway-lambda-authorizer-choose"></a>

Lambda オーソライザーには 2 種類あります。

**リクエストパラメータベースの Lambda オーソライザー (`REQUEST` オーソライザー)**  
`REQUEST` オーソライザーは、発信者 ID をヘッダー、クエリ文字列パラメータ、[`stageVariables`](api-gateway-mapping-template-reference.md#stagevariables-template-reference)、[`$context`](api-gateway-mapping-template-reference.md#context-variable-reference) 変数の組み合わせとして受け取ります。`REQUEST` オーソライザーを使用して、`$context.path` や `$context.httpMethod` コンテキスト変数など、複数の ID ソースからの情報に基づいてきめ細かなポリシーを作成できます。  
`REQUEST` オーソライザーの認可のキャッシュを有効にすると、API Gateway は、指定されたすべての ID ソースがリクエスト内に存在することを確認します。指定された ID ソースが欠落しているか、null または空である場合、API Gateway は、Lambda オーソライザー関数を呼び出すことなく `401 Unauthorized` HTTP レスポンスを返します。複数の ID ソースが定義されている場合は、すべての ID ソースがオーソライザーのキャッシュキーを取得するために使用されます (順序は保持されます)。複数の ID ソースを使用して、きめ細かなキャッシュキーを定義できます。  
キャッシュキーのいずれかの部分を変更して API を再デプロイすると、オーソライザーは、キャッシュされたポリシードキュメントを破棄して新しいドキュメントを作成します。  
`REQUEST` オーソライザーの認可のキャッシュを無効にすると、API Gateway はリクエストを Lambda 関数に直接渡します。

**トークンベースの Lambda オーソライザー (`TOKEN` オーソライザー)**  
`TOKEN` オーソライザーは、JSON ウェブトークン (JWT) や OAuth トークンなどのベアラートークンで発信者 ID を受け取ります。  
`TOKEN` オーソライザーの認可のキャッシュを有効にすると、トークンソースに指定されているヘッダー名がキャッシュキーになります。  
さらに、トークン検証を使用して RegEx ステートメントを入力できます。API Gateway は、この式に対して入力トークンの初期検証を実行し、検証が成功すると Lambda オーソライザー関数を呼び出します。これにより API への呼び出しを減らすことができます。  
`IdentityValidationExpression` プロパティは `TOKEN` オーソライザーでのみサポートされています。詳細については、「[x-amazon-apigateway-authorizer オブジェクト](api-gateway-swagger-extensions-authorizer.md)」を参照してください。

**注記**  
`REQUEST` オーソライザーを使用して API へのアクセスを制御することをお勧めします。`REQUEST` オーソライザーを使用すると、(`TOKEN` オーソライザーを使用した場合の単一の ID ソースと比べて) 複数の ID ソースに基づく API へのアクセスを制御できます。さらに、`REQUEST` オーソライザーでは複数の ID ソースを使用してキャッシュキーを分離できます。

## `REQUEST` オーソライザー Lambda 関数の例
<a name="api-gateway-lambda-authorizer-request-lambda-function-create"></a>

次のコード例で作成する Lambda オーソライザー関数では、クライアントが提供した `HeaderAuth1` ヘッダー、`QueryString1` クエリパラメータ、ステージ変数 `StageVar1` のすべてが、それぞれ `headerValue1`、`queryValue1`、`stageValue1` の指定された値と一致する場合に、リクエストを許可します。

------
#### [ Node.js ]

```
// A simple request-based authorizer example to demonstrate how to use request 
// parameters to allow or deny a request. In this example, a request is  
// authorized if the client-supplied HeaderAuth1 header, QueryString1
// query parameter, and stage variable of StageVar1 all match
// specified values of 'headerValue1', 'queryValue1', and 'stageValue1',
// respectively.
    
export const handler = function(event, context, callback) {
    console.log('Received event:', JSON.stringify(event, null, 2));
    
    // Retrieve request parameters from the Lambda function input:
    var headers = event.headers;
    var queryStringParameters = event.queryStringParameters;
    var pathParameters = event.pathParameters;
    var stageVariables = event.stageVariables;
        
    // Parse the input for the parameter values
    var tmp = event.methodArn.split(':');
    var apiGatewayArnTmp = tmp[5].split('/');
    var awsAccountId = tmp[4];
    var region = tmp[3];
    var restApiId = apiGatewayArnTmp[0];
    var stage = apiGatewayArnTmp[1];
    var method = apiGatewayArnTmp[2];
    var resource = '/'; // root resource
    if (apiGatewayArnTmp[3]) {
        resource += apiGatewayArnTmp[3];
    }
        
    // Perform authorization to return the Allow policy for correct parameters and 
    // the 'Unauthorized' error, otherwise.

     
    if (headers.HeaderAuth1 === "headerValue1"
        && queryStringParameters.QueryString1 === "queryValue1"
        && stageVariables.StageVar1 === "stageValue1") {
        callback(null, generateAllow('me', event.methodArn));
    }  else {
        callback(null, generateDeny('me', event.methodArn));
    }
}
     
// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
    // Required output:
    var authResponse = {};
    authResponse.principalId = principalId;
    if (effect && resource) {
        var policyDocument = {};
        policyDocument.Version = '2012-10-17'; // default version
        policyDocument.Statement = [];
        var statementOne = {};
        statementOne.Action = 'execute-api:Invoke'; // default action
        statementOne.Effect = effect;
        statementOne.Resource = resource;
        policyDocument.Statement[0] = statementOne;
        authResponse.policyDocument = policyDocument;
    }
    // Optional output with custom properties of the String, Number or Boolean type.
    authResponse.context = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": true
    };
    return authResponse;
}
     
var generateAllow = function(principalId, resource) {
    return generatePolicy(principalId, 'Allow', resource);
}
     
var generateDeny = function(principalId, resource) {
    return generatePolicy(principalId, 'Deny', resource);
}
```

------
#### [ Python ]

```
# A simple request-based authorizer example to demonstrate how to use request
# parameters to allow or deny a request. In this example, a request is
# authorized if the client-supplied headerauth1 header, QueryString1
# query parameter, and stage variable of StageVar1 all match
# specified values of 'headerValue1', 'queryValue1', and 'stageValue1',
# respectively.

def lambda_handler(event, context):
    print(event)

    # Retrieve request parameters from the Lambda function input:
    headers = event['headers']
    queryStringParameters = event['queryStringParameters']
    pathParameters = event['pathParameters']
    stageVariables = event['stageVariables']

    # Parse the input for the parameter values
    tmp = event['methodArn'].split(':')
    apiGatewayArnTmp = tmp[5].split('/')
    awsAccountId = tmp[4]
    region = tmp[3]
    restApiId = apiGatewayArnTmp[0]
    stage = apiGatewayArnTmp[1]
    method = apiGatewayArnTmp[2]
    resource = '/'

    if (apiGatewayArnTmp[3]):
        resource += apiGatewayArnTmp[3]

    # Perform authorization to return the Allow policy for correct parameters
    # and the 'Unauthorized' error, otherwise.

    if (headers['HeaderAuth1'] == "headerValue1" and queryStringParameters['QueryString1'] == "queryValue1" and stageVariables['StageVar1'] == "stageValue1"):
        response = generateAllow('me', event['methodArn'])
        print('authorized')
        return response
    else:
        print('unauthorized')
        response = generateDeny('me', event['methodArn'])
        return response
    # Help function to generate IAM policy


def generatePolicy(principalId, effect, resource):
    authResponse = {}
    authResponse['principalId'] = principalId
    if (effect and resource):
        policyDocument = {}
        policyDocument['Version'] = '2012-10-17'
        policyDocument['Statement'] = []
        statementOne = {}
        statementOne['Action'] = 'execute-api:Invoke'
        statementOne['Effect'] = effect
        statementOne['Resource'] = resource
        policyDocument['Statement'] = [statementOne]
        authResponse['policyDocument'] = policyDocument

    authResponse['context'] = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": True
    }

    return authResponse


def generateAllow(principalId, resource):
    return generatePolicy(principalId, 'Allow', resource)


def generateDeny(principalId, resource):
    return generatePolicy(principalId, 'Deny', resource)
```

------

この例では、Lambda オーソライザー関数は入力パラメータをチェックして次のように動作します。
+ 必要なすべてのパラメータ値が予想値と一致する場合、オーソライザー関数は `200 OK` HTTP レスポンスと次のような IAM ポリシーを返し、メソッドリクエストは成功します。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow",
        "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/"
      }
    ]
  }
  ```

------
+ 一致しない場合、オーソライザー関数は `401 Unauthorized` HTTP レスポンスを返し、メソッドリクエストは失敗します。

Lambda オーソライザー関数は、IAM ポリシーだけでなく、発信者のプリンシパル ID を返す必要があります。オプションで、`context` オブジェクトを返すこともできます。このオブジェクトには、統合バックエンドに渡すことができる追加情報が含まれています。詳細については、「[API Gateway Lambda オーソライザーからの出力](api-gateway-lambda-authorizer-output.md)」を参照してください。

本番稼働コードでは、認可を付与する前にユーザーの認証が必要になる場合があります。この場合、認証プロバイダーを (関連ドキュメントの指示に従って) 呼び出すことで、Lambda 関数に認証ロジックを追加できます。

## `TOKEN` オーソライザー Lambda 関数の例
<a name="api-gateway-lambda-authorizer-token-lambda-function-create"></a>

次のコード例で作成する `TOKEN` Lambda オーソライザー関数では、クライアントが提供したトークン値が `allow` の場合に、メソッドを呼び出すことを発信者に許可します。トークン値が `deny` の場合、発信者はリクエストを呼び出すことを許可されません。トークン値が `unauthorized` または空の文字列の場合、オーソライザー関数は `401 UNAUTHORIZED` レスポンスを返します。

------
#### [ Node.js ]

```
// A simple token-based authorizer example to demonstrate how to use an authorization token 
// to allow or deny a request. In this example, the caller named 'user' is allowed to invoke 
// a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke 
// the request if the token value is 'deny'. If the token value is 'unauthorized' or an empty
// string, the authorizer function returns an HTTP 401 status code. For any other token value, 
// the authorizer returns an HTTP 500 status code. 
// Note that token values are case-sensitive.

export const handler =  function(event, context, callback) {
    var token = event.authorizationToken;
    switch (token) {
        case 'allow':
            callback(null, generatePolicy('user', 'Allow', event.methodArn));
            break;
        case 'deny':
            callback(null, generatePolicy('user', 'Deny', event.methodArn));
            break;
        case 'unauthorized':
            callback("Unauthorized");   // Return a 401 Unauthorized response
            break;
        default:
            callback("Error: Invalid token"); // Return a 500 Invalid token response
    }
};

// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
    var authResponse = {};
    
    authResponse.principalId = principalId;
    if (effect && resource) {
        var policyDocument = {};
        policyDocument.Version = '2012-10-17'; 
        policyDocument.Statement = [];
        var statementOne = {};
        statementOne.Action = 'execute-api:Invoke'; 
        statementOne.Effect = effect;
        statementOne.Resource = resource;
        policyDocument.Statement[0] = statementOne;
        authResponse.policyDocument = policyDocument;
    }
    
    // Optional output with custom properties of the String, Number or Boolean type.
    authResponse.context = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": true
    };
    return authResponse;
}
```

------
#### [ Python ]

```
# A simple token-based authorizer example to demonstrate how to use an authorization token
# to allow or deny a request. In this example, the caller named 'user' is allowed to invoke
# a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke
# the request if the token value is 'deny'. If the token value is 'unauthorized' or an empty
# string, the authorizer function returns an HTTP 401 status code. For any other token value,
# the authorizer returns an HTTP 500 status code.
# Note that token values are case-sensitive.

import json


def lambda_handler(event, context):
    token = event['authorizationToken']
    if token == 'allow':
        print('authorized')
        response = generatePolicy('user', 'Allow', event['methodArn'])
    elif token == 'deny':
        print('unauthorized')
        response = generatePolicy('user', 'Deny', event['methodArn'])
    elif token == 'unauthorized':
        print('unauthorized')
        raise Exception('Unauthorized')  # Return a 401 Unauthorized response
        return 'unauthorized'
    try:
        return json.loads(response)
    except BaseException:
        print('unauthorized')
        return 'unauthorized'  # Return a 500 error


def generatePolicy(principalId, effect, resource):
    authResponse = {}
    authResponse['principalId'] = principalId
    if (effect and resource):
        policyDocument = {}
        policyDocument['Version'] = '2012-10-17'
        policyDocument['Statement'] = []
        statementOne = {}
        statementOne['Action'] = 'execute-api:Invoke'
        statementOne['Effect'] = effect
        statementOne['Resource'] = resource
        policyDocument['Statement'] = [statementOne]
        authResponse['policyDocument'] = policyDocument
    authResponse['context'] = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": True
    }
    authResponse_JSON = json.dumps(authResponse)
    return authResponse_JSON
```

------

この例では、API がメソッドリクエストを受信すると、API Gateway は `event.authorizationToken` 属性でこの Lambda オーソライザー関数にソーストークンを渡します。Lambda オーソライザー関数はトークンを読み取り、次のように動作します。
+ トークン値が `allow` の場合、オーソライザー関数は `200 OK` HTTP レスポンスと次のような IAM ポリシーを返し、メソッドリクエストは成功します。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow",
        "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/"
      }
    ]
  }
  ```

------
+ トークン値が `deny` の場合、オーソライザー関数は `200 OK` HTTP レスポンスと次のような `Deny` IAM ポリシーを返し、メソッドリクエストは失敗します。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Deny",
        "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/"
      }
    ]
  }
  ```

------
**注記**  
テスト環境以外では、API Gateway は `403 Forbidden` HTTP レスポンスを返し、メソッドリクエストは失敗します。
+ トークン値が `unauthorized` または空の文字列の場合、オーソライザー関数は `401 Unauthorized` HTTP レスポンスを返し、メソッド呼び出しは失敗します。
+ それ以外のトークンの場合、クライアントは `500 Invalid token` レスポンスを受け取り、メソッド呼び出しは失敗します。

Lambda オーソライザー関数は、IAM ポリシーだけでなく、発信者のプリンシパル ID を返す必要があります。オプションで、`context` オブジェクトを返すこともできます。このオブジェクトには、統合バックエンドに渡すことができる追加情報が含まれています。詳細については、「[API Gateway Lambda オーソライザーからの出力](api-gateway-lambda-authorizer-output.md)」を参照してください。

本番稼働コードでは、認可を付与する前にユーザーの認証が必要になる場合があります。この場合、認証プロバイダーを (関連ドキュメントの指示に従って) 呼び出すことで、Lambda 関数に認証ロジックを追加できます。

## その他の Lambda オーソライザー関数の例
<a name="api-gateway-lambda-authorizer-lambda-function-create"></a>

次のリストは、その他の Lambda オーソライザー関数の例を示しています。Lambda 関数は、API を作成したのと同じアカウントまたは別のアカウントで作成できます。

前の例に示した Lambda 関数の場合は、他の AWS のサービスを呼び出さないため、組み込みの [AWSLambdaBasicExecutionRole](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) を使用できます。Lambda 関数から他の AWS のサービスを呼び出す場合は、Lambda 関数に IAM 実行ロールを割り当てる必要があります。ロールを作成するには、「[AWS Lambda 実行ロール](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)」の手順に従ってください。

**その他の Lambda オーソライザー関数の例**
+  サンプルアプリケーションについては、GitHub の「[Open Banking Brazil - Authorization Samples](https://github.com/aws-samples/openbanking-brazilian-auth-samples)」を参照してください。
+  その他のサンプルの Lambda 関数については、GitHub の「[aws-apigateway-lambda-authorizer-blueprints](https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints)」を参照してください。
+ Amazon Cognito ユーザープールを使用してユーザーを認証するとともに Verified Permissions を使用してポリシーストアに基づいて発信者を認証する Lambda オーソライザーを作成できます。詳細については、「[Verified Permissions を使用して ID の属性に基づいてアクセスを制御する](apigateway-lambda-authorizer-verified-permissions.md)」を参照してください。
+ Lambda コンソールには Python の設計図が用意されています。[**(設計図を使用する**] を選択して [**api-gateway-authorizer-python**] 設計図を選択すると使用できます。

# API Gateway Lambda オーソライザーを設定する
<a name="configure-api-gateway-lambda-authorization"></a>

Lambda 関数を作成したら、Lambda 関数を API のオーソライザーとして設定します。次に、Lambda オーソライザーを呼び出すようにメソッドを設定し、発信者がメソッドを呼び出せるかどうかを判断します。Lambda 関数は、API を作成したのと同じアカウントまたは別のアカウントで作成できます。

API Gateway コンソールの組み込みツールまたは [Postman](https://www.postman.com/) を使用して、Lambda オーソライザーをテストできます。Postman を使用して Lambda オーソライザー関数をテストする方法については、「[API Gateway Lambda オーソライザーで API を呼び出す](call-api-with-api-gateway-lambda-authorization.md)」を参照してください。

## Lambda オーソライザーを設定する (コンソール)
<a name="configure-api-gateway-lambda-authorization-with-console"></a>

 次の手順は、API Gateway REST API コンソールで Lambda オーソライザーを作成する方法を示しています。Lambda オーソライザーのタイプ別の詳細については、「[Lambda オーソライザーのタイプの選択](apigateway-use-lambda-authorizer.md#api-gateway-lambda-authorizer-choose)」を参照してください。

------
#### [ REQUEST authorizer ]

**Lambda オーソライザー `REQUEST` を設定するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. API を選択し、**[オーソライザー]** を選択します。

1. **[オーソライザーの作成]** を選択します。

1. **[オーソライザー名]** で、オーソライザー名を入力します。

1. **[オーソライザータイプ]** には **Lambda** を選択します。

1. **[Lambda 関数]** で、Lambda オーソライザー関数を作成した場所 AWS リージョン を選択し、関数名を入力します。

1. **[Lambda 呼び出しロール]** は空白のままにして、API Gateway REST API コンソールでリソースベースのポリシーを設定できるようにします。このポリシーは、Lambda オーソライザー関数を呼び出すアクセス許可を API Gateway に付与します。IAM ロールの名前を入力して、Lambda オーソライザー関数を呼び出すことを API Gateway に許可することもできます。ロールの例については、「[引き受け可能な IAM ロールを作成する](integrating-api-with-aws-services-lambda.md#api-as-lambda-proxy-setup-iam-role-policies)」を参照してください。

1. **[Lambda イベントペイロード]** の場合は、**[リクエスト]** を選択します。

1. **[ID ソースタイプ]** では、パラメータタイプを選択します。サポートされているパラメータタイプは、`Header`、`Query string`、`Stage variable`、および `Context` です。ID ソースをさらに追加するには、**[パラメータを追加]** を選択します。

1. オーソライザーが生成した認可ポリシーをキャッシュするには、**[認可のキャッシュ]** をオンのままにします。ポリシーのキャッシュを有効にすると、**[TTL]** 値を変更できます。**[TTL]** を 0 に設定すると、ポリシーのキャッシュは無効になります。

   キャッシュを有効にすると、オーソライザーは、API 全体のすべてのメソッドに適用されるポリシーを返す必要があります。メソッド固有のポリシーを適用するには、コンテキスト変数の `$context.path` および `$context.httpMethod` を使用します。

1. **[オーソライザーの作成]** を選択します。

------
#### [ TOKEN authorizer ]

**`TOKEN` Lambda オーソライザーを設定するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. API を選択し、**[オーソライザー]** を選択します。

1. **[オーソライザーの作成]** を選択します。

1. **[オーソライザー名]** で、オーソライザー名を入力します。

1. **[オーソライザータイプ]** には **Lambda** を選択します。

1. **[Lambda 関数]** で、Lambda オーソライザー関数を作成した場所 AWS リージョン を選択し、関数名を入力します。

1. **[Lambda 呼び出しロール]** は空白のままにして、API Gateway REST API コンソールでリソースベースのポリシーを設定できるようにします。このポリシーは、Lambda オーソライザー関数を呼び出すアクセス許可を API Gateway に付与します。IAM ロールの名前を入力して、Lambda オーソライザー関数を呼び出すことを API Gateway に許可することもできます。ロールの例については、「[引き受け可能な IAM ロールを作成する](integrating-api-with-aws-services-lambda.md#api-as-lambda-proxy-setup-iam-role-policies)」を参照してください。

1. **[Lambda イベントペイロード]** の場合は、**[トークン]** を選択します。

1. **[トークンソース]** に、認可トークンを含むヘッダー名を入力します。認可トークンを Lambda オーソライザーに送信するには、発信者がこの名前のヘッダーが含める必要があります。

1. (オプション) **[トークンの検証]** に、RegEx ステートメントを入力します。API Gateway は、この式に対して、入力トークンの初期検証を実行し、認証が成功するとオーソライザーを呼び出します。

1. オーソライザーが生成した認可ポリシーをキャッシュするには、**[認可のキャッシュ]** をオンのままにします。ポリシーのキャッシュが有効の場合、**[トークンのソース]** で指定されているヘッダー名はキャッシュキーになります。ポリシーのキャッシュを有効にすると、**[TTL]** 値を変更できます。**[TTL]** を 0 に設定すると、ポリシーのキャッシュは無効になります。

   キャッシュを有効にすると、オーソライザーは、API 全体のすべてのメソッドに適用されるポリシーを返す必要があります。メソッド固有のポリシーを適用するには、**[認可のキャッシュ]** をオフにすることができます。

1. **[オーソライザーの作成]** を選択します。

------

Lambda オーソライザーを作成したら、これをテストできます。次の手順は、Lambda オーソライザーをテストする方法を示しています。

------
#### [ REQUEST authorizer ]

**`REQUEST` Lambda オーソライザーをテストするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. オーソライザーの名前を選択します。

1. **[オーソライザーをテスト]** に、ID ソースの値を入力します。

   [`REQUEST` オーソライザー Lambda 関数の例](apigateway-use-lambda-authorizer.md#api-gateway-lambda-authorizer-request-lambda-function-create) を使用している場合は、次の手順に従います。

   1. **[ヘッダー]** を選択して「**headerValue1**」と入力し、**[パラメータを追加]** を選択します。

   1. **[ID ソースタイプ]** で **[クエリ文字列]** を選択して「**queryValue1**」と入力し、**パ[ラメータの追加]** を選択します。

   1. **[ID ソースタイプ]** で、**[ステージ変数]** を選択し、「**stageValue1**」と入力します。

   テスト呼び出しのコンテキスト変数は変更できませんが、Lambda 関数の **API Gateway オーソライザー**のテストイベントテンプレートは変更できます。次に、変更したコンテキスト変数を使用して Lambda オーソライザー関数をテストできます。詳細については、「AWS Lambda デベロッパーガイド」の「[コンソールでの Lambda 関数のテスト](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html)」を参照してください。**

1. **[オーソライザーをテスト]** を選択します。

------
#### [ TOKEN authorizer ]

**`TOKEN` Lambda オーソライザーをテストするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. オーソライザーの名前を選択します。

1. **[オーソライザーをテスト]** に、トークンの値を入力します。

   [`TOKEN` オーソライザー Lambda 関数の例](apigateway-use-lambda-authorizer.md#api-gateway-lambda-authorizer-token-lambda-function-create) を使用している場合は、次の手順に従います。

   1. **[authorizationToken]** に、「**allow**」と入力します。

1. **[オーソライザーをテスト]** を選択します。

    Lambda オーソライザーがテスト環境でリクエストを正常に拒否すると、テストは `200 OK` HTTP レスポンスで応答します。ただし、テスト環境以外では、API Gateway は `403 Forbidden` HTTP レスポンスを返し、メソッドリクエストは失敗します。

------

## Lambda オーソライザーを設定する (AWS CLI）
<a name="configure-api-gateway-lambda-authorization-cli"></a>

次の [create-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html) コマンドは、AWS CLI を使用して Lambda オーソライザーを作成する方法を示しています。

------
#### [ REQUEST authorizer ]

次の [create-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html) コマンドは、`REQUEST` オーソライザーを作成し、`Authorizer` ヘッダーと `accountId` コンテキスト変数を ID ソースとして使用します。

```
aws apigateway create-authorizer \
    --rest-api-id 1234123412 \
    --name 'First_Request_Custom_Authorizer' \
    --type REQUEST \
    --authorizer-uri 'arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123412341234:function:customAuthFunction/invocations' \
    --identity-source 'method.request.header.Authorization,context.accountId' \
    --authorizer-result-ttl-in-seconds 300
```

------
#### [ TOKEN authorizer ]

次の [create-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-authorizer.html) コマンドは、`TOKEN` オーソライザーを作成し、`Authorization` ヘッダーを ID ソースとして使用します。

```
aws apigateway create-authorizer \
    --rest-api-id 1234123412 \
    --name 'First_Token_Custom_Authorizer' \
    --type TOKEN \
    --authorizer-uri 'arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123412341234:function:customAuthFunction/invocations' \
    --identity-source 'method.request.header.Authorization' \
    --authorizer-result-ttl-in-seconds 300
```

------

Lambda オーソライザーを作成したら、これをテストできます。次の [test-invoke-authorizer](https://docs.aws.amazon.com/cli/latest/reference/apigateway/test-invoke-authorizer.html) コマンドは、Lambda オーソライザーをテストします。

```
aws apigateway test-invoke-authorizer --rest-api-id 1234123412 \
   --authorizer-id efg1234 \
   --headers Authorization='Value'
```

## Lambda オーソライザーを使用するようにメソッドを設定する (コンソール)
<a name="configure-api-gateway-lambda-authorization-method-console"></a>

Lambda オーソライザーを設定したら、これを API のメソッドにアタッチする必要があります。オーソライザーが認可キャッシュを使用している場合は、追加のメソッドのアクセスを制御するようにポリシーを更新してください。

**API メソッドを設定して Lambda オーソライザーを使用するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. API を選択します。

1. **[リソース]** を選択し、新しいメソッドを選択するか、既存のメソッドを選択します。

1. **[メソッドリクエスト]** タブの **[メソッドリクエスト設定]** で、**[編集]** を選択します。

1. **[オーソライザー]** では、ドロップダウンメニューから、先ほど作成した Lambda オーソライザーを選択します。

1.  (オプション) オーソライザートークンをバックエンドに渡す場合は、**[HTTP リクエストヘッダー]** を選択します。**[ヘッダーを追加]** を選択し、認可ヘッダーの名前を追加します。**[名前]** に、API の Lambda オーソライザーを作成した際に指定した **[トークンソース]** の名前と一致するヘッダー名を入力します。このステップは [`REQUEST`] オーソライザーには適用されません。

1. **[保存]** を選択します。

1. [**API のデプロイ**] を選択して、API をステージにデプロイします。ステージ変数を使用した `REQUEST` オーソライザーの場合は、必要なステージ変数を定義して、**[ステージ]** ページで値を指定する必要があります。

## Lambda オーソライザーを使用するようにメソッドを設定する (AWS CLI)
<a name="configure-api-gateway-lambda-authorization-method-cli"></a>

Lambda オーソライザーを設定したら、これを API のメソッドにアタッチする必要があります。新しいメソッドを作成するか、パッチオペレーションを使用してオーソライザーを既存のメソッドにアタッチできます。オーソライザーが認可キャッシュを使用している場合は、追加のメソッドのアクセスを制御するようにポリシーを更新してください。

次の [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) コマンドは、Lambda オーソライザーを使用する新しいメソッドを作成します。

```
aws apigateway put-method --rest-api-id 1234123412 \
  --resource-id a1b2c3 \
  --http-method PUT \
  --authorization-type CUSTOM \
  --authorizer-id efg1234
```

次の [update-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-method.html) コマンドは、Lambda オーソライザーを使用するように既存のメソッドを更新します。

```
aws apigateway update-method \
    --rest-api-id 1234123412 \
    --resource-id a1b2c3 \
    --http-method PUT \
    --patch-operations op="replace",path="/authorizationType",value="CUSTOM" op="replace",path="/authorizerId",value="efg1234"
```

# API Gateway Lambda オーソライザーへの入力
<a name="api-gateway-lambda-authorizer-input"></a>

次のセクションでは、API Gateway から Lambda オーソライザーへの入力の形式について説明します。

## `TOKEN` の入力形式
<a name="w2aac15b9c23c25c19b5"></a>

 `TOKEN` タイプの Lambda オーソライザー (以前のカスタムオーソライザー) の場合は、API のオーソライザーを設定する際、[**トークンのソース**] としてカスタムヘッダーを指定する必要があります。API クライアントは、受信リクエストでそのヘッダーに必要な認可トークンを渡す必要があります。API Gateway は、受信メソッドリクエストを受け取った時点で、カスタムヘッダーからトークンを抽出します。その後、`authorizationToken` プロパティとしてメソッド ARN を渡すだけでなく、Lambda 関数の `event` オブジェクトの `methodArn` プロパティとしてトークンを渡します。

```
{
    "type":"TOKEN",
    "authorizationToken":"{caller-supplied-token}",
    "methodArn":"arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]"
}
```

 この例では、`type` プロパティは、オーソライザーのタイプ (`TOKEN` オーソライザー) を指定します。`{caller-supplied-token}` は、クライアントリクエストの認可ヘッダーの値であり、任意の文字列値にすることができます。`methodArn` は、受信するメソッドリクエストの ARN であり、Lambda オーソライザーの設定に従って API Gateway により自動入力されます。

## `REQUEST` の入力形式
<a name="w2aac15b9c23c25c19b7"></a>

`REQUEST` タイプの Lambda オーソライザーの場合、API Gateway は、`event` オブジェクトの一部として、オーソライザーの Lambda 関数にリクエストパラメータを渡します。このリクエストパラメータには、ヘッダー、パスパラメータ、クエリ文字列パラメータ、ステージ変数、一部のリクエストコンテキスト変数などがあります。API 発信者は、パスパラメータ、ヘッダー、クエリ文字列パラメータを設定できます。API デベロッパーは API デプロイ時にステージ変数を設定する必要があります。API Gateway ランタイムに、このリクエストコンテキストが指定されます。

**注記**  
パスパラメータは、リクエストパラメータとして Lambda オーソライザー関数に渡すことができますが、ID ソースとして使用することはできません。

 次の例では、API メソッド (`REQUEST`) をプロキシ統合に設定する `GET /request` オーソライザーへの入力を表します。

```
{
  "type": "REQUEST",
  "methodArn": "arn:aws:execute-api:us-east-1:123456789012:abcdef123/test/GET/request",
  "resource": "/request",
  "path": "/request",
  "httpMethod": "GET",
  "headers": {
    "X-AMZ-Date": "20170718T062915Z",
    "Accept": "*/*",
    "HeaderAuth1": "headerValue1",
    "CloudFront-Viewer-Country": "US",
    "CloudFront-Forwarded-Proto": "https",
    "CloudFront-Is-Tablet-Viewer": "false",
    "CloudFront-Is-Mobile-Viewer": "false",
    "User-Agent": "..."
  },
  "queryStringParameters": {
    "QueryString1": "queryValue1"
  },
  "pathParameters": {},
  "stageVariables": {
    "StageVar1": "stageValue1"
  },
  "requestContext": {
    "path": "/request",
    "accountId": "123456789012",
    "resourceId": "05c7jb",
    "stage": "test",
    "requestId": "...",
    "identity": {
      "apiKey": "...",
      "sourceIp": "...",
      "clientCert": {
        "clientCertPem": "CERT_CONTENT",
        "subjectDN": "www.example.com",
        "issuerDN": "Example issuer",
        "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
        "validity": {
          "notBefore": "May 28 12:30:02 2019 GMT",
          "notAfter": "Aug  5 09:36:04 2021 GMT"
        }
      }
    },
    "resourcePath": "/request",
    "httpMethod": "GET",
    "apiId": "abcdef123"
  }
}
```

 `requestContext` はキーと値のペアのマップであり、[\$1context](api-gateway-mapping-template-reference.md#context-variable-reference) 変数に対応します。その結果は API に依存します。

 API Gateway は、マップに新しいキーを追加する場合があります。Lambda プロキシ統合での Lambda 関数の入力の詳細については、「[プロキシ統合のための Lambda 関数の入力形式](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format)」を参照してください。

# API Gateway Lambda オーソライザーからの出力
<a name="api-gateway-lambda-authorizer-output"></a>

Lambda オーソライザー関数の出力はディクショナリのようなオブジェクトです。プリンシパル ID (`principalId`) と、ポリシーステートメントのリストを含むポリシードキュメント (`policyDocument`) を含む必要があります。出力には、キー/値ペアを含む `context` マップも含まることがあります。API が使用量プランを使用する ([https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource) が `AUTHORIZER` に設定されている) 場合、Lambda オーソライザー関数は `usageIdentifierKey` プロパティ値として、使用量プランの API キーのいずれかを返す必要があります。

この出力の例を以下に示します。

------
#### [ JSON ]

****  

```
{
  "principalId": "yyyyyyyy", 
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow|Deny",
        "Resource": "arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]"
      }
    ]
  },
  "context": {
    "stringKey": "value",
    "numberKey": "1",
    "booleanKey": "true"
  },
  "usageIdentifierKey": "{api-key}"
}
```

------

 ここで、ポリシーステートメントは、指定された API メソッド (`Effect`) を呼び出す (`Action`) ことを API Gateway 実行サービスに許可するか拒否するか (`Resource`) を指定しています。オーソライザーに基づいて複数のリソースへのアクセスを制御する必要がある場合があります。ワイルドカード (`*`) を使ってリソースタイプ (メソッド) を指定できます。API を呼び出す有効なポリシーの設定の詳細については、「[API Gateway で API を実行するための IAM ポリシーのステートメントの参照](api-gateway-control-access-using-iam-policies-to-invoke-api.md#api-gateway-calling-api-permissions)」を参照してください。

権限付与対応のメソッド ARN (`arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]` など) の場合、最大長は 1600 バイトです。パスパラメータの値 (そのサイズは実行時に決定されます) によっては、ARN の長さが制限を超えることがあります。これが発生した場合、API クライアントは `414 Request URI too long` レスポンスを受け取ります。

さらに、リソース ARN は、承認者によって出力されたポリシーステートメントに示されているように、現在 512 文字に制限されています。このため、JWT トークンが長すぎる URI をリクエスト URI に使用しないでください。代わりに、JWT トークンはリクエストヘッダーで安全に渡すことができます。

 `principalId` 値には、マッピングテンプレートで `$context.authorizer.principalId` 変数を使ってアクセスできます。これはバックエンドに値を渡す場合に便利です。詳細については、「[データ変換のコンテキスト変数](api-gateway-mapping-template-reference.md#context-variable-reference)」を参照してください。

 マッピングテンプレート内の `stringKey` マップの `numberKey`、`booleanKey`、または `"value"` 値 (例: `"1"`、`"true"`、または `context`) には、それぞれ `$context.authorizer.stringKey`、`$context.authorizer.numberKey`、または `$context.authorizer.booleanKey` を呼び出すことによりアクセスできます。返される値は、すべてが文字列化されます。`context` マップでキーの有効な値として JSON オブジェクトまたは配列を設定することはできません。

 オーソライザーからバックエンドに、キャッシュされた認証情報を返すには、`context` マップを使用します。この際、統合リクエストのマッピングテンプレートを使用します。これにより、バックエンドのユーザーエクスペリエンスを強化するには、キャッシュされた認証情報を使用して、シークレットキーにアクセスする必要性を抑え、リクエストごとに認可トークンを開きます。

 Lambda プロキシ統合の場合、API Gateway は、Lambda オーソライザーの `context` オブジェクトを、入力 `event` の一部としてバックエンドの Lambda 関数に直接渡します。`context` のキー/値ペアは、Lambda 関数で `$event.requestContext.authorizer.key` を呼び出して取得できます。

`{api-key}` は、API ステージの使用量プランの API キーを表します。詳細については、「[API Gateway での REST API の使用量プランと API キー](api-gateway-api-usage-plans.md)」を参照してください。

 Lambda オーソライザー例からの出力例を次に示します。この出力例には、AWS アカウント (`123456789012`) の API (`ymy8tbxw7b`) の `dev` ステージの `GET` メソッドに対する呼び出しをブロック (`Deny`) するポリシーステートメントが含まれています。

------
#### [ JSON ]

****  

```
{
  "principalId": "user",
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Deny",
        "Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/dev/GET/"
      }
    ]
  }
}
```

------

# API Gateway Lambda オーソライザーで API を呼び出す
<a name="call-api-with-api-gateway-lambda-authorization"></a>

 Lambda オーソライザー (以前のカスタムオーソライザー) を設定し、API をデプロイしている場合は、Lambda オーソライザーを有効にして API を検証する必要があります。そのためには、cURL または [Postman](https://www.postman.com/) などの REST クライアントが必要です。以下の例では、Postman を使用します。

**注記**  
 オーソライザーが有効なメソッドを呼び出すとき、`TOKEN` オーソライザーに必要なトークンが設定されていない、Null である、または指定された [**トークン検証式**] によって無効にされている場合、API Gateway は CloudWatch への呼び出しを記録しません。同様に、`REQUEST` オーソライザーに必要な ID ソースのいずれかが設定されていない、Null である、または空の場合、API Gateway は CloudWatch への呼び出しを記録しません。

 以下では、Postman を使用して Lambda `TOKEN` オーソライザーで API の呼び出しまたはテストを行う方法を説明します。必要なパス、ヘッダー、またはクエリ文字列パラメータを明示的に指定している場合は、このメソッドを Lambda `REQUEST` オーソライザーを使用した API の呼び出しに適用できます。

**カスタムの `TOKEN` オーソライザーで API を呼び出すには**

1.  [**Postman**] を開き、[**GET**] メソッドを選択して、API の [**呼び出し URL**] を、隣の URL フィールド内に貼り付けます。

    Lambda 認可トークンヘッダーを追加し、その値を`allow`に設定します。[**Send (送信)**] を選択します。  
![\[Lambda 認可 Allow トークンで API を呼び出す\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/custom-auth-call-api-with-allow-token.png)

    レスポンスは、API Gateway Lambda オーソライザーが [**200 OK**] レスポンスを返し、メソッドに関連付けられた HTTP エンドポイント (http://httpbin.org/get) にアクセスすることを適切に呼び出しに許可していることを示しています。

1.  Postman で、Lambda 認可トークンヘッダー値を`deny`に変更します。[**Send (送信)**] を選択します。  
![\[Lambda 認可 Deny トークンで API を呼び出す\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/custom-auth-call-api-with-deny-token.png)

   レスポンスは、API Gateway Lambda カスタム認証が [**403 Forbidden**] レスポンスを返し、HTTP エンドポイントにアクセスすることを呼び出しに許可しないことを示しています。

1.  Postman で、Lambda 認可トークンヘッダー値を `unauthorized` に変更し、[**送信**] を選択します。  
![\[Lambda 認可 Unauthorized トークンで API を呼び出す\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/custom-auth-call-api-with-unauthorized-token.png)

    レスポンスは、API Gateway が [**401 Unauthorized**] レスポンスを返し、HTTP エンドポイントにアクセスすることを呼び出しに許可しないことを示しています。

1.  ここで、Lambda 認可トークンヘッダー値を`fail`に変更します。[**Send (送信)**] を選択します。  
![\[Lambda 認可 Fail トークンで API を呼び出す\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/custom-auth-call-api-with-fail-token.png)

    レスポンスは、API Gateway が [**500 Internal Server Error**] レスポンスを返し、HTTP エンドポイントにアクセスすることを呼び出しに許可しないことを示しています。

# クロスアカウントの API Gateway Lambda オーソライザーを設定する
<a name="apigateway-lambda-authorizer-cross-account-lambda-authorizer"></a>

AWS Lambda 関数は、API オーソライザー関数とは異なる AWS アカウントからも使用できるようになりました。各アカウントは、Amazon API Gateway を利用できるリージョンであればどのリージョンでもかまいません。Lambda オーソライザー関数では、OAuth や SAML などのべアラートークン認証戦略を使用できます。これにより、複数の API Gateway API 間で簡単に一元管理し、主要な Lambda オーソライザー関数を共有できるようになります。

このセクションでは、Amazon API Gateway コンソールを使用してクロスアカウント Lambda オーソライザー関数を設定する方法を示します。

これらの手順は、1 つの AWS アカウントに API Gateway API、もう 1 つのアカウントに Lambda オーソライザー関数が設定されていることを前提としています。

## API Gateway コンソールを使用して クロスアカウント Lambda オーソライザーを設定する
<a name="apigateway-cross-account-lambda-auth-configure-cross-account-authorizer"></a>

API を設定しているアカウントで Amazon API Gateway コンソールにサインインし、以下の操作を行います。

1. API を選択し、メインナビゲーションペインで **[オーソライザー]** を選択します。

1. **[オーソライザーの作成]** を選択します。

1. **[オーソライザー名]** で、オーソライザー名を入力します。

1. **[オーソライザータイプ]** には **Lambda** を選択します。

1. **[Lambda 関数]** で、2 番目のアカウントで作成した Lambda オーソライザー関数の完全な ARN を入力します。
**注記**  
Lambda コンソールのコンソールウィンドウの右上隅で、関数の ARN を検索できます。

1. `aws lambda add-permission` コマンド文字列を含む警告が表示されます。このポリシーは、API Gateway にオーソライザー Lambda 関数を呼び出すアクセス許可を付与します。後ほど使用するために、コマンドをコピーして保存しておきます。コマンドは、オーソライザーの作成後に実行します。

1. **[Lambda イベントペイロード]** には、`TOKEN` オーソライザーの **[トークン]**、または `REQUEST` オーソライザーの **[リクエスト]** を選択します。

1. 前のステップの選択内容に応じて、次のいずれかを実行します。

   1.  **[トークン]** オプションで、以下の操作を行います。
      + **[トークンソース]** に、認可トークンを含むヘッダー名を入力します。認可トークンを Lambda オーソライザーに送信するには、この名前のヘッダーが API クライアントに含まれている必要があります。
      + オプションで、**[トークンの検証]** に RegEx ステートメントを入力します。API Gateway は、この式に対して、入力トークンの初期検証を実行し、認証が成功するとオーソライザーを呼び出します。これにより API への呼び出しを減らすことができます。
      + オーソライザーが生成した認可ポリシーをキャッシュするには、**[認可のキャッシュ]** をオンのままにします。ポリシーのキャッシュが有効の場合、[**TTL**] 値を変更できます。**[TTL]** を 0 に設定すると、ポリシーのキャッシュは無効になります。ポリシーのキャッシュが有効の場合、**[トークンのソース]** で指定されているヘッダー名はキャッシュキーになります。リクエストでこのヘッダーに複数の値が渡された場合、すべての値がキャッシュキーになり、順序は保持されます。
**注記**  
デフォルトの [**TTL**] 値は 300 秒です。最大値は 3600 秒で、この制限値を増やすことはできません。

   1. [**リクエスト**] オプションで、以下の操作を行います。
      + **[ID ソースタイプ]** では、パラメータタイプを選択します。サポートされているパラメータタイプは、`Header`、`Query string`、`Stage variable`、および `Context` です。ID ソースをさらに追加するには、**[パラメータを追加]** を選択します。
      + オーソライザーが生成した認可ポリシーをキャッシュするには、**[認可のキャッシュ]** をオンのままにします。ポリシーのキャッシュが有効の場合、[**TTL**] 値を変更できます。**[TTL]** を 0 に設定すると、ポリシーのキャッシュは無効になります。

        API Gateway では、リクエストオーソライザーのキャッシングキーとして、指定された ID ソースを使用します。キャッシュが有効の場合、API Gateway は、指定されているすべての ID ソースがランタイムに存在していることを確認できた場合のみ、Lambda 関数を呼び出します。指定された ID ソースが欠落しているか、null、または空の場合、API Gateway は、`401 Unauthorized` レスポンスを返します。オーソライザーの Lambda 関数を呼び出すことはありません。

        複数の ID ソースが定義されている場合、それらはすべて、オーソライザーのキャッシュキーを取得するために使用されます。キャッシュキー部分のいずれかを変更すると、オーソライザーは、キャッシュされたポリシードキュメントを破棄し、新しいドキュメントを作成します。リクエストで複数の値を含むヘッダーが渡された場合、すべての値がキャッシュキーの一部になり、順序は保持されます。
      + キャッシングがオフの場合は、ID ソースを指定する必要はありません。
**注記**  
 キャッシングを有効にするには、認証は API 全体のすべてのメソッドに適用されるポリシーを返す必要があります。メソッド固有のポリシーを適用するには、**[認可のキャッシュ]** をオフにします。

1. **[オーソライザーの作成]** を選択します。

1. 前のステップでコピーした `aws lambda add-permission` コマンド文字列を、2 番目のアカウント用に設定された AWS CLI ウィンドウに貼り付けます。`AUTHORIZER_ID` をユーザーのオーソライザー ID に置き換えます。これにより、最初のアカウントから 2 番目のアカウントの Lambda オーソライザー関数へのアクセスが許可されます。

# Verified Permissions を使用して ID の属性に基づいてアクセスを制御する
<a name="apigateway-lambda-authorizer-verified-permissions"></a>

Amazon Verified Permissions を使用して、API Gateway API へのアクセスを制御します。Verified Permissions で API Gateway を使用すると、Verified Permissions によって Lambda オーソライザーが作成され、きめ細かな承認決定を使用して API へのアクセスが制御されます。Verified Permissions は、Cedar ポリシー言語を使用してポリシーストアスキーマとポリシーに基づいて呼び出し元を承認し、アプリケーションユーザーに対してきめ細かな権限を定義します。詳細については、「Amazon Verified Permissions ユーザーガイド」の「[接続された API と ID プロバイダーを使用してポリシーストアを作成する](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/getting-started-api-policy-store.html)」を参照してください。**

Verified Permissions は、ID ソースとして Amazon Cognito ユーザープールまたは OpenID Connect (OIDC) ID プロバイダーをサポートします。Verified Permissions は、プリンシパルが以前に識別および認証されていることを前提としています。Verified Permissions は、リージョンおよびエッジ最適化された REST API でのみサポートされています。

## Verified Permissions を使用して Lambda オーソライザーを作成する
<a name="apigateway-lambda-authorizer-verified-permissions-attach"></a>

Verified Permissions は、プリンシパルが API でアクションを実行できるかどうかを判断する Lambda オーソライザーを作成します。Verified Permissions が承認タスクを実行するために使用する Cedar ポリシーを作成します。

以下は、API の `GET /users` リソースの `developer` グループの Amazon Cognito ユーザープール、`us-east-1_ABC1234` に基づいて API を呼び出すアクセスを許可する Cedar ポリシーの例です。Verified Permissions は、呼び出し元の ID のベアラートークンを解析してグループメンバーシップを判別します。

```
permit(
  principal in MyAPI::UserGroup::"us-east-1_ABC1234|developer",
  action in [ MyAPI::Action::"get /users" ],
  resource
  );
```

オプションで、Verified Permissions は API のメソッドにオーソライザーをアタッチできます。API の本番稼働ステージでは、Verified Permissions にオーソライザーをアタッチさせないことをお勧めします。

次のリストは、Lambda オーソライザーを API のメソッドのメソッドリクエストにアタッチする、またはアタッチしないように Verified Permissions を設定する方法を示しています。

**オーソライザーをアタッチする (AWS マネジメントコンソール)**  
Verified Permissions コンソールで **[ポリシーストアを作成]** を選択し、**[アプリ統合のデプロイ]** ページで、**[今すぐ]** を選択します。

**オーソライザーをアタッチしない (AWS マネジメントコンソール)**  
Verified Permissions コンソールで **[ポリシーストアを作成]** を選択し、**[アプリ統合のデプロイ]** ページで、**[後で]** を選択します。  
Verified Permissions は、引き続き Lambda オーソライザーを作成します。Lambda オーソライザーは `AVPAuthorizerLambda-` で始まります。メソッドにオーソライザーをアタッチする方法の詳細については、「[Lambda オーソライザーを使用するようにメソッドを設定する (コンソール)](configure-api-gateway-lambda-authorization.md#configure-api-gateway-lambda-authorization-method-console)」を参照してください。

**オーソライザーをアタッチする (CloudFormation)**  
Verified Permissions で生成された CloudFormation テンプレートの `Conditions` セクションで、`"Ref": "shouldAttachAuthorizer"` を `true` に設定します。

**オーソライザーをアタッチしない (CloudFormation)**  
Verified Permissions で生成された CloudFormation テンプレートの `Conditions` セクションで、`"Ref": "shouldAttachAuthorizer"` を `false` に設定します。  
Verified Permissions は、引き続き Lambda オーソライザーを作成します。Lambda オーソライザーは `AVPAuthorizerLambda-` で始まります。メソッドにオーソライザーをアタッチする方法の詳細については、「[Lambda オーソライザーを使用するようにメソッドを設定する (AWS CLI)](configure-api-gateway-lambda-authorization.md#configure-api-gateway-lambda-authorization-method-cli)」を参照してください。

## Verified Permissions を使用して Lambda オーソライザーを呼び出す
<a name="apigateway-lambda-authorizer-verified-permissions-call"></a>

`Authorization` ヘッダーに ID トークンまたはアクセストークンを指定することで、Lambda オーソライザーを呼び出すことができます。詳細については、「[API Gateway Lambda オーソライザーで API を呼び出す](call-api-with-api-gateway-lambda-authorization.md)」を参照してください。

API Gateway は、Lambda オーソライザーが返すポリシーを 120 秒間キャッシュします。TTL は、API Gateway コンソールまたは AWS CLI を使用して変更できます。

# Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する
<a name="apigateway-integrate-with-cognito"></a>

[IAM ロールとポリシー](permissions.md)または [Lambda オーソライザー](apigateway-use-lambda-authorizer.md) (以前のカスタムオーソライザー) の代わりに、[Amazon Cognito ユーザープール](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html)を使用して、Amazon API Gateway の API にアクセスできるユーザーを制御します。

API で Amazon Cognito ユーザープールを使用するには、`COGNITO_USER_POOLS` タイプのオーソライザーを作成してから、そのオーソライザーを使用する API メソッドを構成する必要があります。API がデプロイされた後、クライアントはまずユーザーをユーザープールに署名し、ユーザーの [ID またはアクセストークン](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)を取得してから、トークンの 1 つ (通常はリクエストの `Authorization` ヘッダーに設定されている) で API メソッドを呼び出す必要があります。API 呼び出しは、必要なトークンが提供され、提供されたトークンが有効な場合にのみ成功します。そうでない場合、クライアントは認証された認証情報を持たないため呼び出しを許可されません。

ID トークンは、サインインされたユーザーの ID リクエストに基づいて API 呼び出しを承認するために使用されます。アクセストークンは、指定されたアクセス保護されたリソースのカスタムスコープに基づいて API 呼び出しを承認するために使用されます。詳細については、「[ユーザープールのトークンの使用](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)」および「[リソースサーバーおよびカスタムスコープの管理](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-define-resource-servers.html)」を参照してください。

API 用の Amazon Cognito ユーザープールを作成および設定するには、次のタスクを実行します。
+ Amazon Cognito コンソール、CLI/SDK、または API を使用して、ユーザープールを作成するか、別の AWS アカウントが所有するものを使用します。
+ API Gateway コンソール、CLI/SDK、または API を使用して、選択したユーザープールで API Gateway オーソライザーを作成します。
+ API Gateway コンソール、CLI/SDK、または API を使用して、選択した API メソッドでオーソライザーを有効にします。

 ユーザープールを有効にして API メソッドを呼び出すには、API クライアントで次のタスクを実行します。
+  Amazon Cognito CLI/SDK、または API を使用して、選択したユーザープールにユーザーをサインインし、ID トークンまたはアクセストークンを取得します。SDK の使用方法の詳細については、「[AWS SDK を使用した Amazon Cognito のコード例](https://docs.aws.amazon.com/cognito/latest/developerguide/service_code_examples.html)」を参照してください。
+  クライアント固有のフレームワークを使用して、デプロイされた API Gateway API を呼び出し、`Authorization` ヘッダーに適切なトークンを指定します。

API 開発者は、クライアント開発者に、ユーザープール ID、クライアント ID、および場合によってはユーザープールの一部として定義されている関連クライアントのシークレットを提供する必要があります。

**注記**  
ユーザーが Amazon Cognito の認証情報を使用してサインインし、IAM ロールのアクセス許可を使用するための一時的な認証情報を取得するには、[Amazon Cognito フェデレーテッドアイデンティティ](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html)を使用します。API リソースエンドポイントの HTTP メソッドごとに、認可タイプ、カテゴリ `Method Execution` を `AWS_IAM` に設定します。

このセクションでは、ユーザープールの作成方法、API Gateway API をユーザープールと統合する方法、ユーザープールと統合された API を呼び出す方法を説明します。

**Topics**
+ [

# REST API 用の Amazon Cognito ユーザープールを作成する
](apigateway-create-cognito-user-pool.md)
+ [

# REST API と Amazon Cognito ユーザープールを統合する
](apigateway-enable-cognito-user-pool.md)
+ [

# Amazon Cognito ユーザープールと統合された REST API を呼び出す
](apigateway-invoke-api-integrated-with-cognito-user-pool.md)
+ [

# API Gateway コンソールを使用して REST API 用のクロスアカウントの Amazon Cognito オーソライザーを設定する
](apigateway-cross-account-cognito-authorizer.md)
+ [

# CloudFormation を使用して REST API の Amazon Cognito オーソライザーを作成する
](apigateway-cognito-authorizer-cfn.md)

# REST API 用の Amazon Cognito ユーザープールを作成する
<a name="apigateway-create-cognito-user-pool"></a>

API をユーザープールと統合する前に、Amazon Cognito でユーザープールを作成する必要があります。ユーザープールの設定は、[Amazon Cognito のすべてのリソースクォータに従う必要があります](https://docs.aws.amazon.com/cognito/latest/developerguide/limits.html)。グループ、ユーザー、ロールなどのユーザー定義の Amazon Cognito 変数に使用できるのは、英数字だけです。ユーザープールを作成する方法については、*Amazon Cognito デベロッパーガイド*の「[チュートリアル: ユーザープールを作成する](https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-create-user-pool.html)」を参照してください。

ユーザープール ID、クライアント ID、クライアントシークレットをメモします。クライアントは、ユーザーがユーザープールに登録、サインインし、ユーザープールを使用して設定された API メソッドを呼び出すリクエストに含めるための ID またはアクセストークンを取得するために、それらを Amazon Cognito に提供する必要があります。また、API Gateway のオーソライザーとしてユーザープールを設定する場合、以下に説明するようにユーザープール名を指定する必要があります。

アクセストークンを使用して API メソッド呼び出しを承認している場合は、特定のリソースサーバーに必要なカスタムスコープを設定するために、ユーザープールとのアプリケーション統合を設定するようにしてください。Amazon Cognito ユーザープールでトークンを使用する方法の詳細については、「[ユーザープールでトークンを使用する](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)」を参照してください。リソースサーバーの詳細については、「[ユーザープールのリソースサーバーを定義する](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-define-resource-servers.html)」を参照してください。

設定されたリソースサーバー ID とカスタムスコープ名をメモしておきます。これらは、`COGNITO_USER_POOLS` オーソライザーが使用する [**OAuth スコープ**] のアクセススコープのフルネームを作成するために必要です。

![\[Amazon Cognito ユーザープールのリソースサーバーとスコープ\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/cognito-user-pool-custom-scopes-new-console.png)


# REST API と Amazon Cognito ユーザープールを統合する
<a name="apigateway-enable-cognito-user-pool"></a>

API Gateway で Amazon Cognito ユーザープールを作成し、そのユーザープールを使用する `COGNITO_USER_POOLS` オーソライザーを作成する必要があります。次の手順では、この操作を API Gateway コンソールを使用して行う方法について説明します。

**注記**  
[https://docs.aws.amazon.com/apigateway/latest/api/API_CreateAuthorizer.html](https://docs.aws.amazon.com/apigateway/latest/api/API_CreateAuthorizer.html) アクションを使用して、複数のユーザープールを使用する `COGNITO_USER_POOLS` オーソライザーを作成できます。1 つの `COGNITO_USER_POOLS` オーソライザーには最大 1,000 のユーザープールを使用できます。この制限を増やすことはできません。

**重要**  
以下の手順の実行後、API をデプロイまたは再デプロイして変更を伝達する必要があります。API のデプロイの詳細については、「[API Gateway で REST API をデプロイする](how-to-deploy-api.md)」を参照してください。

**API Gateway コンソールを使用して `COGNITO_USER_POOLS` 認証を作成するには**

1. 新しい API を作成、または API Gateway に既存の API を選択します。

1. メインナビゲーションペインで、**[オーソライザー]** を選択します。

1. **[オーソライザーの作成]** を選択します。

1. ユーザープールを使用するように新しいオーソライザーを設定するには、次の手順を実行します。

   1.  **[オーソライザー名]** に名前を入力します。

   1. **[オーソライザータイプ]** には、**[Cognito]** を選択します。

   1. **[Cognito ユーザープール]** では、Amazon Cognito を作成した場所 AWS リージョン を選択し、使用可能なユーザープールを選択します。

      ユーザープールを定義するには、ステージ変数を使用できます。ユーザープールには、形式として `arn:aws:cognito-idp:us-east-2:111122223333:userpool/${stageVariables.MyUserPool}` を使用します。

   1.  ユーザーがサインインした際に Amazon Cognito が返す ID またはアクセストークンを渡すように、**[トークンソース]** には、ヘッダー名として **Authorization** と入力します。

   1. (オプション) 必要に応じて **[トークン検証]** フィールドに正規表現を入力して、リクエストが Amazon Cognito で承認される前に ID トークンの `aud` (対象者) フィールドを検証します。アクセストークンを使用する場合、この検証では、アクセストークンが `aud` フィールドを含まないために要求が拒否されることに注意してください。

   1. **[オーソライザーの作成]** を選択します。

1. `COGNITO_USER_POOLS` オーソライザーを作成した後、ユーザープールからプロビジョニングされた ID トークンを指定して、呼び出しをテストできます。アクセストークンを使用してオーソライザーの呼び出しをテストすることはできません。

   [Amazon Cognito ID SDK](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-integrate-apps.html) を呼び出してユーザーサインインを実行することで、この ID トークンを取得できます。[https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) アクションも使用できます。**[認可スコープ]** を設定しない場合、API Gateway は指定されたトークンを ID トークンとして扱います。

前述の手順では、新しく作成した Amazon Cognito ユーザープールを使用する `COGNITO_USER_POOLS` オーソライザーを作成します。API メソッドでオーソライザーを有効にした方法に応じて、統合トークンまたは統合ユーザープールからプロビジョニングされたアクセストークンを使用できます。

**メソッドで `COGNITO_USER_POOLS` オーソライザーを設定するには**

1. **[リソース]** をクリックします。新しいメソッドを選択するか、既存のメソッドを選択します。必要に応じて、リソースを作成します。

1. **[メソッドリクエスト]** タブの **[メソッドリクエスト設定]** で、**[編集]** を選択します。

1. **[オーソライザー]** には、ドロップダウンメニューから、先ほど作成した **Amazon Cognito ユーザープールオーソライザー**を選択します。

1.  ID トークンを使用するには、次の操作を行います。

   1. **[認可スコープ]** は、空のままにします。

   1. 必要に応じて、**[統合リクエスト]** で、ユーザープールからバックエンドに特定の ID クレームプロパティを渡すために、本文マッピングテンプレートに `$context.authorizer.claims['property-name']` 式または `$context.authorizer.claims.property-name` 式を追加します。`sub` や`custom-sub` などの簡単なプロパティ名については、2 つの表記法は同じです。`custom:role` などの複雑なプロパティ名の場合、ドット表記は使用できません。たとえば、以下のマッピング式は、バックエンドに、クレームの `sub` および `email` の[標準フィールド](https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)を渡します。

      ```
      {
      	"context" : {
      		"sub" : "$context.authorizer.claims.sub",
      		"email" : "$context.authorizer.claims.email"
      	}
      }
      ```

      ユーザープールを設定するときにカスタムクレームフィールドを宣言した場合は、同じパターンに従ってカスタムフィールドにアクセスできます。次の例では、クレームの `role` カスタムフィールドを取得します。

      ```
      {
      	"context" : {
      		"role" : "$context.authorizer.claims.role"
          }
      }
      ```

      カスタムクレームフィールドが `custom:role` として宣言されている場合は、以下の例を使用してクレームのプロパティを取得します。

      ```
      {
      	"context" : {
      		"role" : "$context.authorizer.claims['custom:role']"
          }
      }
      ```

1.  アクセストークンを使用するには、次の操作を行います。

   1. **[認可スコープ]** には、Amazon Cognito ユーザープールが作成された際に設定されたスコープのフルネームを 1 つ以上入力します。たとえば、「[REST API 用の Amazon Cognito ユーザープールを作成する](apigateway-create-cognito-user-pool.md)」の例では、スコープの 1 つは `https://my-petstore-api.example.com/cats.read` です。

      実行時に、このステップのメソッドで指定されたスコープが、受信トークンで要求されているスコープと一致する場合、メソッド呼び出しは成功します。それ以外の場合、`401 Unauthorized` レスポンスでコールが失敗します。

   1.  **[保存]** を選択します。

1. 選択した他のメソッドにこれらの手順を繰り返してください。

`COGNITO_USER_POOLS` オーソライザーで、[**OAuth Scopes**] オプションが指定されていない場合、API Gateway は、指定されたトークンを ID トークンとして処理し、ユーザープールからのトークンに対して、要求された ID を検証します。それ以外の場合、API Gateway は提供されたトークンをアクセストークンとして処理し、トークンで要求されたアクセススコープをメソッドで宣言されている承認スコープと照合して検証します。

API Gateway コンソールを使う代わりに、OpenAPI 定義ファイル内で指定してメソッド上での Amazon Cognito ユーザープールを有効化し、API 定義を API Gateway にインポートすることもできます。

**OpenAPI 定義ファイルを使って COGNITO\$1USER\$1POOLS オーソライザーをインポートするには**

1. API 用の OpenAPI 定義ファイルを作成 (またはエクスポート) します。

1. OpenAPI 3.0 の `COGNITO_USER_POOLS` セクション、または Open API 2.0 の `MyUserPool` セクションの一部として、`securitySchemes` オーソライザー (`securityDefinitions`) JSON を次のように指定します。

------
#### [ OpenAPI 3.0 ]

   ```
     "securitySchemes": {
       "MyUserPool": {
         "type": "apiKey",
         "name": "Authorization",
         "in": "header",
         "x-amazon-apigateway-authtype": "cognito_user_pools",
         "x-amazon-apigateway-authorizer": {
           "type": "cognito_user_pools",
           "providerARNs": [
             "arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}"
           ]
         }
       }
   ```

------
#### [ OpenAPI 2.0 ]

   ```
     "securityDefinitions": {
       "MyUserPool": {
         "type": "apiKey",
         "name": "Authorization",
         "in": "header",
         "x-amazon-apigateway-authtype": "cognito_user_pools",
         "x-amazon-apigateway-authorizer": {
           "type": "cognito_user_pools",
           "providerARNs": [
             "arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}"
           ]
         }
       }
   ```

------

1. メソッドの認可にアイデンティティトークンを使用するには、ルートリソースの次の GET メソッドに示すように、メソッドの `{ "MyUserPool": [] }` 定義に `security` を追加します。

   ```
     "paths": {
       "/": {
         "get": {
           "consumes": [
             "application/json"
           ],
           "produces": [
             "text/html"
           ],
           "responses": {
             "200": {
               "description": "200 response",
               "headers": {
                 "Content-Type": {
                   "type": "string"
                 }
               }
             }
           },
           "security": [
             {
               "MyUserPool": []
             }
           ],        
           "x-amazon-apigateway-integration": {
             "type": "mock",
             "responses": {
               "default": {
                 "statusCode": "200",
                 "responseParameters": {
                   "method.response.header.Content-Type": "'text/html'"
                 },
               }
             },
             "requestTemplates": {
               "application/json": "{\"statusCode\": 200}"
             },
             "passthroughBehavior": "when_no_match"
           }
         },
         ...
      }
   ```

1.  メソッドの認可にアクセストークンを使用するには、上記のセキュリティ定義を `{ "MyUserPool": [resource-server/scope, ...] }` に変更します。

   ```
     "paths": {
       "/": {
         "get": {
           "consumes": [
             "application/json"
           ],
           "produces": [
             "text/html"
           ],
           "responses": {
             "200": {
               "description": "200 response",
               "headers": {
                 "Content-Type": {
                   "type": "string"
                 }
               }
             }
           },
           "security": [
             {
               "MyUserPool": ["https://my-petstore-api.example.com/cats.read", "http://my.resource.com/file.read"]
             }
           ],        
           "x-amazon-apigateway-integration": {
             "type": "mock",
             "responses": {
               "default": {
                 "statusCode": "200",
                 "responseParameters": {
                   "method.response.header.Content-Type": "'text/html'"
                 },
               }
             },
             "requestTemplates": {
               "application/json": "{\"statusCode\": 200}"
             },
             "passthroughBehavior": "when_no_match"
           }
         },
         ...
      }
   ```

1. 必要に応じて、OpenAPI 定義または拡張機能を使用し、他の API 設定を指定します。詳細については、「[API Gateway の OpenAPI 拡張機能](api-gateway-swagger-extensions.md)」を参照してください。

# Amazon Cognito ユーザープールと統合された REST API を呼び出す
<a name="apigateway-invoke-api-integrated-with-cognito-user-pool"></a>

設定されたユーザープールオーソライザーを使用して、メソッドを呼び出すには、クライアントは以下を実行する必要があります。
+ ユーザープールにサインアップすることを可能にします。
+ ユーザープールにサインインすることを可能にします。
+ ユーザープールからサインインしているユーザーの [ID またはアクセストークン](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)を取得します。
+ `Authorization` ヘッダー (または、オーソライザー作成時に指定した別のヘッダー) にトークンを含めます。

これらのタスクは、[AWS Amplify]() Amplify を使用して実行できます。詳細については、「[Integrating Amazon Cognito With Web and Mobile Apps (Amazon Cognito をウェブアプリおよびモバイルアプリとの統合) ](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-integrate-apps.html)」を参照してください。
+ Android の場合は、「[ Getting Started with Amplify for Android (Android 用 Amplify の使用開始) ](https://docs.amplify.aws/android/build-a-backend/auth/)」を参照してください。
+ iOS を使用するには、「[Getting started with Amplify for iOS (iOS 版 Amplify の使用開始) ](https://docs.amplify.aws/swift/build-a-backend/auth/)」を参照してください。
+ JavaScript を使用するには、「[Getting Started with Amplify for Javascript (Javascript のアンプリファイの使用開始 ) ](https://docs.amplify.aws/javascript/build-a-backend/auth/)」を参照してください。

# API Gateway コンソールを使用して REST API 用のクロスアカウントの Amazon Cognito オーソライザーを設定する
<a name="apigateway-cross-account-cognito-authorizer"></a>

Amazon Cognito ユーザープールは、API オーソライザーとは異なる AWS アカウントからも使用できるようになりました。Amazon Cognito ユーザープールでは、OAuth や SAML などのベアラートークン認証戦略を使用できます。これにより、複数の API Gateway API 間で簡単に一元管理し、主要な Amazon Cognito ユーザープールオーソライザーを共有できるようになります。

このセクションでは、Amazon API Gateway コンソールを使用して、クロスアカウント Amazon Cognito ユーザープールを設定する方法について説明します。

これらの手順は、AWS アカウントに API Gateway API、別のアカウントに Amazon Cognito ユーザープールが設定されていることを前提としています。

## REST API のクロスアカウント Amazon Cognito オーソライザーを作成する
<a name="apigateway-configure-cross-account-cognito-authorizer"></a>

API を設定しているアカウントで Amazon API Gateway コンソールにサインインし、以下の操作を行います。

1. 新しい API を作成、または API Gateway に既存の API を選択します。

1. メインナビゲーションペインで、**[オーソライザー]** を選択します。

1. **[オーソライザーの作成]** を選択します。

1. ユーザープールを使用するように新しいオーソライザーを設定するには、次の手順を実行します。

   1.  **[オーソライザー名]** に名前を入力します。

   1. **[オーソライザータイプ]** には、**[Cognito]** を選択します。

   1. **[Cognito ユーザープール]** で、2 番目のアカウントで作成したユーザープールの完全な ARN を入力します。
**注記**  
Amazon Cognito コンソールでは、ユーザープールの ARN は、[**全般設定**] ペインの [**プール ARN**] フィールドにあります。

   1.  ユーザーがサインインした際に Amazon Cognito が返す ID またはアクセストークンを渡すように、**[トークンソース]** には、ヘッダー名として **Authorization** と入力します。

   1. (オプション) 必要に応じて **[トークン検証]** フィールドに正規表現を入力して、リクエストが Amazon Cognito で承認される前に ID トークンの `aud` (対象者) フィールドを検証します。アクセストークンを使用する場合、この検証では、アクセストークンが `aud` フィールドを含まないために要求が拒否されることに注意してください。

   1. **[オーソライザーの作成]** を選択します。

# CloudFormation を使用して REST API の Amazon Cognito オーソライザーを作成する
<a name="apigateway-cognito-authorizer-cfn"></a>

CloudFormation を使用して、Amazon Cognito ユーザープールと Amazon Cognito オーソライザーを作成できます。この例の CloudFormation テンプレートでは、次のような処理を実行します。
+ Amazon Cognito ユーザープールを作成します。クライアントは、まずユーザーをユーザープールにサインインし、[ID トークンまたはアクセストークン](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)を取得する必要があります。アクセストークンを使用して API メソッド呼び出しを承認している場合は、特定のリソースサーバーに必要なカスタムスコープを設定するために、ユーザープールとのアプリケーション統合を設定するようにしてください。
+ `GET` メソッドを使用して API Gateway API を作成します。
+ `Authorization` ヘッダーをトークンソースとして使用する Amazon Cognito オーソライザーを作成します。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  UserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      AccountRecoverySetting:
        RecoveryMechanisms:
          - Name: verified_phone_number
            Priority: 1
          - Name: verified_email
            Priority: 2
      AdminCreateUserConfig:
        AllowAdminCreateUserOnly: true
      EmailVerificationMessage: The verification code to your new account is {####}
      EmailVerificationSubject: Verify your new account
      SmsVerificationMessage: The verification code to your new account is {####}
      VerificationMessageTemplate:
        DefaultEmailOption: CONFIRM_WITH_CODE
        EmailMessage: The verification code to your new account is {####}
        EmailSubject: Verify your new account
        SmsMessage: The verification code to your new account is {####}
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
  CogAuthorizer:
    Type: AWS::ApiGateway::Authorizer
    Properties:
      Name: CognitoAuthorizer
      RestApiId:
        Ref: Api
      Type: COGNITO_USER_POOLS
      IdentitySource: method.request.header.Authorization
      ProviderARNs:
        - Fn::GetAtt:
            - UserPool
            - Arn
  Api:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Name: MyCogAuthApi
  ApiDeployment:
    Type: AWS::ApiGateway::Deployment
    Properties:
      RestApiId:
        Ref: Api
    DependsOn:
      - CogAuthorizer
      - ApiGET
  ApiDeploymentStageprod:
    Type: AWS::ApiGateway::Stage
    Properties:
      RestApiId:
        Ref: Api
      DeploymentId:
        Ref: ApiDeployment
      StageName: prod
  ApiGET:
    Type: AWS::ApiGateway::Method
    Properties:
      HttpMethod: GET
      ResourceId:
        Fn::GetAtt:
          - Api
          - RootResourceId
      RestApiId:
        Ref: Api
      AuthorizationType: COGNITO_USER_POOLS
      AuthorizerId:
        Ref: CogAuthorizer
      Integration:
        IntegrationHttpMethod: GET
        Type: HTTP_PROXY
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets
Outputs:
  ApiEndpoint:
    Value:
      Fn::Join:
        - ""
        - - https://
          - Ref: Api
          - .execute-api.
          - Ref: AWS::Region
          - "."
          - Ref: AWS::URLSuffix
          - /
          - Ref: ApiDeploymentStageprod
          - /
```

# API Gateway での REST API の統合
<a name="how-to-integration-settings"></a>

 API メソッドを設定したら、バックエンドのエンドポイントに統合する必要があります。バックエンドのエンドポイントは、統合エンドポイントとも呼ばれ、Lambda 関数、HTTP ウェブページ、または AWS のサービスアクションにすることができます。

API メソッドと同様に、API 統合には統合リクエストと統合レスポンスがあります。統合リクエストは、バックエンドが受け取った HTTP リクエストをカプセル化します。これは、クライアントが送ったメソッドリクエストと同じ場合もあれば異なる場合もあります。統合レスポンスは、バックエンドが返した出力をカプセル化する HTTP レスポンスです。

統合リクエストの設定には、クライアントから送信さられたメソッドリクエストをバックエンドに渡す方法の設定、必要に応じてリクエストデータを統合リクエストデータに変換する方法の設定、呼び出す Lambda 関数の指定、受け取ったリクエストを転送する HTTP サーバーの指定、呼び出す AWS のサービスアクションの指定が含まれます。

統合レスポンスの設定には、(非プロキシ統合の場合のみ) バックエンドが返す結果を特定のステータスコードのメソッドレスポンスに渡す方法の設定、指定した統合レスポンスパラメータを事前設定されたメソッドレスポンスパラメータに変換する方法の設定、指定した本文マッピングテンプレートに従って統合レスポンス本文をメソッドレスポンス本文にマップする方法の設定が含まれます。

プログラムで、統合リクエストは [https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) リソースにカプセル化し、統合レスポンスは API Gateway の [https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html) リソースにカプセル化します。

統合リクエストを設定するには、[https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) リソースを作成し、そのリソースを使用して統合エンドポイント URL を設定します。次に、バックエンドにアクセスするための IAM アクセス許可を設定し、受け取ったリクエストデータをバックエンドに渡す前に変換するためのマッピングを指定します。非プロキシ統合の場合、統合レスポンスを設定するには、[https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html) リソースを作成し、そのリソースを使用してターゲットメソッドレスポンスを設定します。その後、バックエンド出力をメソッドレスポンスにマップする方法を設定します。

**Topics**
+ [

# API Gateway で統合リクエストを設定する
](api-gateway-integration-settings-integration-request.md)
+ [

# API Gateway で統合レスポンスを設定する
](api-gateway-integration-settings-integration-response.md)
+ [

# API Gateway での REST API の Lambda 統合
](set-up-lambda-integrations.md)
+ [

# API Gateway での REST API の HTTP 統合
](setup-http-integrations.md)
+ [

# API Gateway でプロキシ統合の統合レスポンスをストリーミングする
](response-transfer-mode.md)
+ [

# API Gateway での REST API のプライベート統合
](private-integration.md)
+ [

# API Gateway での REST API の Mock 統合
](how-to-mock-integration.md)

# API Gateway で統合リクエストを設定する
<a name="api-gateway-integration-settings-integration-request"></a>

統合リクエストを設定するには、以下の必須およびオプションのタスクを実行します。

1.  統合タイプを選択します。このタイプによってメソッドリクエストデータをバックエンドに渡す方法が決まります。

1.  非モック統合の場合 (`MOCK` 統合以外の場合)、HTTP メソッドとターゲット統合エンドポイントの URI を指定します。

1.  Lambda 関数および AWS の他のサービスアクションとの統合の場合、API Gateway がお客様に代わってバックエンドを呼び出すために必要なアクセス許可を持つように IAM ロールを設定します。

1.  非プロキシ統合の場合、事前定義されたメソッドリクエストパラメータを該当する統合リクエストパラメータにマップするために必要なパラメータマッピングを設定します。

1.  非プロキシ統合の場合、受け取った特定のコンテンツタイプのメソッドリクエストボディをマップするために必要な本文マッピングを、指定したマッピングテンプレートに従って設定します。

1.  非プロキシ統合の場合、受け取ったメソッドリクエストデータをそのままバックエンドに渡す条件を指定します。

1.  オプションで、バイナリペイロードの型変換の処理方法を指定します。

1.  オプションで、キャッシュ名前空間名とキャッシュキーパラメータを宣言して API キャッシングを有効にします。

 これらのタスクを実行するには、API Gateway の[統合](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html)リソースを作成し、適切なプロパティ値を設定する必要があります。これを行うには、API Gateway コンソール、AWS CLI コマンド、AWS SDK、または API Gateway REST API を使用します。

**Topics**
+ [

# API 統合リクエストの基本タスク
](integration-request-basic-setup.md)
+ [

# API Gateway API 統合タイプの選択
](api-gateway-api-integration-types.md)
+ [

# プロキシリソースとのプロキシ統合を設定する
](api-gateway-set-up-simple-proxy.md)
+ [

# API Gateway コンソールを使用して API 統合リクエストを設定する
](how-to-method-settings-console.md)

# API 統合リクエストの基本タスク
<a name="integration-request-basic-setup"></a>

 統合リクエストは、API Gateway がバックエンドに送る HTTP リクエストであり、クライアントから送信されたリクエストデータを渡し、必要に応じて変換します。統合リクエストの HTTP メソッド (つまり動詞) と URI は、バックエンド (つまり統合エンドポイント) が指定します。HTTP メソッドと URI はそれぞれ、メソッドリクエストのものと同じ場合もあれば異なる場合もあります。

たとえば、Lambda 関数が、Amazon S3 からフェッチされたファイルを返す場合、このオペレーションを直観的に `GET` メソッドリクエストとしてクライアントに公開できます。これは、対応する統合リクエストで `POST` リクエストを使用して Lambda 関数を呼び出す必要があっても同じです。HTTP エンドポイントの場合は、メソッドリクエストおよび対応する統合リクエストの両方で同じ HTTP 動詞を使用することがよくあります。ただし、これは必須ではありません。以下のメソッドリクエストがあるとします。

```
GET /{var}?query=value
Host: api.domain.net
```

これを以下の統合リクエストに統合できます。

```
POST /
Host: service.domain.com
Content-Type: application/json
Content-Length: ...

{
   path: "{var}'s value",
   type: "value"
}
```

 API 開発者は、要件に合わせてどのような HTTP 動詞と URI でもメソッドリクエストに使用できます。しかし、統合エンドポイントの要件に従う必要があります。メソッドリクエストデータが統合リクエストデータと異なる場合、メソッドリクエストデータから統合リクエストデータへのマッピングを提供することで、その差異を調整できます。

ここまでの例では、マッピングにより、`{var}` メソッドリクエストのパス変数 (`query`) とクエリパラメータ (`GET`) の値が、統合リクエストのペイロードプロパティ `path` と `type` の値に変換されます。その他のマップ可能なリクエストデータとしては、リクエストのヘッダーと本文があります。これらについては、「[API Gateway の REST API パラメータマッピング](rest-api-parameter-mapping.md)」で説明しています。

HTTP または HTTP プロキシ統合リクエストを設定するときは、バックエンド HTTP エンドポイント URL を統合リクエスト URI 値として割り当てます。たとえば、PetStore API では、pets のページを取得するメソッドリクエストに以下の統合リクエスト URI があります。

```
http://petstore-demo-endpoint.execute-api.com/petstore/pets
```

Lambda または Lambda プロキシ統合を設定するときは、Lambda 関数を呼び出すための Amazon リソースネーム (ARN) を統合リクエスト URI 値として割り当てます。この ARN は以下の形式になります。

```
arn:aws:apigateway:api-region:lambda:path//2015-03-31/functions/arn:aws:lambda:lambda-region:account-id:function:lambda-function-name/invocations
```

`arn:aws:apigateway:api-region:lambda:path/` の後の部分、つまり、`/2015-03-31/functions/arn:aws:lambda:lambda-region:account-id:function:lambda-function-name/invocations` は、Lambda の [Invoke](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html) アクションの REST API URI パスです。API Gateway コンソールを使用して Lambda 統合を設定する場合は、API Gateway によって ARN が作成され、統合 URI に割り当てられます。ただし、その前にリージョンから `lambda-function-name` を選択するように求められます。

AWS の別のサービスアクションとの統合リクエストを設定する場合、統合リクエスト URI は ARN でもあります。これは、Lambda `Invoke` アクションとの統合と同様です。たとえば、Amazon S3 の [GetBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html) アクションとの統合の場合、統合リクエスト URI は以下の形式の ARN です。

```
arn:aws:apigateway:api-region:s3:path/{bucket}
```

統合リクエスト URI は、アクションを指定するためのパス規約です。ここで、`{bucket}` はバケット名のプレースホルダーです。または、AWS のサービスアクションをその名前で参照することもできます。アクション名を使用すると、Amazon S3 の `GetBucket` アクションの統合リクエスト URI は以下のようになります。

```
arn:aws:apigateway:api-region:s3:action/GetBucket
```

アクションベースの統合リクエスト URI では、`{bucket}` アクションの入力形式に従って、バケット名 (`{ Bucket: "{bucket}" }`) を統合リクエストボディ (`GetBucket`) で指定する必要があります。

AWS 統合の場合、[認証情報](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html#credentials)を設定して、API Gateway が統合アクションを呼び出せるようにする必要もあります。新しい IAM ロールを作成するか既存のものを選択して、API Gateway がそのアクションを呼び出せるようにしたら、そのロールを ARN で指定できます。以下に示しているのは、この ARN の例です。

```
arn:aws:iam::account-id:role/iam-role-name
```

この IAM ロールには、アクションの実行を許可するポリシーが含まれている必要があります。また、そのロールを引き受ける信頼されたエンティティとして API Gateway を (ロールの信頼関係で) 宣言する必要があります。そのようなアクセス権限はアクション自体に対して付与できます。それらはリソースベースのアクセス権限と呼ばれます。Lambda 統合の場合、Lambda の [addPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html) アクションを呼び出して、リソースベースのアクセス許可を設定したら、API Gateway 統合リクエストで `credentials` を null に設定できます。

統合の基本設定については説明しました。詳細設定には、メソッドリクエストデータから統合リクエストデータへのマッピングが含まれます。詳細については、「[API Gateway での REST API のデータ変換](rest-api-data-transformations.md)」を参照してください。

# API Gateway API 統合タイプの選択
<a name="api-gateway-api-integration-types"></a>



 使用する統合エンドポイントのタイプと、統合エンドポイントに対するデータの受け渡し方法に応じて、API 統合タイプを選択します。Lambda 関数の場合は、Lambda プロキシ統合または Lambda カスタム統合を使用できます。HTTP エンドポイントの場合、HTTP プロキシ統合または HTTP カスタム統合を使用できます。AWS サービスアクションの場合、非プロキシタイプの AWS 統合のみを使用します。API Gateway はモック統合もサポートしています。この場合、API Gateway はメソッドリクエストに応答する統合エンドポイントとして機能します。

Lambda カスタム統合は、AWS 統合の特殊なケースであり、統合エンドポイントが Lambda サービスの [function-invoking](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html) アクションに対応します。

[https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) リソースで [https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html#type](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html#type) プロパティを設定することによって、プログラムで統合タイプを選択します。Lambda プロキシ統合の場合、その値は `AWS_PROXY` です。Lambda カスタム統合とその他すべての AWS 統合の場合、その値は `AWS` です。HTTP プロキシ統合と HTTP 統合の場合、その値はそれぞれ `HTTP_PROXY` と `HTTP` です。Mock 統合の場合、`type` 値は `MOCK` です。

Lambda プロキシ統合は、1 つの Lambda 関数との合理化された統合設定をサポートしています。設定はシンプルで、既存の設定を破棄することなくバックエンドで拡張できます。このような理由から、Lambda 関数との統合を強くお勧めします。

これとは対照的に、Lambda カスタム統合では、入出力データ形式の要件が同様のさまざまな統合エンドポイントに対して、設定済みのマッピングテンプレートを再利用できます。この統合ではより詳細な設定が可能なため、より高度なアプリケーションシナリオにお勧めします。

同様に、HTTP プロキシ統合にも合理化された統合設定があり、既存の設定を破棄することなくバックエンドで拡張できます。HTTP カスタム統合では設定はより詳細になりますが、設定済みのマッピングテンプレートは他の統合エンドポイントに再利用できます。

以下のリストは、サポートされている統合タイプをまとめたものです。
+ `AWS`: このタイプの統合では、API は AWS のサービスアクションを公開します。`AWS` 統合では、統合リクエストと統合レスポンスの両方を設定し、メソッドリクエストから統合リクエストへの、また統合レスポンスからメソッドレスポンスへの、データマッピングを設定する必要があります。
+  `AWS_PROXY`: このタイプの統合では、さまざまな用途に柔軟に利用できる合理化された統合設定があり、API メソッドを Lambda 関数呼び出しアクションと統合できます。この統合は、クライアントと統合 Lambda 関数との間の直接的なやり取りに依存します。

  このタイプの統合は、Lambda プロキシ統合とも呼ばれ、お客様が統合リクエストまたは統合レスポンスを設定することはありません。API Gateway は、クライアントから受け取ったリクエストをバックエンドの Lambda 関数への入力として渡します。統合 Lambda 関数は、[この形式の入力](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format)を受け取り、使用可能なすべてのソースからの入力 (リクエストヘッダー、URL パス変数、クエリ文字列パラメータ、該当する本文など) を解析します。その後、こちらの[出力形式](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-output-format)に従って結果を返します。

  これは、API Gateway を介した Lambda 関数呼び出しに適した統合タイプであり、関数呼び出しアクション以外の Lambda アクションなど、AWS の他のサービスアクションには適用されません。
+ `HTTP`: このタイプの統合は、API がバックエンドの HTTP エンドポイントを公開することを可能にします。`HTTP` 統合 (HTTP カスタム統合とも呼ばれます) では、統合リクエストと統合レスポンスの両方を設定する必要があります。メソッドリクエストから統合リクエストへの、また統合レスポンスからメソッドレスポンスへの、データマッピングを設定する必要があります。
+  `HTTP_PROXY`: HTTP プロキシ統合では、クライアントは 1 つの API メソッドで合理化された統合設定を使用して、バックエンド HTTP エンドポイントにアクセスできます。この場合、お客様が統合リクエストまたは統合レスポンスを設定することはありません。API Gateway は、クライアントから受け取ったリクエストを HTTP エンドポイントに渡し、HTTP エンドポイントから送り出されたレスポンスをクライアントに渡します。
+ `MOCK`: このタイプの統合では、API Gateway はリクエストをさらにバックエンドに送信することなく、レスポンスを返します。このタイプの統合は、API のテストに便利です。バックエンドの使用料金が発生することなく、統合設定のテストに使用したり、API の共同開発に使用したりできるためです。

  共同開発では、チームは `MOCK` 統合を使用して、他のチームが所有する API コンポーネントのシミュレーションを設定することで、自分たちの開発成果を区分することもできます。また、CORS 関連のヘッダーを返して、API メソッドが CORS へのアクセスを許可するようにもできます。実際に、API Gateway コンソールは Mock 統合で `OPTIONS` メソッドを統合して CORS をサポートします。[ゲートウェイレスポンス ](api-gateway-gatewayResponse-definition.md#customize-gateway-responses) は Mock 統合の他の例です。

# プロキシリソースとのプロキシ統合を設定する
<a name="api-gateway-set-up-simple-proxy"></a>

API Gateway API で[プロキシリソース](api-gateway-method-settings-method-request.md#api-gateway-proxy-resource)とのプロキシ統合を設定するには、以下のタスクを実行します。
+ greedy パス変数 `{proxy+}` を使用してプロキシリソースを作成します。
+ プロキシリソースに `ANY` メソッドを設定します。
+ HTTP または Lambda 統合タイプを使用してリソースおよびメソッドをバックエンドに統合します。

**注記**  
greedy パス変数、`ANY` メソッド、およびプロキシ統合タイプは、よく一緒に使用されますが独立した機能です。特定の HTTP メソッドを greedy リソースに設定することも、プロキシ以外の統合タイプをプロキシリソースに適用することもできます。

API Gateway は、Lambda プロキシ統合または HTTP プロキシ統合を使用した処理方法に一定の制約と制限を設定しています。詳細については、「[Amazon API Gateway に関する重要な注意点](api-gateway-known-issues.md)」を参照してください。

**注記**  
 パススルーによるプロキシの統合の使用時に、ペイロードのコンテンツタイプを指定していない場合は、API Gateway からデフォルトの `Content-Type:application/json` ヘッダーが返されます。

プロキシリソースが最も便利なのは、HTTP プロキシ統合または Lambda プロキシ[統合](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html)のいずれかを使用してバックエンドと統合されている場合です。

## プロキシリソースとの HTTP プロキシ統合
<a name="api-gateway-proxy-integration-types"></a>

API Gateway REST API の `HTTP_PROXY` によって指定される HTTP プロキシ統合は、メソッドリクエストをバックエンドの HTTP エンドポイントと統合するために使用します。この統合タイプでは、API Gateway は、一定の[制約と制限](api-gateway-known-issues.md)に従って、フロントエンドとバックエンドとの間でリクエストとレスポンスの全体を渡すだけです。

**注記**  
HTTP プロキシ統合では、複数の値を持つヘッダーやクエリ文字列がサポートされます。

HTTP プロキシ統合をプロキシリソースに適用するときは、単一の統合セットアップを使用して、HTTP バックエンドのエンドポイント階層の一部または全体を公開するように API を設定できます。たとえば、バックエンドのウェブサイトがルートノード (`/site`) からツリーノードで複数のブランチとして編成されているとします (`/site/a0/a1/.../aN`、`/site/b0/b1/.../bM` など)。`ANY` の URL パスを使用して `/api/{proxy+}` のプロキシリソースで `/site/{proxy}` メソッドをバックエンドのエンドポイントと統合した場合、単一の統合リクエストで、`[a0, a1, ..., aN, b0, b1, ...bM, ...]` のいずれかで HTTP オペレーション (GET、POST など) をサポートできます。代わりに、特定の HTTP メソッド (たとえば `GET`) にプロキシ統合を適用した場合、返される統合リクエストは、それらの任意のバックエンドノードに対して指定したオペレーション (つまり `GET`) で有効です。

## プロキシリソースとの Lambda プロキシ統合
<a name="lambda-proxy-integration-with-proxy-resource"></a>

API Gateway REST API の `AWS_PROXY` によって指定される Lambda プロキシ統合は、メソッドリクエストをバックエンドの Lambda 関数と統合するために使用します。この統合タイプでは、API Gateway はデフォルトのマッピングテンプレートを適用してリクエスト全体を Lambda 関数に送信し、Lambda 関数の出力を HTTP レスポンスに変換します。

同様に、Lambda プロキシ統合を `/api/{proxy+}` のプロキシリソースに適用して単一の統合を設定し、バックエンドの Lambda 関数を `/api` の下位にある任意の API リソースでの変更に個別に対応させることができます。

# API Gateway コンソールを使用して API 統合リクエストを設定する
<a name="how-to-method-settings-console"></a>

 API メソッドの設定でメソッドとその動作を定義します。メソッドを設定するには、メソッドが公開されるリソース (ルート ("/") を含む)、HTTP メソッド (`GET`、`POST` など)、ターゲットバックエンドとの統合方法を指定する必要があります。メソッドのリクエストと応答によって、APIはどのパラメータを受け取ることができ、応答はどのようなものかを明記し、呼び出し元アプリケーションとの取り決めが指定されます。

 以下の手順では、API Gateway コンソールを使用して統合リクエストを作成する方法を示します。

**Topics**
+ [

## Lambda 統合をセットアップする
](#how-to-method-settings-console-lambda)
+ [

## HTTP 統合をセットアップする
](#how-to-method-settings-console-http)
+ [

## AWS のサービス統合をセットアップする
](#how-to-method-settings-console-aws)
+ [

## Mock 統合をセットアップする
](#how-to-method-settings-console-mock)

## Lambda 統合をセットアップする
<a name="how-to-method-settings-console-lambda"></a>

Lambda 関数統合を使用して、API を Lambda 関数と統合します。API レベルで、非プロキシ統合を作成する場合はこれが `AWS` 統合タイプになり、`AWS_PROXY`プロキシ統合を作成する場合は 統合タイプになります。

**Lambda 統合をセットアップするには**

1. **[リソース]** ペインで、**[メソッドの作成]** を選択します。

1. **[メソッドタイプ]** には [HTTP メソッド] を選択します。

1. [**統合タイプ**] で、[**Lambda 関数**] を選択します。

1. Lambda プロキシ統合を使用するには、**[Lambda プロキシ統合]** をオンにします。Lambda プロキシ統合の詳細については、「[API Gateway Lambda プロキシの統合について理解する](set-up-lambda-proxy-integrations.md#api-gateway-create-api-as-simple-proxy)」を参照してください。

1. **[Lambda 関数]** に、Lambda 関数の名前を入力します。

    API とは異なるリージョンで Lambda 関数を使用している場合は、ドロップダウンメニューからリージョンを選択し、Lambda 関数の名前を入力します。クロスアカウントの Lambda 関数を使用している場合は、関数 ARN を入力します。

1. 29 秒のデフォルトのタイムアウト値を使用するには、**[デフォルトタイムアウト]** をオンのままにします。カスタムのタイムアウトを設定するには、**[デフォルトタイムアウト]** を選択してから、タイムアウト値を `50` ～ `29000` ミリ秒の間で入力します。

1. (オプション) 以下のドロップダウンメニューを使用して、メソッドリクエストの設定を構成できます。**[メソッドリクエストの設定]** を選択し、メソッドリクエストを設定します。詳細については、「[API Gateway コンソールで API Gateway メソッドリクエストを編集する](how-to-set-up-method-using-console.md#how-to-method-settings-callers-console)」のステップ 3 を参照してください。

   メソッドを作成した後で、メソッドリクエストの設定を構成することもできます。

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

## HTTP 統合をセットアップする
<a name="how-to-method-settings-console-http"></a>

HTTP 統合を使用して、API を HTTP エンドポイントと統合します。API レベルで、これは `HTTP` 統合タイプです。

**HTTP 統合をセットアップするには**

1. **[リソース]** ペインで、**[メソッドの作成]** を選択します。

1. **[メソッドタイプ]** には [HTTP メソッド] を選択します。

1. **[統合タイプ]** で､ **[HTTP]** を選択します｡

1. HTTP プロキシ統合を使用するには、**[HTTP プロキシ統合]** をオンにします。HTTP プロキシ統合の詳細については、「[API Gateway の HTTP プロキシ統合を設定する](setup-http-integrations.md#api-gateway-set-up-http-proxy-integration-on-proxy-resource)」を参照してください。

1. [**HTTP メソッド**] で、HTTP バックエンドのメソッドに最も厳密に一致する HTTP メソッドタイプを選択します。

1. **[エンドポイント URL]** に、メソッドで使用する HTTP バックエンドの URL を入力します。

1. **[コンテンツ処理]** には、コンテンツ処理動作を選択します。

1. 29 秒のデフォルトのタイムアウト値を使用するには、**[デフォルトタイムアウト]** をオンのままにします。カスタムのタイムアウトを設定するには、**[デフォルトタイムアウト]** を選択してから、タイムアウト値を `50` ～ `29000` ミリ秒の間で入力します。

1. (オプション) 以下のドロップダウンメニューを使用して、メソッドリクエストの設定を構成できます。**[メソッドリクエストの設定]** を選択し、メソッドリクエストを設定します。詳細については、「[API Gateway コンソールで API Gateway メソッドリクエストを編集する](how-to-set-up-method-using-console.md#how-to-method-settings-callers-console)」のステップ 3 を参照してください。

   メソッドを作成した後で、メソッドリクエストの設定を構成することもできます。

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

## AWS のサービス統合をセットアップする
<a name="how-to-method-settings-console-aws"></a>

AWS のサービス統合を使用して、API を AWS のサービスと直接統合します。API レベルで、これは `AWS` 統合タイプです。

次のいずれかを実行するために IAM API Gateway を作成するには:
+ 新しい Lambda 関数の作成
+ Lambda 関数へのリソース許可を設定します。
+ その他の Lambda サービスアクションを実行します。

**[AWS のサービス]** を選択する必要があります。

**AWS のサービス統合をセットアップするには**

1. **[リソース]** ペインで、**[メソッドの作成]** を選択します。

1. **[メソッドタイプ]** には [HTTP メソッド] を選択します。

1. **[統合タイプ]** で､**[AWS のサービス]** を選択します｡

1. [**AWS リージョン**] で、このメソッドがアクションの呼び出しに使用する AWS リージョンを選択します。

1. **[AWS のサービス]** で、このメソッドが呼び出す AWS のサービスを選択します。

1.  **[AWS サブドメイン]** に、AWS のサービスで使用されるサブドメインを入力します。通常、このフィールドは空欄にします。一部の AWS のサービスでは、ホストの一部としてサブドメインをサポートすることができます。可用性と詳細は、サービスのドキュメントを参照してください。

1. [**HTTP メソッド**] で、アクションに対応する HTTP メソッドタイプを選択します。適切な HTTP メソッドタイプについては、**[AWS のサービス]** で選択した AWS サービスの API リファレンスドキュメントを参照してください。

1. **[アクションタイプ]** には、API アクションを使用する場合は **[アクション名の使用]** を、カスタムリソースパスを使用する場合は **[パス上書きの使用]** を選択します。利用できるアクションとカスタムリソースパスについては、**[AWS のサービス]** で選択した AWS のサービスに関する API リファレンスドキュメントを参照してください。

1. **[アクション名]** または **[パス上書き]** のいずれかを入力します。

1. **[実行ロール]** には、メソッドがアクションの呼び出しに使用する IAM ロールの ARN を入力します。

   IAM ロールを作成するには、[ステップ 1: AWS のサービスプロキシの実行ロールを作成する](getting-started-aws-proxy.md#getting-started-aws-proxy-add-roles) の指示を使用できます。アクセスポリシーを、必要な数のアクションおよびリソースステートメントと共に指定します。詳細については、「[Amazon API Gateway と IAM の連携方法](security_iam_service-with-iam.md)」を参照してください。

   アクションおよびリソースステートメントの構文については、**[AWS のサービス]** で選択した AWS サービスのドキュメントを参照してください。

   IAM ロールの信頼関係で、以下のように指定して、API Gateway が AWS アカウントに代わってアクションを実行できるようにします。

------
#### [ JSON ]

****  

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

------

1. 29 秒のデフォルトのタイムアウト値を使用するには、**[デフォルトタイムアウト]** をオンのままにします。カスタムのタイムアウトを設定するには、**[デフォルトタイムアウト]** を選択してから、タイムアウト値を `50` ～ `29000` ミリ秒の間で入力します。

1. (オプション) 以下のドロップダウンメニューを使用して、メソッドリクエストの設定を構成できます。**[メソッドリクエストの設定]** を選択し、メソッドリクエストを設定します。詳細については、「[API Gateway コンソールで API Gateway メソッドリクエストを編集する](how-to-set-up-method-using-console.md#how-to-method-settings-callers-console)」のステップ 3 を参照してください。

   メソッドを作成した後で、メソッドリクエストの設定を構成することもできます。

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

## Mock 統合をセットアップする
<a name="how-to-method-settings-console-mock"></a>

 API Gateway をバックエンドとして使用して静的レスポンスを返す場合は、Mock 統合を使用します。API レベルで、これは `MOCK` 統合タイプです。一般的に、API が最終版ではないものの、テスト用に API レスポンスを生成して関連チームのブロックを解除する場合は、`MOCK` 統合を使用します。`OPTION` メソッドの場合、API Gateway は、適用された API リソースに CORS が有効のヘッダーを返すように `MOCK` 統合をデフォルトに設定します。

**Mock 統合をセットアップするには**

1. **[リソース]** ペインで、**[メソッドの作成]** を選択します。

1. **[メソッドタイプ]** には [HTTP メソッド] を選択します。

1. **[統合タイプ]** で､ **[Mock]** を選択します｡

1. (オプション) 以下のドロップダウンメニューを使用して、メソッドリクエストの設定を構成できます。**[メソッドリクエストの設定]** を選択し、メソッドリクエストを設定します。詳細については、「[API Gateway コンソールで API Gateway メソッドリクエストを編集する](how-to-set-up-method-using-console.md#how-to-method-settings-callers-console)」のステップ 3 を参照してください。

   メソッドを作成した後で、メソッドリクエストの設定を構成することもできます。

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

# API Gateway で統合レスポンスを設定する
<a name="api-gateway-integration-settings-integration-response"></a>

 非プロキシ統合の場合、1 つ以上の統合レスポンスを設定し、デフォルトのレスポンスにしたら、バックエンドから返される結果をクライアントに渡すように定義する必要があります。統合レスポンスデータとメソッドレスポンスデータで形式が異なる場合は、結果をそのまま渡すか、統合レスポンスデータをメソッドレスポンスデータに変換するかを選択できます。

プロキシ統合の場合、API Gateway は自動的にバックエンド出力を HTTP レスポンスとしてクライアントに渡します。この場合、お客様が統合レスポンスもメソッドレスポンスも設定することはありません。

統合レスポンスを設定するには、以下の必須およびオプションのタスクを実行します。

1.  統合レスポンスデータがマップされるメソッドレスポンスの HTTP ステータスコードを指定します。これは必須です。

1.  この統合レスポンスが表すバックエンド出力に一致する正規表現を定義します。この項目を空のままにした場合、レスポンスは、未設定のレスポンスのキャッチに使用されるデフォルトのレスポンスになります。

1.  必要に応じて、指定した統合レスポンスパラメータを特定のメソッドレスポンスパラメータにマップするための、キーと値のペアで構成されるマッピングを宣言します。

1. 必要に応じて、特定の統合レスポンスペイロードを、指定したメソッドレスポンスペイロードに変換するための、本文マッピングテンプレートを追加します。

1.  必要に応じて、バイナリペイロードの型変換の処理方法を指定します。

統合レスポンスは、バックエンドレスポンスをカプセル化する HTTP レスポンスです。HTTP エンドポイントの場合、バックエンドレスポンスは HTTP レスポンスです。統合レスポンスのステータスコードは、バックエンドが返すステータスコードであり、統合レスポンスの本文は、バックエンドが返すペイロードです。Lambda エンドポイントの場合、バックエンドレスポンスは Lambda 関数から返される出力です。Lambda 統合では、Lambda 関数出力は `200 OK` レスポンスとして返されます。ペイロードには、結果が JSON データ (JSON 文字列または JSON オブジェクト) として含まれたり、エラーメッセージが JSON オブジェクトとして含まれたりします。[[selectionPattern](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html#selectionPattern)] プロパティに正規表現を割り当てて、エラーレスポンスを該当する HTTP エラーレスポンスにマップできます。Lambda 関数のエラーレスポンスの詳細については、「[API Gateway で Lambda エラーを処理する](handle-errors-in-lambda-integration.md)」を参照してください。Lambda プロキシ統合では、Lambda 関数は以下の形式で出力を返す必要があります。

```
{
    statusCode: "...",            // a valid HTTP status code
    headers: { 
        custom-header: "..."      // any API-specific custom header
    },
    body: "...",                  // a JSON string.
    isBase64Encoded:  true|false  // for binary support
}
```

Lambda 関数レスポンスを適切な HTTP レスポンスにマップする必要はありません。

結果をクライアントに返すには、エンドポイントレスポンスを対応するメソッドレスポンスにそのまま渡すように、統合レスポンスを設定します。または、エンドポイントレスポンスデータをメソッドレスポンスデータにマップすることもできます。マップできるレスポンスデータとしては、レスポンスステータスコード、レスポンスヘッダーパラメータ、レスポンス本文などがあります。返されたステータスコードに対してメソッドレスポンスが定義されていない場合、API Gateway は 500 エラーを返します。詳細については、「[API Gateway で REST API の API リクエストパラメータおよびレスポンスパラメータとステータスコードを上書きする](apigateway-override-request-response-parameters.md)」を参照してください。



# API Gateway での REST API の Lambda 統合
<a name="set-up-lambda-integrations"></a>

 Lambda プロキシ統合または Lambda 非プロキシ (カスタム) 統合を使用して、API メソッドを Lambda 関数に統合できます。

Lambda プロキシ統合では、必要なセットアップを簡単に行えます。統合の HTTP メソッドを POST に設定し、統合エンドポイント URI を特定の Lambda 関数のアクションを呼び出す Lambda 関数の ARN に設定して、ユーザーに代わって Lambda 関数を呼び出す許可を API Gateway に付与します。

Lambda 非プロキシ統合では、プロキシ統合のセットアップステップに加えて、受信リクエストデータがどのように統合リクエストにマッピングされるか、統合レスポンスデータの結果がメソッドレスポンスにどのようにマッピングされるかを指定します。

**Topics**
+ [

# API Gateway での Lambda プロキシ統合
](set-up-lambda-proxy-integrations.md)
+ [

# API Gateway で Lambda カスタム統合を設定する
](set-up-lambda-custom-integrations.md)
+ [

# バックエンド Lambda 関数の非同期呼び出しをセットアップする
](set-up-lambda-integration-async.md)
+ [

# API Gateway で Lambda エラーを処理する
](handle-errors-in-lambda-integration.md)

# API Gateway での Lambda プロキシ統合
<a name="set-up-lambda-proxy-integrations"></a>

次のセクションでは、Lambda プロキシ統合を使用する方法を示します。

**Topics**
+ [

## API Gateway Lambda プロキシの統合について理解する
](#api-gateway-create-api-as-simple-proxy)
+ [

## 複数値のヘッダーとクエリ文字列パラメータのサポート
](#apigateway-multivalue-headers-and-parameters)
+ [

## プロキシ統合のための Lambda 関数の入力形式
](#api-gateway-simple-proxy-for-lambda-input-format)
+ [

## プロキシ統合のための Lambda 関数の出力形式
](#api-gateway-simple-proxy-for-lambda-output-format)
+ [

# AWS CLI を使用して API Gateway の Lambda プロキシ統合をセットアップする
](set-up-lambda-proxy-integration-using-cli.md)
+ [

# OpenAPI 定義を使用してプロキシリソースに Lambda プロキシ統合をセットアップする
](api-gateway-set-up-lambda-proxy-integration-on-proxy-resource.md)

## API Gateway Lambda プロキシの統合について理解する
<a name="api-gateway-create-api-as-simple-proxy"></a>

Amazon API Gateway Lambda プロキシ統合は、単一の API メソッドのセットアップで API を構築するシンプル、強力、高速なメカニズムです。Lambda プロキシ統合は、クライアントが単一の Lambda 関数をバックエンドで呼び出すことを可能にします。この関数は、他の Lambda 関数の呼び出しを含め、AWS のその他サービスのさまざまなリソースや機能にアクセスします。

 Lambda プロキシ統合では、クライアントが API リクエストを送信すると、API Gateway は、統合された Lambda 関数に[イベントオブジェクト](#api-gateway-simple-proxy-for-lambda-input-format)を渡します。ただし、リクエストパラメータの順序は保持されません。この[リクエストデータ](#api-gateway-simple-proxy-for-lambda-input-format)には、リクエストヘッダー、クエリ文字列パラメータ、URL パス変数、ペイロード、および API 設定データが含まれます。設定データには、現在のデプロイステージ名、ステージ変数、ユーザー ID、または承認コンテキスト (存在する場合) を含めることができます。バックエンド Lambda 関数では、受信リクエストデータを解析して、返すレスポンスを決定します。API Gateway が Lambda 出力を API レスポンスとしてクライアントに渡すには、Lambda 関数は結果を[この形式](#api-gateway-simple-proxy-for-lambda-output-format)で返す必要があります。

 API Gateway は Lambda プロキシ統合でクライアントとバックエンド Lambda 関数間にあまり介入しないため、クライアントと統合された Lambda 関数は、API の既存の 統合セットアップを損なうことなく、相互の変更に適応できます。これを有効にするには、クライアントはバックエンド Lambda 関数が制定したアプリケーションプロトコルに従う必要があります。

 任意の API メソッドで Lambda プロキシ統合をセットアップできます。しかし、Lambda プロキシ統合は、汎用的なプロキシリソースが含まれる API メソッドに設定されていると、より強力です。汎用的なプロキシリソースは、特別なテンプレートパス変数である `{proxy+}` 、キャッチオールである `ANY` メソッドプレースホルダー、または両方によって示すことができます。クライアントは、受信リクエストのバックエンド Lambda 関数に、入力をリクエストパラメータまたは適切なペイロードとして渡すことができます。リクエストパラメータには、ヘッダー、URL パス変数、クエリ文字列パラメータ、および適切なペイロードが含まれます。統合された Lambda 関数は、リクエストを処理して、必要な入力がない場合に意味のあるエラーメッセージでクライアントに応答する前に、すべての入力ソースを検証します。

 `ANY` の汎用的な HTTP メソッドと `{proxy+}` の汎用的なリソースと統合されている API メソッドを呼び出す際、クライアントは `ANY` の代わりに特定の HTTP メソッドを持つリクエストを送信します。クライアントはさらに、`{proxy+}` の代わりに特定の URL パスを指定し、要求されるヘッダー、クエリ文字列パラメータ、または適切なペイロードを含めます。

 次のリストは、Lambda プロキシ統合での異なる API メソッドのランタイム動作を要約しています。
+ `ANY /{proxy+}`: クライアントは特定の HTTP メソッドを選択し、特定のリソースパス階層を設定する必要があり、Lambda 関数にデータを入力として渡すために任意のヘッダー、クエリ文字列パラメータ、および適切なペイロードを設定できます。
+ `ANY /res`: クライアントは特定の HTTP メソッドを選択する必要があり、Lambda 関数にデータを入力として渡すために任意のヘッダー、クエリ文字列パラメータ、および適切なペイロードを設定できます。
+ `GET|POST|PUT|... /{proxy+}`: クライアントは特定のリソースパス階層を設定することができ、Lambda 関数にデータを入力として渡すために任意のヘッダー、クエリ文字列パラメータ、および適切なペイロードを設定できます。
+  `GET|POST|PUT|... /res/{path}/...`: クライアントは (`{path}` 変数に) 特定のパスセグメントを選択する必要があり、Lambda 関数に入力データを渡すために任意のリクエストヘッダー、クエリ文字列パラメータ、および適切なペイロードを設定できます。
+  `GET|POST|PUT|... /res`: クライアントは Lambda 関数に入力データを渡すために任意のリクエストヘッダー、クエリ文字列パラメータ、および適切なペイロードを設定できます。

 `{proxy+}` のプロキシリソースと `{custom}` のカスタムリソースの両方が、テンプレートパス変数として表現されています。ただし、`{proxy+}` はパス階層に沿った任意のリソースを参照できますが、`{custom}` は特定のパスセグメントのみを参照します。たとえば、食料品店はオンラインの製品インベントリを部門名、農産物カテゴリ、および製品タイプで整理しています。食料品店のウェブサイトは、カスタムリソースの次のテンプレートパス変数によって、利用可能な製品を表すことができます: `/{department}/{produce-category}/{product-type}`。たとえば、リンゴは `/produce/fruit/apple` で表され、ニンジンは `/produce/vegetables/carrot` で表されます。また、`/{proxy+}` を使用して、顧客がオンラインストアで買い物中に検索できる任意の部門、農産物カテゴリ、または製品タイプを表すことができます。たとえば、`/{proxy+}` は次のいずれかのアイテムを参照できます。
+ `/produce`
+ `/produce/fruit`
+ `/produce/vegetables/carrot`

 顧客が利用可能な製品、その農産物カテゴリ、および関連するストア部門を検索できるようにするには、`GET /{proxy+}` の単一メソッドを読み取り専用アクセス権限で公開することができます。同様に、責任者が `produce` 部門のインベントリをアップデートできるようにするには、別の `PUT /produce/{proxy+}` の単一メソッドを読み取り/書き込みアクセス権限でセットアップできます。レジ係が野菜の合計を更新できるようにするには、`POST /produce/vegetables/{proxy+}` メッセージを読み取り/書き込みアクセス権限でセットアップできます。店長が任意のアクションを任意の利用可能な製品に実行できるようにするには、オンラインストア開発者は `ANY /{proxy+}` メソッドを読み取り/書き込みアクセス権限で公開できます。いずれの場合も、実行時には、顧客または従業員は選択された部門のあるタイプの特定の製品、製品部門の特定の農産物カテゴリ、または特定の部門を選択する必要があります。



API Gateway プロキシ統合のセットアップの詳細については、「[プロキシリソースとのプロキシ統合を設定する](api-gateway-set-up-simple-proxy.md)」を参照してください。

 プロキシ統合は、クライアントがバックエンド要件のより詳細な知識を持っていることを要求します。したがって、最適なアプリケーションパフォーマンスとユーザーエクスペリエンスを確保するために、バックエンド開発者はバックエンドの要件をクライアント開発者に明確に伝え、要件が満たされない場合は堅牢なエラーフィードバックメカニズムを提供する必要があります。

## 複数値のヘッダーとクエリ文字列パラメータのサポート
<a name="apigateway-multivalue-headers-and-parameters"></a>

API Gateway は、同じ名前を持つ複数のヘッダーやクエリ文字列パラメータをサポートするようになりました。複数値ヘッダーや単一値ヘッダー、およびパラメータを、同じリクエストとレスポンスで組み合わせることができます。詳細については、「[プロキシ統合のための Lambda 関数の入力形式](#api-gateway-simple-proxy-for-lambda-input-format)」および「[プロキシ統合のための Lambda 関数の出力形式](#api-gateway-simple-proxy-for-lambda-output-format)」を参照してください。

## プロキシ統合のための Lambda 関数の入力形式
<a name="api-gateway-simple-proxy-for-lambda-input-format"></a>

Lambda プロキシ統合では、API Gateway がクライアントリクエスト全体をバックエンド Lambda 関数の入力 `event` パラメータにマップします。次の例は、API Gateway が Lambda プロキシ統合に送信するイベントの構造を示しています。

この例では、API Gateway への呼び出しが次のようになっていることを前提としています。

```
curl 'https://a1b2c3.execute-api.us-east-1.amazonaws.com/my/path?parameter1=value1&parameter2=value1&parameter2=value2&parameter3=value1,value2' -H 'header1: value1' -H 'header2: value1' -H 'header2: value2' -H 'header3: value1,value2'
```

出力は次のようになります。

```
{
  "resource": "/my/path",
  "path": "/my/path",
  "httpMethod": "GET",
  "headers": {
      "header1": "value1",
      "header2": "value2",
      "header3": "value1,value2"
  },
  "multiValueHeaders": {
    "header1": ["value1"],
    "header2": ["value1","value2"],
    "header3": ["value1,value2"]
  },
  "queryStringParameters": {
      "parameter1": "value1",
      "parameter2": "value2",
      "parameter3": "value1,value2"
  },
  "multiValueQueryStringParameters": {
    "parameter1": ["value1"],
    "parameter2": ["value1","value2"],
    "parameter3": ["value1,value2"]
  },
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "id",
    "authorizer": {
      "claims": null,
      "scopes": null
    },
    "domainName": "id.execute-api.us-east-1.amazonaws.com",
    "domainPrefix": "id",
    "extendedRequestId": "request-id",
    "httpMethod": "GET",
    "identity": {
      "accessKey": null,
      "accountId": null,
      "caller": null,
      "cognitoAuthenticationProvider": null,
      "cognitoAuthenticationType": null,
      "cognitoIdentityId": null,
      "cognitoIdentityPoolId": null,
      "principalOrgId": null,
      "sourceIp": "IP",
      "user": null,
      "userAgent": "user-agent",
      "userArn": null,
      "clientCert": {
        "clientCertPem": "CERT_CONTENT",
        "subjectDN": "www.example.com",
        "issuerDN": "Example issuer",
        "serialNumber": "a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1:a1",
        "validity": {
          "notBefore": "May 28 12:30:02 2019 GMT",
          "notAfter": "Aug  5 09:36:04 2021 GMT"
        }
      }
    },
    "path": "/my/path",
    "protocol": "HTTP/1.1",
    "requestId": "id=",
    "requestTime": "04/Mar/2020:19:15:17 +0000",
    "requestTimeEpoch": 1583349317135,
    "resourceId": null,
    "resourcePath": "/my/path",
    "stage": "$default"
  },
  "pathParameters": null,
  "stageVariables": null,
  "body": "Hello from Lambda!",
  "isBase64Encoded": false
}
```

**注記**  
入力値は、次のようになります。  
`headers` キーには、単一値のヘッダーのみを含めることができます。
`multiValueHeaders` キーには、複数値のヘッダーや単一値のヘッダーを含めることができます。
`headers` と `multiValueHeaders` の両方の値を指定した場合、API Gateway はそれらを単一のリストにマージします。同じキーと値のペアが両方で指定された場合にのみ、`multiValueHeaders` の値が、マージされたリストに表示されます。

バックエンド Lambda 関数への入力では、`requestContext` オブジェクトはキーと値のペアのマップです。各ペアにおいて、キーは [\$1context](api-gateway-mapping-template-reference.md#context-variable-reference) 変数プロパティの名前であり、値はそのプロパティの値です。API Gateway は、マップに新しいキーを追加する場合があります。

有効になっている機能に応じて、`requestContext` マップは API ごとに異なる場合があります。たとえば、前述の例では、認可タイプが指定されていないため、`$context.authorizer.*` や `$context.identity.*` プロパティは存在しません。認可タイプが指定されると、API Gateway は、認可されたユーザー情報を `requestContext.identity` オブジェクト内の統合エンドポイントに次のように渡します。
+ 認可タイプが `AWS_IAM` の場合、認可されるユーザー情報には `$context.identity.*` プロパティが含まれます。
+ 認可タイプが `COGNITO_USER_POOLS` (Amazon Cognito オーソライザー) の場合、認可されるユーザー情報には `$context.identity.cognito*` および `$context.authorizer.claims.*` プロパティが含まれます。
+ 認可タイプが `CUSTOM` (Lambda オーソライザー) の場合、認可されるユーザー情報には `$context.authorizer.principalId` およびその他の該当する `$context.authorizer.*` プロパティが含まれます。

## プロキシ統合のための Lambda 関数の出力形式
<a name="api-gateway-simple-proxy-for-lambda-output-format"></a>

Lambda プロキシ統合では、以下の JSON 形式に従って出力を返すために、API Gateway はバックエンドの Lambda 関数を必要とします。

```
{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..."
}
```

出力では、次のようになります。
+ 余分なレスポンスヘッダーが返されない場合、`headers` および `multiValueHeaders` キーは指定されません。
+ `headers` キーには、単一値のヘッダーのみを含めることができます。
+ `multiValueHeaders` キーには、複数値のヘッダーや単一値のヘッダーを含めることができます。`multiValueHeaders` キーを使用して、単一値のヘッダーを含めて、すべてのヘッダーを指定することができます。
+ `headers` と `multiValueHeaders` の両方の値を指定した場合、API Gateway はそれらを単一のリストにマージします。同じキーと値のペアが両方で指定された場合にのみ、`multiValueHeaders` の値が、マージされたリストに表示されます。

Lambda プロキシ統合に対して CORS を有効にするには、`Access-Control-Allow-Origin:domain-name` を出力 `headers` に追加する必要があります。`domain-name` は、任意のドメイン名に対して `*` にすることができます。出力 `body` は、メソッドレスポンスペイロードとしてフロントエンドにマーシャリングされます。`body` がバイナリ BLOB の場合、`isBase64Encoded` を `true` に設定し、`*/*` を [**バイナリメディアタイプ**] に設定することで、Base64 エンコード文字列としてエンコードできます。それ以外の場合は、`false` に設定するか、指定しないでおくことができます。

**注記**  
バイナリサポートの有効化に関する詳細については、[API Gateway コンソールを使用したバイナリサポートの有効化](api-gateway-payload-encodings-configure-with-console.md) を参照してください。サンプルの Lambda 関数については、「[API Gateway のLambda プロキシ統合からバイナリメディアを返す](lambda-proxy-binary-media.md)」を参照してください。

関数出力が別の形式である場合、API Gateway は `502 Bad Gateway` エラーレスポンスを返します。

Node.js での Lambda 関数でレスポンスを返すには、次のようなコマンドを使用できます。
+ 成功した場合の結果を返すには、`callback(null, {"statusCode": 200, "body": "results"})` を呼び出します。
+ 例外をスローするには、`callback(new Error('internal server error'))` を呼び出します。
+ クライアント側エラーの場合 (必要なパラメータがない場合など)、`callback(null, {"statusCode": 400, "body": "Missing parameters of ..."})` を呼び出して、例外をスローせずにエラーを返すことができます。

Node.js の Lambda `async` 関数では、同等の構文は次のようになります。
+ 成功した場合の結果を返すには、`return {"statusCode": 200, "body": "results"}` を呼び出します。
+ 例外をスローするには、`throw new Error("internal server error")` を呼び出します。
+ クライアント側エラーの場合 (必要なパラメータがない場合など)、`return {"statusCode": 400, "body": "Missing parameters of ..."}` を呼び出して、例外をスローせずにエラーを返すことができます。

# AWS CLI を使用して API Gateway の Lambda プロキシ統合をセットアップする
<a name="set-up-lambda-proxy-integration-using-cli"></a>

このセクションでは、AWS CLI を使用して Lambda プロキシ統合で API をセットアップする方法について説明します。API Gateway コンソールを使用してプロキシリソースに Lambda プロキシ統合を設定する詳しい手順については、「[チュートリアル: Lambda プロキシ統合を使用して REST API を作成する](api-gateway-create-api-as-simple-proxy-for-lambda.md)」を参照してください。

たとえば、次のサンプル Lambda 関数を API のバックエンドとして使用します。

```
export const handler = async(event, context) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    var res ={
        "statusCode": 200,
        "headers": {
            "Content-Type": "*/*"
        }
    };
    var greeter = 'World';
    if (event.greeter && event.greeter!=="") {
        greeter =  event.greeter;
    } else if (event.body && event.body !== "") {
        var body = JSON.parse(event.body);
        if (body.greeter && body.greeter !== "") {
            greeter = body.greeter;
        }
    } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") {
        greeter = event.queryStringParameters.greeter;
    } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") {
        greeter = event.multiValueHeaders.greeter.join(" and ");
    } else if (event.headers && event.headers.greeter && event.headers.greeter != "") {
        greeter = event.headers.greeter;
    } 
    res.body = "Hello, " + greeter + "!";
    return res
};
```

これを [API Gateway で Lambda カスタム統合を設定する](set-up-lambda-custom-integrations.md) の Lambdaカスタム統合のセットアップと比較すると、この Lambda 関数への入力はリクエストパラメータと本文で表現できます。クライアントが同じ入力データを渡すことができるように、自由度は高くなっています。ここで、クライアントは、クエリ文字列パラメータ、ヘッダ、または本文プロパティとして Greeter の名前を渡すことができます。この関数は、カスタムの Lambda 統合をサポートすることもできます。API のセットアップはより簡単です。メソッドレスポンスまたは統合レスポンスを設定することはありません。

**AWS CLI を使用して Lambda プロキシ統合をセットアップするには**

1. 次の [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドを使用して、API を作成します。

   ```
   aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)'
   ```

   出力は次のようになります。

   ```
   {
       "name": "HelloWorldProxy (AWS CLI)", 
       "id": "te6si5ach7",
       "rootResourceId" : "krznpq9xpg",
       "createdDate": 1508461860
   }
   ```

   この例全体で、API `id` (`te6si5ach7`) と `rootResourceId` (`krznpq9xpg`) を使用します。

1. 次の [create-resource](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-resource.html) コマンドを使用して、`/greeting` の API Gateway [リソース](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html) を作成します。

   ```
   aws apigateway create-resource \
         --rest-api-id te6si5ach7 \
         --parent-id krznpq9xpg \
         --path-part {proxy+}
   ```

   出力は次のようになります。

   ```
   {
       "path": "/{proxy+}", 
       "pathPart": "{proxy+}", 
       "id": "2jf6xt", 
       "parentId": "krznpq9xpg"
   }
   ```

   次のステップでは、`{proxy+}` リソースの `id` 値 (`2jf6xt`) を使用して `/{proxy+}` リソースにメソッドを作成します。

1. 次の [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) を使用して、`ANY /{proxy+}` の `ANY` メソッドリクエストを作成します。

   ```
   aws apigateway put-method --rest-api-id te6si5ach7 \
          --resource-id 2jf6xt \
          --http-method ANY \
          --authorization-type "NONE"
   ```

   出力は次のようになります。

   ```
   {
       "apiKeyRequired": false, 
       "httpMethod": "ANY", 
       "authorizationType": "NONE"
   }
   ```

   この API メソッドでは、クライアントはバックエンドの Lambda 関数からお知らせを受信または送信できます。

1. 次の [put-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration.html) コマンドを使用して、`ANY /{proxy+}` メソッドと `HelloWorld` という名前の Lambda 関数との統合を設定します。この関数は、`"Hello, {name}!"` パラメータが提供されている場合は `greeter`、クエリ文字列パラメータが設定されていない場合は `"Hello, World!"` のメッセージでリクエストに応答します。

   ```
   aws apigateway put-integration \
         --rest-api-id te6si5ach7 \
         --resource-id 2jf6xt \
         --http-method ANY \
         --type AWS_PROXY \
         --integration-http-method POST \
         --uri arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:HelloWorld/invocations \
         --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole
   ```
**重要**  
Lambda 統合では、[関数呼び出しの Lambda サービスアクションの仕様](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)に従って、統合リクエストに `POST` の HTTP メソッドを使用する必要があります。`apigAwsProxyRole` の IAM ロールは、`apigateway` サービスが Lambda 関数を呼び出せるようにするポリシーが必要です。IAM 権限の詳細については、「[API を呼び出すための API Gateway アクセス許可モデル](permissions.md#api-gateway-control-access-iam-permissions-model-for-calling-api)」を参照してください。

   出力は次のようになります。

   ```
   {
       "passthroughBehavior": "WHEN_NO_MATCH", 
       "cacheKeyParameters": [], 
       "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:1234567890:function:HelloWorld/invocations", 
       "httpMethod": "POST", 
       "cacheNamespace": "vvom7n", 
       "credentials": "arn:aws:iam::1234567890:role/apigAwsProxyRole", 
       "type": "AWS_PROXY"
   }
   ```

   `credentials` の IAM ロールを指定する代わりに、[add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) コマンドを使用してリソースベースのアクセス許可を追加できます。これは、API Gateway コンソールが行うことです。

1. 次の [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-deployment.html) コマンドを使用して、API を `test` ステージにデプロイします。

   ```
   aws apigateway create-deployment  \
         --rest-api-id te6si5ach7 \
         --stage-name test
   ```

1. ターミナルで次の cURL コマンドを使用して API をテストします。

   `?greeter=jane` のクエリ文字列パラメータを使用して API を呼び出します。

   ```
   curl -X GET 'https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/greeting?greeter=jane'
   ```

   `greeter:jane` のヘッダーパラメータを使用して API を呼び出します。

   ```
   curl -X GET https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/hi \
     -H 'content-type: application/json' \
     -H 'greeter: jane'
   ```

   `{"greeter":"jane"}` の本文を使用して API を呼び出します。

   ```
   curl -X POST https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/hi \
     -H 'content-type: application/json' \
     -d '{ "greeter": "jane" }'
   ```

   すべてのケースで、出力は、次のレスポンス本文を持つ 200 レスポンスです。

   ```
   Hello, jane!
   ```

# OpenAPI 定義を使用してプロキシリソースに Lambda プロキシ統合をセットアップする
<a name="api-gateway-set-up-lambda-proxy-integration-on-proxy-resource"></a>

プロキシリソースに Lambda プロキシ統合タイプをセットアップするには、greedy パスパラメータ (`/parent/{proxy+}` など) を使用して API リソースを作成し、このリソースを `arn:aws:lambda:us-west-2:123456789012:function:SimpleLambda4ProxyResource` メソッドで Lambda 関数のバックエンド (`ANY` など) と統合します。greedy パスパラメータは、API リソースパスの末尾にある必要があります。プロキシ以外のリソースと同様に、API Gateway コンソールを使用するか、OpenAPI 定義ファイルをインポートするか、API Gateway REST API を直接呼び出すことによって、プロキシリソースをセットアップできます。

以下の OpenAPI API 定義ファイルは、`SimpleLambda4ProxyResource` という名前の Lambda 関数を使用して統合された API とプロキシリソースの例を示しています。

------
#### [ OpenAPI 3.0 ]

```
{
   "openapi": "3.0.0",
   "info": {
      "version": "2016-09-12T17:50:37Z",
      "title": "ProxyIntegrationWithLambda"
   },
   "paths": {
      "/{proxy+}": {
         "x-amazon-apigateway-any-method": {
            "parameters": [
               {
                  "name": "proxy",
                  "in": "path",
                  "required": true,
                  "schema": {
                     "type": "string"
                  }
               }
            ],
            "responses": {},
            "x-amazon-apigateway-integration": {
               "responses": {
                  "default": {
                     "statusCode": "200"
                  }
               },
               "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:SimpleLambda4ProxyResource/invocations",
               "passthroughBehavior": "when_no_match",
               "httpMethod": "POST",
               "cacheNamespace": "roq9wj",
               "cacheKeyParameters": [
                  "method.request.path.proxy"
               ],
               "type": "aws_proxy"
            }
         }
      }
   },
   "servers": [
      {
         "url": "https://gy415nuibc.execute-api.us-east-1.amazonaws.com/{basePath}",
         "variables": {
            "basePath": {
              "default": "/testStage"
            }
         }
      }
   ]
}
```

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-09-12T17:50:37Z",
    "title": "ProxyIntegrationWithLambda"
  },
  "host": "gy415nuibc.execute-api.us-east-1.amazonaws.com",
  "basePath": "/testStage",
  "schemes": [
    "https"
  ],
  "paths": {
    "/{proxy+}": {
      "x-amazon-apigateway-any-method": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "proxy",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {},
        "x-amazon-apigateway-integration": {
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:SimpleLambda4ProxyResource/invocations",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST",
          "cacheNamespace": "roq9wj",
          "cacheKeyParameters": [
            "method.request.path.proxy"
          ],
          "type": "aws_proxy"
        }
      }
    }
  }
}
```

------

Lambda プロキシ統合では、ランタイムに API Gateway は受信リクエストを Lambda 関数の入力 `event` パラメータにマッピングします。入力にはリクエストメソッド、パス、ヘッダー、クエリ文字列パラメータ、ペイロード、関連コンテキスト、定義済みステージ変数が含まれています。入力形式については「[プロキシ統合のための Lambda 関数の入力形式](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format)」で説明しています。API Gateway が Lambda 出力を HTTP レスポンスに正常にマッピングするには、Lambda 関数は、「[プロキシ統合のための Lambda 関数の出力形式](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-output-format)」で説明されている形式で結果を出力する必要があります。

`ANY` メソッドによるプロキシリソースの Lambda プロキシ統合では、単一のバックエンド Lambda 関数が、プロキシリソースを通じてすべてのリクエストのイベントハンドラーの役割を果たします。たとえば、トラフィックパターンを記録するために、プロキシリソースの URL パスで `/state/city/street/house` を使用してリクエストを送信することによって、モバイルデバイスから州、市、番地、建物などの場所情報を送信できます。バックエンドの Lambda 関数は、URL パスを解析し、場所情報のタプルを DynamoDB テーブルに挿入できます。

# API Gateway で Lambda カスタム統合を設定する
<a name="set-up-lambda-custom-integrations"></a>

 カスタムの Lambda 統合または非プロキシ統合をセットアップする方法を表示するには、`GET /greeting?greeter={name}` メソッドを公開する API Gateway API を作成して、Lambda 関数を呼び出します。API には、次の Lambda 関数の例のいずれかを使用します。

次の Lambda 関数の例のいずれかを使用します。

------
#### [ Node.js ]

```
'use strict';
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];            
var times = ['morning', 'afternoon', 'evening', 'night', 'day'];

export const handler = async(event) => {
  console.log(event);
  // Parse the input for the name, city, time and day property values
  let name = event.name === null || event.name === undefined || event.name === "" ? 'you' : event.name;
  let city = event.city === undefined ? 'World' : event.city;
  let time = times.indexOf(event.time)<0 ? 'day' : event.time;
  let day = days.indexOf(event.day)<0 ? null : event.day;

  // Generate a greeting
  let greeting = 'Good ' + time + ', ' + name + ' of ' + city + '. ';
  if (day) greeting += 'Happy ' + day + '!';
  
  // Log the greeting to CloudWatch
  console.log('Hello: ', greeting);
  
  // Return a greeting to the caller
  return greeting;
};
```

------
#### [ Python ]

```
import json


def lambda_handler(event, context):
    print(event)
    res = {
        "statusCode": 200,
        "headers": {
            "Content-Type": "*/*"
        }
    }

    if event['greeter'] == "":
        res['body'] = "Hello, World"
    elif (event['greeter']):
        res['body'] = "Hello, " + event['greeter'] + "!"
    else:
        raise Exception('Missing the required greeter parameter.')

    return res
```

------

この関数は、`"Hello, {name}!"` パラメータの値が空白でない文字列の場合は、`greeter` のメッセージで応答します。`"Hello, World!"` の値が空の文字列の場合は、`greeter` のメッセージを返します。着信リクエストで greeter パラメータが設定されていない場合、この関数は `"Missing the required greeter parameter."` のエラーメッセージを返します。関数名を `HelloWorld` とします。

これは、Lambda コンソールで、または AWS CLI を使用して作成できます。このセクションでは、次の ARN を使用してこの関数を参照します。

```
arn:aws:lambda:us-east-1:123456789012:function:HelloWorld
```

バックエンドに Lambda 関数を設定すると、API のセットアップに進みます。<a name="set-up-lambda-custom-integration-using-cli"></a>

**AWS CLI を使用して Lambda カスタム統合をセットアップするには**

1. 次の [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドを使用して、API を作成します。

   ```
   aws apigateway create-rest-api --name 'HelloWorld (AWS CLI)'
   ```

   出力は次のようになります。

   ```
   {
       "name": "HelloWorld (AWS CLI)", 
       "id": "te6si5ach7",
       "rootResourceId" : "krznpq9xpg",
       "createdDate": 1508461860
   }
   ```

   この例全体で、API `id` (`te6si5ach7`) と `rootResourceId` (`krznpq9xpg`) を使用します。

1. 次の [create-resource](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-resource.html) コマンドを使用して、`/greeting` の API Gateway [リソース](https://docs.aws.amazon.com/apigateway/latest/api/API_Resource.html) を作成します。

   ```
   aws apigateway create-resource \
         --rest-api-id te6si5ach7 \
         --parent-id krznpq9xpg \
         --path-part greeting
   ```

   出力は次のようになります。

   ```
   {
       "path": "/greeting", 
       "pathPart": "greeting", 
       "id": "2jf6xt", 
       "parentId": "krznpq9xpg"
   }
   ```

   次のステップでは、`greeting` リソースの `id` 値 (`2jf6xt`) を使用して `/greeting` リソースにメソッドを作成します。

1. 次の [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) コマンドを使用して、`GET /greeting?greeter={name}` の API メソッドリクエストを作成します。

   ```
   aws apigateway put-method --rest-api-id te6si5ach7 \
          --resource-id 2jf6xt \
          --http-method GET \
          --authorization-type "NONE" \
          --request-parameters method.request.querystring.greeter=false
   ```

   出力は次のようになります。

   ```
   {
       "apiKeyRequired": false, 
       "httpMethod": "GET", 
       "authorizationType": "NONE", 
       "requestParameters": {
           "method.request.querystring.greeter": false
       }
   }
   ```

   この API メソッドでは、クライアントはバックエンドの Lambda 関数からお知らせを受信できます。バックエンドは匿名の発信者または匿名でない発信者のいずれかを処理する必要があるため、この `greeter` パラメータはオプションです。

1. 次の [put-method-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method-response.html) コマンドを使用して、`GET /greeting?greeter={name}` メソッドリクエストに対する `200 OK` レスポンスを設定します。

   ```
   aws apigateway put-method-response \
           --rest-api-id te6si5ach7 \ 
           --resource-id 2jf6xt \
           --http-method GET \
           --status-code 200
   ```

   

1. 次の [put-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration.html) コマンドを使用して、`GET /greeting?greeter={name}` メソッドと `HelloWorld` という名前の Lambda 関数との統合を設定します。この関数は、`"Hello, {name}!"` パラメータが提供されている場合は `greeter`、クエリ文字列パラメータが設定されていない場合は `"Hello, World!"` のメッセージでリクエストに応答します。

   ```
   aws apigateway put-integration \
           --rest-api-id te6si5ach7 \
           --resource-id 2jf6xt \
           --http-method GET \
           --type AWS \
           --integration-http-method POST \
           --uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations \
           --request-templates '{"application/json":"{\"greeter\":\"$input.params('greeter')\"}"}' \
           --credentials arn:aws:iam::123456789012:role/apigAwsProxyRole
   ```

   ここで指定されたマッピングテンプレートは、`greeter` クエリ文字列パラメータを JSON ペイロードの `greeter` プロパティに変換します。Lambda 関数への入力を本文で表現する必要があるため、これが必要になります。
**重要**  
Lambda 統合では、[関数呼び出しの Lambda サービスアクションの仕様](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)に従って、統合リクエストに `POST` の HTTP メソッドを使用する必要があります。`uri` パラメータは、関数呼び出しアクションの ARN です。  
出力は次のようになります。

   ```
   {
       "passthroughBehavior": "WHEN_NO_MATCH", 
       "cacheKeyParameters": [], 
       "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:HelloWorld/invocations", 
       "httpMethod": "POST", 
       "requestTemplates": {
           "application/json": "{\"greeter\":\"$input.params('greeter')\"}"
       }, 
       "cacheNamespace": "krznpq9xpg", 
       "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole", 
       "type": "AWS"
   }
   ```

   `apigAwsProxyRole` の IAM ロールは、`apigateway` サービスが Lambda 関数を呼び出せるようにするポリシーが必要です。`credentials` の IAM ロールを指定する代わりに、[add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) コマンドを呼び出して、リソースベースのアクセス許可を追加することができます。これは、API Gateway コンソールがこれらのアクセス許可を追加する方法です。

1. 次の [put-integration-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration-response.html) コマンドを使用して、Lambda 関数の出力を `200 OK` メソッドレスポンスとしてクライアントに渡すための統合レスポンスを設定します。

   ```
    aws apigateway put-integration-response \
           --rest-api-id te6si5ach7 \
           --resource-id 2jf6xt \
           --http-method GET \
           --status-code 200 \
           --selection-pattern ""
   ```

   選択パターンを空の文字列に設定すると、`200 OK` レスポンスがデフォルトになります。

   出力は次のようになります。

   ```
    {
       "selectionPattern": "", 
       "statusCode": "200"
   }
   ```

1. 次の [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-deployment.html) コマンドを使用して、API を `test` ステージにデプロイします。

   ```
   aws apigateway create-deployment \
           --rest-api-id te6si5ach7 \
           --stage-name test
   ```

1.  ターミナルで次の cURL コマンドを使用して API をテストします。

   ```
   curl -X GET 'https://te6si5ach7.execute-api.us-west-2.amazonaws.com/test/greeting?greeter=me' \
     -H 'authorization: AWS4-HMAC-SHA256 Credential={access_key}/20171020/us-west-2/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=f327...5751'
   ```

# バックエンド Lambda 関数の非同期呼び出しをセットアップする
<a name="set-up-lambda-integration-async"></a>

Lambda 非プロキシ (カスタム) 統合では、デフォルトでバックエンド Lambda 関数が同期的に呼び出されます。これは、ほとんどの REST API 操作に必要な動作です。ただし、一部のアプリケーションでは非同期で作業を実行する必要があります (バッチオペレーションまたは長時間レイテンシーオペレーションとして実行)。通常、これは別々のバックエンドコンポーネントで実行されます。この場合は、バックエンド Lambda 関数は非同期に呼び出され、フロントエンドの REST API メソッドは結果を返しません。

`'Event'` を [Lambda 呼び出しタイプ](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html)として指定することで、Lambda 非プロキシ統合用の Lambda 関数を非同期的に呼び出すように設定できます。これは次のように行います。

## API Gateway コンソールで Lambda 非同期呼び出しを設定する
<a name="asynchronous-invocation-console-examples"></a>

すべての呼び出しを非同期にするには：
+ **[統合リクエスト]** で、静的な値として `'Event'` を使用して `X-Amz-Invocation-Type` ヘッダーを追加します。

クライアントが、呼び出しが非同期か同期かを判断するには、次のようにします。

1. **[メソッドリクエスト]** で、`InvocationType` ヘッダーを追加します。

1. **[統合リクエスト]** で、マッピング式として `method.request.header.InvocationType` を使用して `X-Amz-Invocation-Type` ヘッダーを追加します。

1. クライアントは、非同期呼び出しには API リクエストに`InvocationType: Event` ヘッダーを含めるか、同期呼び出しには `InvocationType: RequestResponse` を含めることができます。

## OpenAPI を使用した Lambda 非同期呼び出しの設定
<a name="asynchronous-invocation-OpenAPI-examples"></a>

すべての呼び出しを非同期にするには：
+  `X-Amz-Invocation-Type` ヘッダーを **x-amazon-apigateway-integration** セクションに追加します。

  ```
  "x-amazon-apigateway-integration" : {
            "type" : "aws",
            "httpMethod" : "POST",
            "uri" : "arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:123456789012:function:my-function/invocations",
            "responses" : {
              "default" : {
                "statusCode" : "200"
              }
            },
            "requestParameters" : {
              "integration.request.header.X-Amz-Invocation-Type" : "'Event'"
            },
            "passthroughBehavior" : "when_no_match",
            "contentHandling" : "CONVERT_TO_TEXT"
          }
  ```

クライアントが、呼び出しが非同期か同期かを判断するには、次のようにします。

1.  任意の [OpenAPI Path Item オブジェクト](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#pathItemObject)に次のヘッダーを追加します。

   ```
   "parameters" : [ {
   "name" : "InvocationType",
   "in" : "header",
   "schema" : {
     "type" : "string"
   }
   } ]
   ```

1.  `X-Amz-Invocation-Type` ヘッダーを **x-amazon-apigateway-integration** セクションに追加します。

   ```
   "x-amazon-apigateway-integration" : {
             "type" : "aws",
             "httpMethod" : "POST",
             "uri" : "arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:123456789012:function:my-function/invocations",
             "responses" : {
               "default" : {
                 "statusCode" : "200"
               }
             },
             "requestParameters" : {
               "integration.request.header.X-Amz-Invocation-Type" : "method.request.header.InvocationType"
             },
             "passthroughBehavior" : "when_no_match",
             "contentHandling" : "CONVERT_TO_TEXT"
           }
   ```

1.  クライアントは、非同期呼び出しには API リクエストに`InvocationType: Event` ヘッダーを含めるか、同期呼び出しには `InvocationType: RequestResponse` を含めることができます。

## CloudFormation を使用して Lambda 非同期呼び出しを設定する
<a name="asynchronous-invocation-cfn-examples"></a>

以下の CloudFormation テンプレートは、非同期呼び出し用に `AWS::ApiGateway::Method` を設定する方法を示しています。

すべての呼び出しを非同期にするには：

```
AsyncMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref AsyncResource
      HttpMethod: GET
      ApiKeyRequired: false
      AuthorizationType: NONE
      Integration:
        Type: AWS
        RequestParameters:
          integration.request.header.X-Amz-Invocation-Type: "'Event'"
        IntegrationResponses:
            - StatusCode: '200'
        IntegrationHttpMethod: POST
        Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${myfunction.Arn}$/invocations
      MethodResponses:
        - StatusCode: '200'
```

クライアントが、呼び出しが非同期か同期かを判断するには、次のようにします。

```
AsyncMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref AsyncResource
      HttpMethod: GET
      ApiKeyRequired: false
      AuthorizationType: NONE
      RequestParameters:
        method.request.header.InvocationType: false
      Integration:
        Type: AWS
        RequestParameters:
          integration.request.header.X-Amz-Invocation-Type: method.request.header.InvocationType
        IntegrationResponses:
            - StatusCode: '200'
        IntegrationHttpMethod: POST
        Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${myfunction.Arn}$/invocations
      MethodResponses:
        - StatusCode: '200'
```

 クライアントは、非同期呼び出しには API リクエストに`InvocationType: Event` ヘッダーを含めるか、同期呼び出しには `InvocationType: RequestResponse` を含めることができます。

# API Gateway で Lambda エラーを処理する
<a name="handle-errors-in-lambda-integration"></a>

 Lambda カスタム統合の場合、統合レスポンスで Lambda によって返されたエラーを、クライアントの標準 HTTP エラーレスポンスにマップする必要があります。そうしないと、Lambda のエラーはデフォルトで `200 OK` レスポンスとして返されるため、API ユーザーは直感的に理解できません。

 Lambda から返されるエラーには、標準エラーとカスタムエラーの 2 種類があります。API では、これらを異なる方法で処理する必要があります。

 Lambda プロキシ統合では、Lambda は次の形式で出力を返す必要があります。

```
{
  "isBase64Encoded" : "boolean",
  "statusCode": "number",
  "headers": { ... },
  "body": "JSON string"
}
```

この出力で、通常、`statusCode` の `4XX` はクライアントエラー、`5XX` はサーバーエラーです。API Gateway では、これらのエラーを処理する方法として、指定された `statusCode` に従って Lambda エラーを HTTP エラーレスポンスにマッピングします。API Gateway がクライアントへのレスポンスの一部としてエラータイプ (`InvalidParameterException` など) を渡すには、Lambda 関数がヘッダー (`"X-Amzn-ErrorType":"InvalidParameterException"` など) を `headers` プロパティに含める必要があります。

**Topics**
+ [

## API Gateway で標準の Lambda エラーを処理する
](#handle-standard-errors-in-lambda-integration)
+ [

## API Gateway でカスタム Lambda エラーを処理する
](#handle-custom-errors-in-lambda-integration)

## API Gateway で標準の Lambda エラーを処理する
<a name="handle-standard-errors-in-lambda-integration"></a>

AWS Lambda の標準エラーは次の形式になります。

```
{
  "errorMessage": "<replaceable>string</replaceable>",
  "errorType": "<replaceable>string</replaceable>",
  "stackTrace": [
    "<replaceable>string</replaceable>",
    ...
  ]
}
```

 ここで、`errorMessage` はエラーの文字列式です。`errorType` は、言語に依存するエラーまたは例外タイプです。`stackTrace` は、エラーの発生につながったスタックトレースを示す文字列式のリストです。

 たとえば、次の JavaScript (Node.js) Lambda 関数について考えてみます。

```
export const handler = function(event, context, callback) {
    callback(new Error("Malformed input ..."));
};
```

この関数は、`Malformed input ...` をエラーメッセージとする、次の Lambda 標準エラーを返します。

```
{
  "errorMessage": "Malformed input ...",
  "errorType": "Error",
  "stackTrace": [
    "export const handler (/var/task/index.js:3:14)"
  ]
}
```

 同様に、次の例は同じ `Exception` をエラーメッセージとし、`Malformed input ...` をスローする Python Lambda 関数です。

```
def lambda_handler(event, context):
    raise Exception('Malformed input ...')
```

 この関数は、次の Lambda 標準エラーを返します。

```
{
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      3,
      "lambda_handler",
      "raise Exception('Malformed input ...')"
    ]
  ],
  "errorType": "Exception",
  "errorMessage": "Malformed input ..."
}
```

 `errorType` プロパティと `stackTrace` プロパティの値は、言語に依存します。この標準エラーは、`Error` オブジェクトの拡張または `Exception` クラスのサブクラスである各エラーオブジェクトにも適用されます。

 Lambda の標準エラーをメソッドレスポンスにマッピングするには、まず該当する Lambda エラーの HTTP スタータスコードを確認する必要があります。次に、その HTTP ステータスコードに関連付けられた [IntegrationResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html) の `[selectionPattern](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html#selectionPattern)` プロパティで正規表現パターンを設定します。API Gateway コンソールの場合、この `selectionPattern` は各統合レスポンスの下の **[統合レスポンス]** セクションに、**[Lambda エラーの正規表現]** として表示されます。

**注記**  
API Gateway は、レスポンスマッピングに Java パターンスタイルの正規表現を使用します。詳細については、Oracle ドキュメントの「[パターン](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)」を参照してください。

 例えば、次の [put-integration-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration-response.html) を使用して新しい `selectionPattern` 式を設定します。

```
aws apigateway put-integration-response --rest-api-id z0vprf0mdh --resource-id x3o5ih --http-method GET --status-code 400 --selection-pattern "Malformed.*" --region us-west-2
```

 [メソッドレスポンス](api-gateway-method-settings-method-response.md#setup-method-response-status-code)で対応するエラーコード (`400`) も必ず設定します。そうしないと、ランタイムに API Gateway から無効な設定エラーレスポンスがスローされます。

**注記**  
 ランタイムに、API Gateway は Lambda エラーの `errorMessage` を `selectionPattern` プロパティの正規表現のパターンと照合します。一致すると、API Gateway は Lambda エラーを、対応する HTTP ステータスコードの HTTP レスポンスとして返します。一致しない場合、API Gateway はエラーをデフォルトレスポンスとして返すか、デフォルトレスポンスが設定されていなければ、無効な設定例外をスローします。  
 特定のレスポンスで `selectionPattern` の値を `.*` に設定すると、このレスポンスはデフォルトのレスポンスとしてリセットされます。このような選択パターンは null (任意の未指定のエラーメッセージ) を含むすべてのエラーメッセージに一致するためです。その結果のマッピングにより、デフォルトのマッピングが上書きされます。`.+` を選択パターンとして使用してレスポンスをフィルタする場合は、改行 ('`\n`) 文字を含むレスポンスには一致しない可能性があることに注意してください。

 `selectionPattern` を使用して既存の AWS CLI 値を更新するには、[update-integration-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-integration-response.html) オペレーションを呼び出し、`/selectionPattern` のパス値を `Malformed*` パターンの指定された正規表現式に置き換えます。



API Gateway コンソールを使用して `selectionPattern` 式を設定するには、指定した HTTP ステータスコードの統合レスポンスを設定または更新するときに、**[Lambda エラーの正規表現]** テキストボックスに式を入力します。

## API Gateway でカスタム Lambda エラーを処理する
<a name="handle-custom-errors-in-lambda-integration"></a>

 AWS Lambda では、前のセクションで説明した標準エラーの代わりにカスタムエラーオブジェクトを JSON 文字列として返すことができます。エラーは、任意の有効な JSON オブジェクトです。たとえば、次の JavaScript (Node.js) Lambda 関数はカスタムエラーを返します。

```
export const handler = (event, context, callback) => {
    ...
    // Error caught here:
    var myErrorObj = {
        errorType : "InternalServerError",
        httpStatus : 500,
        requestId : context.awsRequestId,
        trace : {
            "function": "abc()",
            "line": 123,
            "file": "abc.js"
        }
    }
    callback(JSON.stringify(myErrorObj));
};
```

 `myErrorObj` を呼び出して関数を終了する前に、`callback` オブジェクトを JSON 文字列に変換する必要があります。そうしないと、`myErrorObj` は `"[object Object]"` の文字列として返されます。API のメソッドを前の Lambda 関数と統合すると、API Gateway は以下の内容をペイロードとする統合レスポンスを受け取ります。

```
{
    "errorMessage": "{\"errorType\":\"InternalServerError\",\"httpStatus\":500,\"requestId\":\"e5849002-39a0-11e7-a419-5bb5807c9fb2\",\"trace\":{\"function\":\"abc()\",\"line\":123,\"file\":\"abc.js\"}}"
}
```

 通常の統合レスポンスと同様に、このエラーレスポンスはそのままメソッドレスポンスに渡すことができます。または、マッピングテンプレートを使用してペイロードを別の形式に変換することもできます。次の例は、ステータスコードが `500` のメソッドレスポンスの本文マッピングテンプレートです。

```
{
    errorMessage: $input.path('$.errorMessage');
}
```

このテンプレートは、カスタムエラーの JSON 文字列が含まれている統合レスポンス本文を、次のメソッドレスポンス本文に変換します。このメソッドレスポンス本文には、カスタムエラーの JSON オブジェクトが含まれています。

```
{
    "errorMessage" : {
        errorType : "InternalServerError",
        httpStatus : 500,
        requestId : context.awsRequestId,
        trace : {
            "function": "abc()",
            "line": 123,
            "file": "abc.js"
        }
    }
};
```

 API の要件によっては、カスタムエラープロパティの一部または全部をメソッドレスポンスのヘッダーパラメータとして渡す必要があります。そのためには、統合レスポンス本文からメソッドレスポンスヘッダーにカスタムエラーマッピングを適用します。

たとえば、次の OpenAPI 拡張は、`errorMessage.errorType`、`errorMessage.httpStatus`、`errorMessage.trace.function`、および `errorMessage.trace` プロパティから、それぞれ `error_type`、`error_status`、`error_trace_function`、および `error_trace` ヘッダーへのマッピングを定義します。

```
"x-amazon-apigateway-integration": {
    "responses": {
        "default": {
          "statusCode": "200",
          "responseParameters": {
            "method.response.header.error_trace_function": "integration.response.body.errorMessage.trace.function",
            "method.response.header.error_status": "integration.response.body.errorMessage.httpStatus",
            "method.response.header.error_type": "integration.response.body.errorMessage.errorType",
            "method.response.header.error_trace": "integration.response.body.errorMessage.trace"
          },
          ...
        }
    }
}
```

 ランタイムに、API Gateway は `integration.response.body` パラメータを逆シリアル化してヘッダーマッピングを行います。ただし、この逆シリアル化は、Lambda のカスタムエラーレスポンスの本文からヘッダーへのマッピングにのみ適用され、`$input.body` を使用した本文から本文へのマッピングには適用されません。これらのカスタムエラーの本文からヘッダーへのマッピングでは、クライアントはメソッドレスポンスの一部として以下のヘッダーを受け取ります (`error_status`、`error_trace`、`error_trace_function`、および `error_type` をメソッドリクエストで宣言している場合)。

```
"error_status":"500",
"error_trace":"{\"function\":\"abc()\",\"line\":123,\"file\":\"abc.js\"}",
"error_trace_function":"abc()",
"error_type":"InternalServerError"
```

統合レスポンス本文の `errorMessage.trace` プロパティは複合プロパティです。これは JSON 文字列として `error_trace` ヘッダーにマッピングされます。

# API Gateway での REST API の HTTP 統合
<a name="setup-http-integrations"></a>

 HTTP プロキシ統合または HTTP カスタム統合を使用して、API メソッドを HTTP エンドポイントに統合できます。

API Gateway は、次のエンドポイントポートをサポートします。80、443、および 1024-65535 です。

 プロキシ統合では、セットアップは簡単です。コンテンツのエンコーディングやキャッシングが不要な場合は、バックエンド要件に従って HTTP メソッドと HTTP エンドポイント URI を設定するだけで済みます。

 カスタム統合では、セットアップは複雑になります。プロキシ統合のセットアップ手順に加えて、受信リクエストデータがどのように統合リクエストにマッピングされるか、統合レスポンスデータの結果がメソッド応答にどのようにマッピングされるかを指定する必要があります。

**Topics**
+ [

## API Gateway の HTTP プロキシ統合を設定する
](#api-gateway-set-up-http-proxy-integration-on-proxy-resource)
+ [

## API Gateway の HTTP カスタム統合をセットアップする
](#set-up-http-custom-integrations)

## API Gateway の HTTP プロキシ統合を設定する
<a name="api-gateway-set-up-http-proxy-integration-on-proxy-resource"></a>

HTTP プロキシ統合タイプを使用してプロキシリソースをセットアップするには、greedy パスパラメータ (`/parent/{proxy+}` など) を使用して API リソースを作成し、このリソースを `https://petstore-demo-endpoint.execute-api.com/petstore/{proxy}` メソッドで HTTP バックエンドのエンドポイント (`ANY` など) と統合します。greedy パスパラメーターは、リソースパスの末尾にある必要があります。

非プロキシリソースと同様に、API Gateway コンソールを使用するか、OpenAPI 定義ファイルをインポートするか、API Gateway REST API を直接呼び出すことによって、プロキシリソースに HTTP プロキシ統合をセットアップできます。API Gateway コンソールを使用して HTTP 統合でプロキシリソースを設定する詳しい手順については、「[チュートリアル: HTTP プロキシ統合を使用して REST API を作成する](api-gateway-create-api-as-simple-proxy-for-http.md)」を参照してください。

以下の OpenAPI 定義ファイルは、[PetStore](http://petstore-demo-endpoint.execute-api.com/petstore/pets) ウェブサイトに統合された API とプロキシリソースの例を示しています。

------
#### [ OpenAPI 3.0 ]

```
{
   "openapi": "3.0.0",
   "info": {
      "version": "2016-09-12T23:19:28Z",
      "title": "PetStoreWithProxyResource"
   },
   "paths": {
      "/{proxy+}": {
         "x-amazon-apigateway-any-method": {
            "parameters": [
               {
                  "name": "proxy",
                  "in": "path",
                  "required": true,
                  "schema": {
                     "type": "string"
                  }
               }
            ],
            "responses": {},
            "x-amazon-apigateway-integration": {
               "responses": {
                  "default": {
                     "statusCode": "200"
                  }
               },
               "requestParameters": {
                  "integration.request.path.proxy": "method.request.path.proxy"
               },
               "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/{proxy}",
               "passthroughBehavior": "when_no_match",
               "httpMethod": "ANY",
               "cacheNamespace": "rbftud",
               "cacheKeyParameters": [
                  "method.request.path.proxy"
               ],
               "type": "http_proxy"
            }
         }
      }
   },
   "servers": [
      {
         "url": "https://4z9giyi2c1.execute-api.us-east-1.amazonaws.com/{basePath}",
         "variables": {
            "basePath": {
              "default": "/test"
            }
         }
      }
   ]
}
```

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-09-12T23:19:28Z",
    "title": "PetStoreWithProxyResource"
  },
  "host": "4z9giyi2c1.execute-api.us-east-1.amazonaws.com",
  "basePath": "/test",
  "schemes": [
    "https"
  ],
  "paths": {
    "/{proxy+}": {
      "x-amazon-apigateway-any-method": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "proxy",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {},
        "x-amazon-apigateway-integration": {
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.path.proxy": "method.request.path.proxy"
          },
          "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/{proxy}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "ANY",
          "cacheNamespace": "rbftud",
          "cacheKeyParameters": [
            "method.request.path.proxy"
          ],
          "type": "http_proxy"
        }
      }
    }
  }
}
```

------

この例では、キャッシュのキーは、プロキシリソースの `method.request.path.proxy` パスパラメータで宣言されます。これにより、API Gateway コンソールを使用して API を作成するときのデフォルト設定です。API ベースパス (`/test`、ステージに対応) はウェブサイトの PetStore ページ (`/petstore`) にマッピングされます。単一の統合リクエストは、API の greedy パス変数とキャッチオールの `ANY` メソッドを使用して、PetStore ウェブサイト全体をミラーリング処理します。以下の例に、このミラーリングを示しています。
+ **`ANY` を `GET`、`{proxy+}` を `pets`** に設定

  フロントエンドから開始されたメソッドリクエスト:

  ```
  GET https://4z9giyi2c1.execute-api.us-west-2.amazonaws.com/test/pets HTTP/1.1
  ```

  バックエンドに送信された統合リクエスト:

  ```
  GET http://petstore-demo-endpoint.execute-api.com/petstore/pets HTTP/1.1
  ```

  `ANY` メソッドの実行時インスタンスとプロキシリソースの両方が有効です。呼び出しは `200 OK` レスポンスと、バックエンドから返されたペットの最初のバッチが含まれるペイロードを返します。
+ **`ANY` を `GET`、`{proxy+}` を `pets?type=dog`** に設定

  ```
  GET https://4z9giyi2c1.execute-api.us-west-2.amazonaws.com/test/pets?type=dog HTTP/1.1
  ```

  バックエンドに送信された統合リクエスト:

  ```
  GET http://petstore-demo-endpoint.execute-api.com/petstore/pets?type=dog HTTP/1.1
  ```

  `ANY` メソッドの実行時インスタンスとプロキシリソースの両方が有効です。呼び出しは `200 OK` レスポンスと、バックエンドから返された特定の犬の最初のバッチが含まれるペイロードを返します。
+ **`ANY` を `GET`、`{proxy+}` を `pets/{petId}`** に設定

  フロントエンドから開始されたメソッドリクエスト:

  ```
  GET https://4z9giyi2c1.execute-api.us-west-2.amazonaws.com/test/pets/1 HTTP/1.1
  ```

  バックエンドに送信された統合リクエスト:

  ```
  GET http://petstore-demo-endpoint.execute-api.com/petstore/pets/1 HTTP/1.1
  ```

  `ANY` メソッドの実行時インスタンスとプロキシリソースの両方が有効です。呼び出しは `200 OK` レスポンスと、バックエンドから返された特定のペットが含まれるペイロードを返します。
+ **`ANY` を `POST`、`{proxy+}` を `pets`** に設定

  フロントエンドから開始されたメソッドリクエスト:

  ```
  POST https://4z9giyi2c1.execute-api.us-west-2.amazonaws.com/test/pets HTTP/1.1
  Content-Type: application/json
  Content-Length: ...
  
  {
    "type" : "dog",
    "price" : 1001.00
  }
  ```

  バックエンドに送信された統合リクエスト:

  ```
  POST http://petstore-demo-endpoint.execute-api.com/petstore/pets HTTP/1.1
  Content-Type: application/json
  Content-Length: ...
  
  {
    "type" : "dog",
    "price" : 1001.00
  }
  ```

  `ANY` メソッドの実行時インスタンスとプロキシリソースの両方が有効です。呼び出しは `200 OK` レスポンスと、バックエンドから返された新しく作成したペットが含まれるペイロードを返します。
+ **`ANY` を `GET`、`{proxy+}` を `pets/cat`** に設定

  フロントエンドから開始されたメソッドリクエスト:

  ```
  GET https://4z9giyi2c1.execute-api.us-west-2.amazonaws.com/test/pets/cat
  ```

  バックエンドに送信された統合リクエスト:

  ```
  GET http://petstore-demo-endpoint.execute-api.com/petstore/pets/cat
  ```

  プロキシリソースパスの実行時インスタンスが、バックエンドのエンドポイントに対応しておらず、結果としいて生成されるリクエストは無効です。その結果、`400 Bad Request` レスポンスが次のエラーメッセージとともに返されます。

  ```
  {
    "errors": [
      {
        "key": "Pet2.type",
        "message": "Missing required field"
      },
      {
        "key": "Pet2.price",
        "message": "Missing required field"
      }
    ]
  }
  ```
+ **`ANY` を `GET`、`{proxy+}` を `null`** に設定

  フロントエンドから開始されたメソッドリクエスト:

  ```
  GET https://4z9giyi2c1.execute-api.us-west-2.amazonaws.com/test
  ```

  バックエンドに送信された統合リクエスト:

  ```
  GET http://petstore-demo-endpoint.execute-api.com/petstore/pets
  ```

  対象のリソースはプロキシリソースの親ですが、`ANY` メソッドを実行時インスタンスは、そのリソースの API に定義されていません。その結果、この `GET` リクエストは、`403 Forbidden` レスポンスと、API Gateway から返された `Missing Authentication Token` エラーを返します。API が親リソース (`ANY`) で `GET` または `/` メソッドを公開している場合、呼び出しからは `404 Not Found` レスポンスと、バックエンドから返された `Cannot GET /petstore` メッセージが返されます。

クライアントリクエストの場合、対象のエンドポイント URL が無効であるか、HTTP 動詞が有効であってもサポートされていない場合、バックエンドは `404 Not Found` レスポンスを返します。サポートされていない HTTP メソッドの場合は、`403 Forbidden` レスポンスが返されます。

## API Gateway の HTTP カスタム統合をセットアップする
<a name="set-up-http-custom-integrations"></a>

 非プロキシ統合とも呼ばれる HTTP カスタム統合により、API メソッドと API 統合の間を行き来するデータと行き来の方法をより詳細に制御できます。これにはデータマッピングを使用します。

メソッドリクエストのセットアップの一環として、[Method](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html) リソースの [requestParameters](https://docs.aws.amazon.com/apigateway/latest/api/API_Method.html#requestParameters) プロパティを設定します。これにより、クライアントからプロビジョニングされるメソッドリクエストパラメーターのうち、バックエンドにディスパッチされる前に統合リクエストパラメーターや該当する本文プロパティにマッピングされるものが宣言されます。次に、統合リクエストのセットアップの一環として、対応する [Integration](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) リソースで [requestParameters](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html#requestParameters) プロパティを設定し、パラメータ間のマッピングを指定します。また、[requestTemplates](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html#requestTemplates) プロパティを設定し、サポートされているコンテンツタイプにつき 1 つずつ、マッピングテンプレートを指定します。マッピングテンプレートは、メソッドリクエストパラメーターや本文を統合リクエストボディにマッピングします。

 同様に、メソッドレスポンスのセットアップの一環として、[MethodResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html) リソースで [responseParameters](https://docs.aws.amazon.com/apigateway/latest/api/API_MethodResponse.html#responseParameters) プロパティを設定します。これにより、クライアントにディスパッチされるメソッドレスポンスパラメーターのうち、統合レスポンスパラメーターからまたはバックエンドから返された該当する本文プロパティからマッピングされるものが宣言されます。次に、バックエンドからのレスポンスに基づいて統合レスポンスを選択するように [selectionPattern](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html#selectionPattern) を設定します。非プロキシ HTTP 統合の場合、これは正規表現です。例えば、すべての 2xx HTTP 応答ステータスコードを HTTP エンドポイントからこの出力マッピングにマッピングするには、`2\d{2}` を使用します。

**注記**  
API Gateway は、レスポンスマッピングに Java パターンスタイルの正規表現を使用します。詳細については、Oracle ドキュメントの「[パターン](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)」を参照してください。

次に、統合レスポンスのセットアップの一環として、対応する [IntegrationResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html) リソースで [responseParameters](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html#responseParameters) プロパティを設定し、パラメータからパラメータへのマッピングを指定します。また、[responseTemplates](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html#responseTemplates) マップを設定し、サポートされているコンテンツタイプごとにマッピングテンプレートを 1 つずつ指定します。マッピングテンプレートは、統合レスポンスパラメーターや統合レスポンス本文のプロパティをメソッドレスポンス本文にマッピングします。

 マッピングテンプレートの設定の詳細については、「[API Gateway での REST API のデータ変換](rest-api-data-transformations.md)」を参照してください。

# API Gateway でプロキシ統合の統合レスポンスをストリーミングする
<a name="response-transfer-mode"></a>

API Gateway が統合レスポンスを返す方法を制御するようにプロキシ統合を設定できます。デフォルトでは、API Gateway は送信を開始する前に完全なレスポンスを受信するのを待ちます。ただし、統合のレスポンス転送モードを `STREAM` に設定した場合、API Gateway はレスポンスが完全に計算されてからクライアントに送信されるまで待機しません。レスポンスストリーミングは、すべての REST API エンドポイントタイプで機能します。

以下のユースケースでレスポンスストリーミングを使用します。
+ チャットボットなどの生成 AI の最初のバイトまでの時間 (TTFB) を短縮します。
+ S3 の署名付き URL を使用せずに、大きなイメージ、ビデオ、または音楽ファイルをストリーミングします。
+ サーバー送信イベント (SSE) などの段階的な進行状況をレポートしながら、長時間実行されるオペレーションを実行します。
+ API Gateway の 10 MB のレスポンスペイロード制限を超えました。
+ 統合タイムアウト制限の引き上げをリクエストせずに、API Gateway の 29 秒のタイムアウト制限を超えました。
+ バイナリメディアタイプを設定せずにバイナリペイロードを受け取ります。

## レスポンスペイロードストリーミングに関する考慮事項
<a name="response-transfer-mode-considerations"></a>

以下の考慮事項は、レスポンスペイロードストリーミングの使用に影響する可能性があります。
+ レスポンスペイロードストリーミングは、`HTTP_PROXY` または `AWS_PROXY` 統合タイプでのみ使用できます。これには、Lambda プロキシ統合と、`HTTP_PROXY` 統合を使用するプライベート統合が含まれます。
+ デフォルトの転送モード設定は `BUFFERED` です。レスポンスストリーミングを使用するには、レスポンス転送モードを `STREAM` に変更する必要があります。
+ レスポンスストリーミングは REST API でのみサポートされます。
+ リクエストストリーミングはサポートされていません。
+ レスポンスは最大 15 分間ストリーミングできます。
+ ストリームはアイドルタイムアウトの対象となります。リージョンエンドポイントまたはプライベートエンドポイントの場合、タイムアウトは 5 分です。エッジ最適化エンドポイントの場合、タイムアウトは 30 秒です。
+ 独自の CloudFront ディストリビューションでリージョン REST API のレスポンスストリーミングを使用する場合、CloudFront ディストリビューションのレスポンスタイムアウトを増やすことで、30 秒を超えるアイドルタイムアウトを実現できます。詳細については、「[応答タイムアウト](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistValuesOrigin.html#DownloadDistValuesOriginResponseTimeout)」を参照してください。
+ レスポンス転送モードが `STREAM` に設定されている場合、API Gateway は統合レスポンス全体をバッファする必要がある機能をサポートできません。このため、以下の機能はレスポンスストリーミングではサポートされていません。
  + エンドポイントキャッシュ
  + コンテンツのエンコーディング。統合レスポンスを圧縮する場合は、統合でこれを行います。
  + VTL によるレスポンス変換
+ 各ストリーミングレスポンス内では、レスポンスペイロードの最初の 10MB は帯域幅制限の対象になりません。10MB を超えるレスポンスペイロードデータは 2MB/秒に制限されています。
+ クライアントと API Gateway 間、または API Gateway と Lambda 間の接続がタイムアウトにより閉じられた場合、Lambda 関数は引き続き実行される可能性があります。詳細については、「[Lambda 関数のタイムアウトを設定する](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)」を参照してください。
+ レスポンスストリーミングにはコストがかかります。詳細については、「[API Gateway の料金](https://aws.amazon.com/api-gateway/pricing/)」を参照してください。

# API Gateway でペイロードレスポンスストリーミングと HTTP プロキシ統合を設定する
<a name="response-streaming-http"></a>

レスポンスペイロードストリーミングを設定するときは、メソッドの統合リクエストでレスポンス転送モードを指定します。これらの設定は、統合リクエストで設定して、統合レスポンスの前と最中に API Gateway がどのように動作するかを制御します。レスポンスストリーミングを使用すると、統合タイムアウトを最大 15 分まで設定できます。

`HTTP_PROXY` 統合でペイロードレスポンスストリーミングを使用する場合、API Gateway はすべてのヘッダーを完全に受信するまで、HTTP レスポンスステータスコードまたは HTTP レスポンスヘッダーを送信しません。

## ペイロードレスポンスストリーミングとの HTTP プロキシ統合を作成する
<a name="response-streaming-http-create"></a>

次の手順では、`responseTransferMode` を `STREAM` に設定して新しい API をインポートする方法を示します。既存の統合 API があり、`responseTransferMode` を変更する場合は、「[HTTP プロキシ統合のレスポンス転送モードを更新する](#response-streaming-http-update)」を参照してください。

------
#### [ AWS マネジメントコンソール ]

**ペイロードレスポンスストリーミングとの HTTP プロキシ統合を作成するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

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

1. **[リソース名]** に **streaming** と入力します。

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

1. **[/streaming]** リソースを選択した状態で、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** で、**[任意]** を選択します。

1. **[統合タイプ]** で､ **[HTTP]** を選択します｡

1. **[HTTP プロキシ統合]** を選択します。

1. **[レスポンス転送モード]** で、**[ストリーム]** を選択します。

1. **[HTTP メソッド]** の場合は、メソッドを選択します。

1. **[エンドポイント URL]** には、統合エンドポイントを入力します。ストリーミングで返される大きなペイロードを生成するエンドポイントを必ず選択してください。

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

メソッドを作成したら、API をデプロイします。

**API をデプロイするには**

1. [**API のデプロイ**] を選択します。

1. **[ステージ]** で **[新規ステージ]** を選択します。

1. [**Stage name (ステージ名)**] に **prod** と入力します。

1. (オプション) **[説明]** に説明を入力します。

1. **[デプロイ]** をクリックします。

------
#### [ AWS CLI ]

**ペイロードレスポンスストリーミングを使用して新しい API を作成するには**

1. 以下の Open API ファイルをコピーし、`ResponseStreamDemoSwagger.yaml` として保存します。このファイルでは、`responseTransferMode` は `STREAM` に設定されます。統合エンドポイントは `https://example.com` に設定されていますが、大きなペイロードを生成するエンドポイントに変更して再ストリーミングすることをお勧めします。

   ```
   openapi: "3.0.1"
   info:
     title: "ResponseStreamingDemo"
     version: "2025-04-28T17:28:25Z"
   servers:
   - url: "{basePath}"
     variables:
       basePath:
         default: "prod"
   paths:
     /streaming:
       get:
         x-amazon-apigateway-integration:
           httpMethod: "GET"
           uri: "https://example.com"
           type: "http_proxy"
           timeoutInMillis: 900000
           responseTransferMode: "STREAM"
   ```

1. 次の `import-rest-api` コマンドを使用して、OpenAPI 定義をインポートします。

   ```
   aws apigateway import-rest-api \
     --body 'fileb://~/ResponseStreamDemoSwagger.yaml' \
     --parameters endpointConfigurationTypes=REGIONAL \
     --region us-west-1
   ```

1. 次の `create-deployment` コマンドを使用して、新しい API をステージにデプロイします。

   ```
   aws apigateway create-deployment \
     --rest-api-id a1b2c3 \
     --stage-name prod \
     --region us-west-1
   ```

------

## HTTP プロキシ統合のレスポンス転送モードを更新する
<a name="response-streaming-http-update"></a>

次の手順は、HTTP プロキシ統合のレスポンス転送モードを更新する方法を示しています。

------
#### [ AWS マネジメントコンソール ]

**HTTP プロキシ統合のレスポンス転送モードを更新するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. メソッドを選択します。

1. **[統合リクエスト]** タブの **[統合リクエストの設定]** で、**[編集]** を選択します。

1. **[レスポンス転送モード]** で、**[ストリーム]** を選択します。

1. **[保存]** を選択します。

メソッドを更新したら、API をデプロイします。

**API をデプロイするには**

1. [**API のデプロイ**] を選択します。

1. **[ステージ]** で **[新規ステージ]** を選択します。

1. [**Stage name (ステージ名)**] に **prod** と入力します。

1. (オプション) **[説明]** に説明を入力します。

1. **[デプロイ]** をクリックします。

------
#### [ AWS CLI ]

次の `update-integration` コマンドは、統合の転送モードを `BUFFERED` から `STREAM` に更新します。既存の API の場合、すべての統合のレスポンス転送モードは `BUFFERED` に設定されます。

```
aws apigateway update-integration \
 --rest-api-id a1b2c3 \
 --resource-id aaa111 \
 --http-method GET \
 --patch-operations "op='replace',path='/responseTransferMode',value=STREAM" \
 --region us-west-1
```

変更を有効にするには、API を再デプロイする必要があります。統合タイムアウトをカスタマイズした場合、API Gateway がレスポンスを最大 5 分間ストリーミングするため、このタイムアウト値は削除されます。

次の `update-integration` コマンドは、統合の転送モードを `STREAM` から `BUFFERED` に更新します。

```
aws apigateway update-integration \
 --rest-api-id a1b2c3 \
 --resource-id aaa111 \
 --http-method GET \
 --patch-operations "op='replace',path='/responseTransferMode',value=BUFFERED" \
 --region us-west-1
```

変更を有効にするには、API を再デプロイする必要があります。

------

# API Gateway でペイロードレスポンスストリーミングと Lambda プロキシ統合を設定する
<a name="response-transfer-mode-lambda"></a>

Lambda 関数のレスポンスをストリーミングして、最初のバイトまでの時間 (TTFB) のパフォーマンスを向上させ、利用可能になると部分的なレスポンスをクライアントに送信し直すことができます。API Gateway では、[InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) Lambda API を使用して Lambda 関数を呼び出す必要があります。API Gateway はイベントオブジェクトを Lambda 関数に渡します。バックエンド Lambda 関数では、受信リクエストデータを解析して、返すレスポンスを決定します。API Gateway が Lambda 出力をストリーミングするには、Lambda 関数が API Gateway に必要な[形式](#response-transfer-mode-lambda-format)を出力する必要があります。

## ストリームとバッファレスポンス転送モードの Lambda プロキシ統合の違い
<a name="response-transfer-mode-lambda-comparison"></a>

次のリストでは、レスポンスストリーミングの Lambda プロキシ統合と Lambda プロキシ統合の違いについて説明します。
+ API Gateway は、[InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) API を使用して、レスポンスストリーミング用の Lambda プロキシ統合を呼び出します。これにより、次の異なる URI になります。

  ```
  arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations
  ```

  この ARN は、Lambda プロキシ統合とは異なる API バージョンと異なるサービスアクションを使用します。

  レスポンスストリーミングに API Gateway コンソールを使用する場合、コンソールは正しい URI を使用します。
+ Lambda プロキシ統合では、API Gateway は Lambda から完全なレスポンスを受け取った後にのみクライアントにレスポンスを送信します。レスポンスストリーミング用の Lambda プロキシ統合では、API Gateway は Lambda から有効なメタデータと区切り記号を受け取った後にペイロードストリームを開始します。
+ レスポンスストリーミング用の Lambda プロキシ統合は、プロキシ統合と同じ入力形式を使用しますが、異なる出力形式が必要です。

## レスポンスストリーミング用の Lambda プロキシ統合形式
<a name="response-transfer-mode-lambda-format"></a>

API Gateway がレスポンスストリーミングで Lambda 関数を呼び出す場合、入力形式はプロキシ統合用の Lambda 関数の入力形式と同じです。詳細については、「[プロキシ統合のための Lambda 関数の入力形式](set-up-lambda-proxy-integrations.md#api-gateway-simple-proxy-for-lambda-input-format)」を参照してください。

Lambda が API Gateway にレスポンスをストリーミングする場合、レスポンスは次の形式に従う必要があります。この形式では、区切り記号を使用してメタデータ JSON と raw ペイロードを区切ります。この場合、ペイロードデータはストリーミング Lambda 関数によって送信されるときにストリーミングされます。

```
{
  "headers": {"headerName": "headerValue", ...},
  "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
  "cookies" : ["cookie1", "cookie2"],
  "statusCode": httpStatusCode
}<DELIMITER>PAYLOAD1 | PAYLOAD2 | PAYLOAD3
```

出力では、次のようになります。
+ 余分なレスポンスヘッダーが返されない場合、`headers`、`multiValueHeaders`、`cookies`、および `statusCode` キーは指定されません。
+ `headers` キーには、単一値のヘッダーのみを含めることができます。
+ 出力では、ヘッダーに `Transfer-Encoding: chunked` または `Content-length: number` が含まれていることが想定されます。関数がこれらのヘッダーのいずれかを返さない場合、API Gateway はレスポンスヘッダーに `Transfer-Encoding: chunked` を追加します。
+ `multiValueHeaders` キーには、複数値のヘッダーや単一値のヘッダーを含めることができます。`multiValueHeaders` キーを使用して、単一値のヘッダーを含めて、すべてのヘッダーを指定することができます。
+ `headers` と `multiValueHeaders` の両方の値を指定した場合、API Gateway はそれらを単一のリストにマージします。同じキーと値のペアが両方で指定された場合にのみ、`multiValueHeaders` の値が、マージされたリストに表示されます。
+ メタデータは有効な JSON である必要があります。`headers`、`multiValueHeaders`、`cookies`、および `statusCode` キーのみがサポートされます。
+ メタデータ JSON の後に区切り記号を指定する必要があります。区切り記号は 8 null バイトで、ストリームデータの最初の 16KB 以内に出現する必要があります。
+ API Gateway では、メソッドレスポンスペイロードに特定の形式は必要ありません。

関数 URL を使用して Lambda 関数をストリーミングする場合は、これらの要件を満たすように Lambda 関数の入力と出力を変更する必要があります。

Lambda 関数の出力がこの形式の要件に準拠していない場合でも、API Gateway は Lambda 関数を呼び出す可能性があります。次の表は、API Gateway でサポートされている API 統合リクエスト設定と Lambda 関数コードの組み合わせを示しています。これには、バッファリングされたレスポンス転送モードでサポートされている組み合わせが含まれます。


| レスポンス転送モード | 関数コードが必要な形式に準拠している | Lambda 呼び出し API | API Gateway でサポートされている | 
| --- | --- | --- | --- | 
|  ストリーム  |  あり  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  はい。API Gateway はレスポンスをストリーミングします。  | 
|  ストリーム  |  不可  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  いいえ。API Gateway は Lambda 関数を呼び出し、500 のエラーレスポンスを返します。  | 
|  ストリーム  |  あり  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  いいえ。API Gateway はこの統合設定をサポートしていません。  | 
|  ストリーム  |  不可  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  いいえ。API Gateway はこの統合設定をサポートしていません。  | 
|  バッファ済み  |  あり  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  いいえ。API Gateway はこの統合設定をサポートしていません。  | 
|  バッファ済み  |  不可  |   [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html)  |  いいえ。API Gateway はこの統合設定をサポートしていません。  | 
|  バッファ済み  |  あり  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  API Gateway は HTTP ヘッダーとステータスコードを返しますが、レスポンス本文は返しません。  | 
|  バッファ済み  |  不可  |   [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  はい。これは Lambda プロキシ統合です。詳細については、「[Lambda プロキシ統合](set-up-lambda-proxy-integrations.md)」を参照してください。  | 

# API Gateway で Lambda プロキシとペイロードレスポンスストリーミングを設定する
<a name="response-streaming-lambda-configure"></a>

レスポンスペイロードストリーミングを設定するときは、リソースの統合リクエストで転送モードを指定します。これらの設定は、統合リクエストで設定して、統合レスポンスの前と最中に API Gateway がどのように動作するかを制御します。

## レスポンスストリーミングの Lambda 関数の例
<a name="response-streaming-lambda-example"></a>

Lambda 関数は [レスポンスストリーミング用の Lambda プロキシ統合形式](response-transfer-mode-lambda.md#response-transfer-mode-lambda-format) に準拠している必要があります。レスポンスストリーミングをテストするには、3 つのサンプル Lambda 関数のいずれかを使用することをお勧めします。Lambda 関数を作成するときは、必ず以下を実行してください。
+ 関数に適切なタイムアウトを指定します。レスポンスストリーミングについて学習するには、少なくとも 1 分のタイムアウトを設定することをお勧めします。本番稼働用リソースを作成するときは、Lambda 関数のタイムアウトがリクエストサイクル全体をカバーしていることを確認してください。詳細については、「[Lambda 関数のタイムアウトを設定する](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)」を参照してください。
+ 最新の Node.js ランタイムを使用します。
+ Lambda レスポンスストリーミングが利用可能なリージョンを使用します。

------
#### [ Using HttpResponseStream.from ]

次のコード例では、パイプラインメソッドを使用せずに、`awslambda.HttpResponseStream()` メソッドを使用して JSON メタデータオブジェクトとペイロードをクライアントにストリーミングします。区切り記号を作成する必要はありません。詳細については、「[レスポンスストリーミング対応 Lambda 関数の記述](https://docs.aws.amazon.com/lambda/latest/dg/config-rs-write-functions.html)」を参照してください。

```
export const handler = awslambda.streamifyResponse(
  async (event, responseStream, context) => {
    const httpResponseMetadata = {
      "statusCode": 200,
      "headers": {
        "x-foo": "bar"
      },
      "multiValueHeaders": {
        "x-mv1": ["hello", "world"],
        "Set-Cookie": ["c1=blue", "c2=red"]
      }
    };

    responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata);
    await new Promise(r => setTimeout(r, 1000)); // synthetic delay

    responseStream.write("First payload ");
    await new Promise(r => setTimeout(r, 1000)); // synthetic delay

    responseStream.write("Final payload");
    responseStream.end();
});
```

------
#### [ Using the pipeline method ]

Lambda では、レスポンスストリーミングが有効な関数を記述するときに、ネイティブ Node.js ランタイムが提供する `awslambda.streamifyResponse()` デコレータと `pipeline()` メソッドを使用することをお勧めします。パイプラインメソッドを使用する場合、区切り記号を作成する必要はありません。Lambda がこれを行います。詳細については、「[レスポンスストリーミング対応 Lambda 関数の記述](https://docs.aws.amazon.com/lambda/latest/dg/config-rs-write-functions.html)」を参照してください。

次のコード例では、JSON メタデータオブジェクトと 3 つのペイロードをクライアントにストリーミングします。

```
import { pipeline } from 'node:stream/promises';
import { Readable } from 'node:stream';

export const handler = awslambda.streamifyResponse(
  async (event, responseStream, context) => {
    const httpResponseMetadata = {
      statusCode: 200,
      headers: {
        "Content-Type": "text/plain",
        "X-Custom-Header": "Example-Custom-Header"
      }
    };

    responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata);

    const dataStream = Readable.from(async function* () {
      yield "FIRST payload\n";
      await new Promise(r => setTimeout(r, 1000));
      yield "SECOND payload\n";
      await new Promise(r => setTimeout(r, 1000));
      yield "THIRD payload\n";
      await new Promise(r => setTimeout(r, 1000));
    }());

    await pipeline(dataStream, responseStream);
  }
);
```

------
#### [ Without using the pipeline method ]

次のコード例では、`awslambda.HttpResponseStream()` メソッドを使用せずに、JSON メタデータオブジェクトと 3 つのペイロードをクライアントにストリーミングします。`awslambda.HttpResponseStream()` メソッドを使用しない場合は、メタデータとペイロードの間に 8 null バイトの区切り記号を含める必要があります。

```
export const handler = awslambda.streamifyResponse(async (event, response, ctx) => {
  response.write('{"statusCode": 200, "headers": {"hdr-x": "val-x"}}');
  response.write("\x00".repeat(8)); // DELIMITER
  await new Promise(r => setTimeout(r, 1000));

  response.write("FIRST payload");
  await new Promise(r => setTimeout(r, 1000));

  response.write("SECOND payload");
  await new Promise(r => setTimeout(r, 1000));

  response.write("FINAL payload");
  response.end();
});
```

------

## ペイロードレスポンスストリーミングとの Lambda プロキシ統合を作成する
<a name="response-streaming-lambda-create"></a>

次の手順は、ペイロードレスポンスストリーミングで Lambda プロキシ統合を作成する方法を示しています。Lambda 関数の例を使用するか、独自の関数を作成します。

------
#### [ AWS マネジメントコンソール ]

**ペイロードレスポンスストリーミングで Lambda プロキシ統合を作成するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

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

1. **[リソース名]** に **streaming** と入力します。

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

1. **[/streaming]** リソースを選択した状態で、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** で、**[任意]** を選択します。

1. **[統合タイプ]** で、**[Lambda]** を選択します。

1. **[Lambda プロキシ統合]** を選択します。

1. **[レスポンス転送モード]** で、**[ストリーム]** を選択します。

1. **[Lambda 関数]** で、Lambda 関数の名前を選択します。

   API Gateway コンソールは、[InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) API を自動的に使用して Lambda 関数を呼び出します。お客様は、レスポンスのストリーミングが有効な Lambda 関数を記述する責任があります。例については、[レスポンスストリーミングの Lambda 関数の例](#response-streaming-lambda-example)を参照してください。

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

メソッドを作成したら、API をデプロイします。

**API をデプロイするには**

1. [**API のデプロイ**] を選択します。

1. **[ステージ]** で **[新規ステージ]** を選択します。

1. [**Stage name (ステージ名)**] に **prod** と入力します。

1. (オプション) **[説明]** に説明を入力します。

1. **[デプロイ]** をクリックします。

------
#### [ AWS CLI ]

次の手順では、`responseTransferMode` を `STREAM` に設定して新しい API をインポートする方法を示します。既存の統合 API があり、`responseTransferMode` を変更する場合は、「[Lambda プロキシ統合のレスポンス転送モードを更新する](#response-streaming-lambda-update)」を参照してください。

**ペイロードレスポンスストリーミングを使用して新しい API を作成するには**

1. 以下の Open API ファイルをコピーし、`ResponseStreamDemoSwagger.yaml` として保存します。このファイルでは、`responseTransferMode` は `STREAM` に設定され、統合 URI は `arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations` に設定されます。

   `my-function` の関数名をストリーミング対応関数に置き換え、認証情報を、`apigateway` サービスが Lambda 関数を呼び出すことを許可するポリシーを持つ IAM ロールに置き換えます。

   ```
   openapi: "3.0.1"
   info:
     title: "ResponseStreamingDemo"
     version: "2025-04-28T17:28:25Z"
   servers:
   - url: "{basePath}"
     variables:
       basePath:
         default: "prod"
   paths:
     /lambda:
       get:
         x-amazon-apigateway-integration:
           httpMethod: "POST"
           uri: "arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations"
           type: "aws_proxy"
           timeoutInMillis: 90000
           responseTransferMode: "STREAM"
           credentials: "arn:aws:iam::111122223333:role/apigateway-lambda-role"
   ```

   認証情報の IAM ロールを指定する代わりに、Lambda の `add-permission` コマンドを使用してリソースベースのアクセス許可を追加できます。

1. 次の `import-rest-api` コマンドを使用して、OpenAPI 定義をインポートします。

   ```
   aws apigateway import-rest-api \
     --body 'fileb://~/ResponseStreamDemoSwagger.yaml' \
     --parameters endpointConfigurationTypes=REGIONAL \
     --region us-west-1
   ```

1. 次の `create-deployment` コマンドを使用して、新しい API をステージにデプロイします。

   ```
   aws apigateway create-deployment \
     --rest-api-id a1b2c2 \
     --stage-name prod \
     --region us-west-1
   ```

------

### Lambda プロキシ統合のレスポンス転送モードを更新する
<a name="response-streaming-lambda-update"></a>

次の手順は、Lambda プロキシ統合のレスポンス転送モードを更新する方法を示しています。レスポンス転送モードをストリーミングに変更する場合は、レスポンスストリーミングの要件に準拠するように Lambda 関数を更新します。Lambda 関数の例を使用するか、独自の関数を作成します。

------
#### [ AWS マネジメントコンソール ]

**Lambda プロキシ統合のレスポンス転送モードを更新するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. メソッドを選択します。

1. **[統合リクエスト]** タブの **[統合リクエストの設定]** で、**[編集]** を選択します。

1. **[レスポンス転送モード]** で、**[ストリーム]** を選択します。

1. **[Lambda 関数]** で、Lambda 関数の名前を選択します。

1. **[保存]** を選択します。

メソッドを更新したら、API をデプロイします。

**API をデプロイするには**

1. [**API のデプロイ**] を選択します。

1. **[ステージ]** で **[新規ステージ]** を選択します。

1. [**Stage name (ステージ名)**] に **prod** と入力します。

1. (オプション) **[説明]** に説明を入力します。

1. **[デプロイ]** をクリックします。

------
#### [ AWS CLI ]

1. Lambda 関数を更新してストリーミングを有効にします。

1. 次の AWS CLI コマンドを使用して、統合 URI と統合のレスポンス転送モードを更新します。

   ```
   aws apigateway update-integration \
    --rest-api-id a1b2c3 \
    --resource-id aaa111 \
    --http-method ANY \
    --patch-operations "[{\"op\":\"replace\",\"path\":\"/uri\",\"value\":\"arn:aws:apigateway:us-west-1:lambda:path/2021-11-15/functions/arn:aws:lambda:us-west-1:111122223333:function:my-function-name/response-streaming-invocations\"}, {\"op\":\"replace\",\"path\":\"/responseTransferMode\",\"value\":\"STREAM\"}]" \
    --region us-west-1
   ```

1. 変更を有効にするには、API を再デプロイします。

------

# API Gateway でのレスポンスストリーミングに関する問題のトラブルシューティング
<a name="response-streaming-troubleshoot"></a>

次のトラブルシューティングガイダンスは、レスポンスストリーミングを試用する API の問題を解決するのに役立ちます。

## 一般的なトラブルシューティング
<a name="response-streaming-general-troubleshooting"></a>

[TestInvokeMethod](https://docs.aws.amazon.com/apigateway/latest/api/API_TestInvokeMethod.html) またはコンソールのテストタブを使用して、ストリームレスポンスをテストできます。以下の考慮事項は、レスポンスストリーミングでのテスト呼び出しの使用に影響する可能性があります。
+ メソッドをテストすると、API Gateway はストリーミングされたレスポンスペイロードをバッファリングします。次のいずれかの条件が満たされると、API Gateway はバッファリングされたペイロードを含む 1 回限りのレスポンスを返します。
  + リクエストが完了しました
  + 35 秒経過
  + 1 MB を超えるレスポンスペイロードがバッファされています
+ メソッドが HTTP レスポンスステータスとすべてのヘッダーを返すまでに 35 秒以上経過した場合、TestInvokeMethod で返されるレスポンスステータスは 0 になります。
+ API Gateway は実行ログを生成しません。

API をデプロイしたら、curl コマンドを使用してストリームレスポンスをテストできます。出力にプロトコルレスポンスヘッダーを含めるには、`-i` オプションを使用することをお勧めします。到着時にレスポンスデータを表示するには、curl オプション `--no-buffer` を使用します。

## cURL エラーのトラブルシューティング
<a name="response-streaming-troubleshoot-curl-error"></a>

統合をテストしていて、`curl: (18) transfer closed with outstanding read data remaining` エラーが表示される場合は、統合のタイムアウトが十分に長いことを確認してください。Lambda 関数を使用している場合は、Lambda 関数のレスポンスタイムアウトを更新する必要があります。詳細については、「[Lambda 関数のタイムアウトを設定する](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)」を参照してください。

## アクセスログ記録を使用したトラブルシューティング
<a name="response-streaming-troubleshoot-access-logging"></a>

REST API ステージのアクセスログを使用して、レスポンスストリームのログ記録とトラブルシューティングを行うことができます。既存の変数に加えて、次のアクセスログ変数を使用できます。

`$context.integration.responseTransferMode`  
統合のレスポンス転送モード。`BUFFERED` または `STREAMED` のいずれかとなります。

`$context.integration.timeToAllHeaders`  
API Gateway が統合接続を確立してから、クライアントからすべての統合レスポンスヘッダーを受信するまでの時間。

`$context.integration.timeToFirstContent`  
API Gateway が統合接続を確立してから、最初のコンテンツバイトを受信するまでの時間。

`$context.integration.latency`-または-`$context.integrationLatency`  
API Gateway が統合接続を確立してから統合レスポンスストリームが完了するまでの時間。

次の図は、これらのアクセスログ変数がレスポンスストリームのさまざまなコンポーネントをどのように表しているかを示しています。

![\[API Gateway でのレスポンスストリーミングのアクセスログ変数\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/response-streaming-figure.png)


アクセスログの詳細については、「[API Gateway で REST API の CloudWatch ログ記録を設定する](set-up-logging.md)」を参照してください。X-Ray を使用してレスポンスストリームをモニタリングすることもできます。詳細については、「[API Gateway で X-Ray を使用して REST API へのユーザーリクエストをトレースする](apigateway-xray.md)」を参照してください。

# API Gateway での REST API のプライベート統合
<a name="private-integration"></a>

プライベートな統合を使用して、VPC 内にある HTTP/HTTPS リソースを公開し、VPC 外のクライアントがアクセスできるようにします。これにより、プライベート VPC リソースへのアクセスが VPC の境界を超えて拡張されます。API Gateway がサポートするいずれかの[認可方法](apigateway-control-access-to-api.md)を使用して、API へのアクセスを制御できます。

プライベート統合を作成するには、まず VPC リンクを作成する必要があります。API Gateway は、REST API 用の VPC リンク V2 をサポートしています。VPC リンク V2 を使用すると、Network Load Balancer を使用せずに REST API を Application Load Balancer に接続するプライベート統合を作成できます。Application Load Balancer を使用すると、Amazon ECS コンテナベースのアプリケーションやその他の多くのバックエンドに接続できます。VPC リンク V1 はレガシー統合タイプと見なされます。API Gateway でサポートされていますが、新しい VPC リンク V1 を作成しないことをお勧めします。

## 考慮事項
<a name="private-integrations-considerations"></a>

以下の考慮事項は、プライベート統合の使用に影響する可能性があります。
+ すべてのリソースは、同じ AWS アカウントによって所有されている必要があります。これには、ロードバランサー、VPC リンク、REST API が含まれます。
+ デフォルトでは、プライベート統合トラフィックは HTTP プロトコルを使用します。HTTPS を使用するには、`https://example.com:443/test` などの安全なサーバー名を含む [https://docs.aws.amazon.com/apigateway/latest/api/API_PutIntegration.html#apigw-PutIntegration-request-uri](https://docs.aws.amazon.com/apigateway/latest/api/API_PutIntegration.html#apigw-PutIntegration-request-uri) を指定します。
+ プライベート統合では、API Gateway はバックエンドリソースへのリクエストに API エンドポイントの[ステージ](set-up-stages.md)部分を含めます。例えば、API の `test` ステージをリクエストすると、API Gateway はプライベート統合へのリクエストに `test/path` を含めます。バックエンドリソースへのリクエストからステージ名を削除するには、[パラメータのマッピング](rest-api-parameter-mapping.md)を使用して、`$context.requestOverride.path` 変数の上書きを作成します。
+ AWS Cloud Map とのプライベート統合はサポートされていません。

**Topics**
+ [

## 考慮事項
](#private-integrations-considerations)
+ [

# API Gateway で VPC リンク V2 を設定する
](apigateway-vpc-links-v2.md)
+ [

# プライベート統合の設定
](set-up-private-integration.md)
+ [

# VPC リンク V1 を使用したプライベート統合 (レガシー)
](vpc-links-v1.md)

# API Gateway で VPC リンク V2 を設定する
<a name="apigateway-vpc-links-v2"></a>

VPC リンクを使用すると、Application Load Balancer または Amazon ECS コンテナベースのアプリケーションなどの、API ルートを VPC 内のプライベートリソースに接続するプライベート統合を作成できます。プライベート統合は、VPC リンク V2 を使用して、API Gateway と、対象となる VPC リソース間の接続をカプセル化します。異なるリソースと API 間で VPC リンクを再利用できます。

VPC リンクを作成すると、API Gateway はアカウントの VPC リンク V2 用の [Elastic Network Interface](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html) を作成および管理します。このプロセスには数分かかることがあります。VPC リンク V2 を使用する準備ができたら、状態は `PENDING` から `AVAILABLE` に移行します。

**注記**  
VPC リンク経由で 60 日間トラフィックが送信されない場合は、`INACTIVE` になります。VPC リンクが `INACTIVE` 状態の場合、API Gateway は VPC リンクのネットワークインターフェイスをすべて削除します。これにより、VPC リンクに依存する API リクエストが失敗します。API リクエストが再開すると、API Gateway はネットワークインターフェイスを再プロビジョニングします。ネットワークインターフェイスを作成し、VPC リンクを再度アクティブ化するには、数分かかることがあります。VPC リンクステータスを使用して、VPC リンクの状態を監視できます。

## AWS CLI を使用して VPC リンク V2 を作成する
<a name="apigateway-vpc-links-v2-create"></a>

VPC リンク V2 を作成するには、関連するすべてのリソースが同じ AWS アカウントによって所有されている必要があります。次の [create-vpc-link](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-vpc-link.html) コマンドは、VPC リンクを作成します。

```
aws apigatewayv2 create-vpc-link --name MyVpcLink \
    --subnet-ids subnet-aaaa subnet-bbbb \
    --security-group-ids sg1234 sg5678
```

**注記**  
VPC リンク V2 は変更できません。VPC リンク V2 を作成した後は、そのサブネットやセキュリティグループを変更することはできません。

## AWS CLI を使用して VPC リンク V2 を削除する
<a name="apigateway-vpc-links-v2-delete"></a>

次の [delete-vpc-link](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/delete-vpc-link.html) コマンドは、VPC リンクを削除します。

```
aws apigatewayv2 delete-vpc-link --vpc-link-id abcd123
```

## リージョン別の利用可能性
<a name="apigateway-vpc-links-v2-availability"></a>

VPC リンク V2 は、次のリージョンとアベイラビリティーゾーンでサポートされています。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-vpc-links-v2.html)

# プライベート統合の設定
<a name="set-up-private-integration"></a>

Application Load Balancer または Network Load Balancer とのプライベート統合を作成するには、HTTP プロキシ統合を作成し、使用する [VPC リンク V2](apigateway-vpc-links-v2.md) を指定して、Network Load Balancer または Application Load Balancer の ARN を指定します。デフォルトでは、プライベート統合トラフィックは HTTP プロトコルを使用します。HTTPS を使用するには、`https://example.com:443/test` などの安全なサーバー名を含む [https://docs.aws.amazon.com/apigateway/latest/api/API_PutIntegration.html#apigw-PutIntegration-request-uri](https://docs.aws.amazon.com/apigateway/latest/api/API_PutIntegration.html#apigw-PutIntegration-request-uri) を指定します。プライベート統合で REST API を作成する方法の完全なチュートリアルについては、「[チュートリアル: プライベート統合を使用して REST API を作成する](getting-started-with-private-integration.md)」を参照してください。

## プライベート統合の作成
<a name="set-up-private-integration-create"></a>

以下の手順は、VPC リンク V2 を使用してロードバランサーに接続するプライベート統合を作成する方法を示しています。

------
#### [ AWS マネジメントコンソール ]

プライベート統合を作成する方法のチュートリアルについては、「[チュートリアル: プライベート統合を使用して REST API を作成する](getting-started-with-private-integration.md)」を参照してください。

------
#### [ AWS CLI ]

次の [put-integration](https://docs.aws.amazon.com/cli/latest/reference/latest/api/API_PutIntegration.html) コマンドは、VPC リンク V2 を使用してロードバランサーに接続するプライベート統合を作成します。

```
aws apigateway put-integration \
    --rest-api-id abcdef123 \
    --resource-id aaa000 \
    --integration-target 'arn:aws:elasticloadbalancing:us-east-2:111122223333:loadbalancer/app/myLoadBalancerName/1234567891011' \
    --uri 'https://example.com:443/path' \
    --http-method GET \
    --type HTTP_PROXY \
    --integration-http-method GET \
    --connection-type VPC_LINK \
    --connection-id bbb111
```

接続 ID を直接指定する代わりに、ステージ変数を使用できます。API をステージにデプロイするときは、VPC リンク V2 ID を設定します。次の [put-integration](https://docs.aws.amazon.com/cli/latest/reference/latest/api/API_PutIntegration.html) コマンドは、VPC リンク V2 ID のステージ変数を使用してプライベート統合を作成します。

```
aws apigateway put-integration \
    --rest-api-id abcdef123 \
    --resource-id aaa000 \
    --integration-target 'arn:aws:elasticloadbalancing:us-east-2:111122223333:loadbalancer/app/myLoadBalancerName/1234567891011' \
    --uri 'https://example.com:443/path' \
    --http-method GET \
    --type HTTP_PROXY \
    --integration-http-method GET \
    --connection-type VPC_LINK \
    --connection-id "\${stageVariables.vpcLinkV2Id}"
```

ステージ変数表現 (\$1\$1stageVariables.vpcLinkV2Id\$1) を二重引用符で囲み、\$1 文字をエスケープします。

------
#### [ OpenAPI ]

API の OpenAPI ファイルをインポートすることで、プライベート統合を使用して API を設定することができます。これらの設定は、HTTP 統合を使用する API の OpenAPI 定義と似ていますが、次のような例外があります。
+ `connectionType` を明示的に `VPC_LINK` に設定する必要があります。
+ `connectionId` を `VpcLinkV2` の ID または `VpcLinkV2` の ID を参照するステージ変数に明示的に設定する必要があります。
+ プライベート統合の `uri` パラメータは、VPC 内の HTTP/HTTPS エンドポイントを指しますが、代わりに統合リクエストの `Host` ヘッダーを設定するために使用されます。
+ VPC 内の HTTPS エンドポイントとのプライベート統合における `uri` パラメータは、記載されているドメイン名を VPC エンドポイントにインストールされている証明書内のドメイン名と照合するために使用されます。

 ステージ変数を使用して `VpcLinkV2` ID を参照することができます。または、ID 値を `connectionId` に直接割り当てることもできます。

次の JSON 形式の OpenAPI ファイルは、ステージ変数 (`${stageVariables.vpcLinkIdV2}`) によって参照された VPC リンクが設定された API の例を示しています。

```
{
  "swagger": "2.0",
  "info": {
    "version": "2017-11-17T04:40:23Z",
    "title": "MyApiWithVpcLinkV2"
  },
  "host": "abcdef123.execute-api.us-west-2.amazonaws.com",
  "basePath": "/test",
  "schemes": [
    "https"
  ],
  "paths": {
    "/": {
      "get": {
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "uri": "https://example.com:443/path",
          "passthroughBehavior": "when_no_match",
          "connectionType": "VPC_LINK",
          "connectionId": "${stageVariables.vpcLinkV2Id}",
          "integration-target": "arn:aws:elasticloadbalancing:us-east-2:111122223333:loadbalancer/app/myLoadBalancerName/1234567891011",
          "httpMethod": "GET",
          "type": "http_proxy"
        }
      }
    }
  },
  "definitions": {
    "Empty": {
      "type": "object",
      "title": "Empty Schema"
    }
  }
}
```

------

## プライベート統合の更新
<a name="set-up-private-integration-update"></a>

次の例では、プライベート統合の VPC リンク V2 を更新します。

------
#### [ AWS マネジメントコンソール ]

**プライベート統合を更新するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. プライベート統合で REST API を選択します。

1. プライベート統合を使用するリソースとメソッドを選択します。

1. **[統合リクエスト]** タブの **[統合リクエストの設定]** で、**[編集]** を選択します。

1. プライベート統合の設定を編集できます。現在 VPC リンク V1 を使用している場合は、VPC リンクを VPC リンク V2 に変更できます。

1. **[保存]** を選択します。

1. 変更を有効にするには、API を再デプロイします。

------
#### [ AWS CLI ]

次の [update-integration](https://docs.aws.amazon.com/cli/latest/reference/latest/api/API_PutIntegration.html) コマンドは、VPC リンク V2 を使用するようにプライベート統合を更新します。

```
aws apigateway update-integration \
    --rest-api-id a1b2c3d4e5 \
    --resource-id a1b2c3 \
    --http-method GET \
    --patch-operations "[{\"op\":\"replace\",\"path\":\"/connectionId\",\"value\":\"pk0000\"}, {\"op\":\"replace\",\"path\":\"/uri\",\"value\":\"http://example.com\"}, {\"op\":\"replace\",\"path\":\"/integrationTarget\",\"value\":\"arn:aws:elasticloadbalancing:us-east-2:111122223333:loadbalancer/app/myLoadBalancerName/1234567891011\"}]"
```

------

# VPC リンク V1 を使用したプライベート統合 (レガシー)
<a name="vpc-links-v1"></a>

**注記**  
プライベート統合の次の実装では、VPC リンク V1 を使用します。VPC リンク V1 はレガシーリソースです。[REST API には VPC リンク V2](apigateway-vpc-links-v2.md) を使用することをお勧めします。

プライベート統合を作成するには、まず Network Load Balancer を作成する必要があります。Network Load Balancer には、VPC 内のリソースにリクエストをルーティングする[リスナー](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-listeners.html)が必要です。API の可用性を高めるには、Network Load Balancer が、AWS リージョン内の複数のアベイラビリティーゾーンにあるリソースにトラフィックをルーティングするようにします。その後、API と Network Load Balancer を接続するために使用する VPC リンクを作成します。VPC リンクを作成したら、プライベート統合を作成して、VPC リンクと Network Load Balancer を介して API から VPC 内のリソースにトラフィックをルーティングします。Network Load Balancer と API は、同じ AWS アカウントによって所有されている必要があります。

**Topics**
+ [

# API Gateway のプライベート統合の Network Load Balancer を設定する (レガシー)
](set-up-nlb-for-vpclink-using-console.md)
+ [

# VPC リンクを作成するためのアクセス許可を API Gateway に付与する (レガシー)
](grant-permissions-to-create-vpclink.md)
+ [

# AWS CLI を使用してプライベート統合で API Gateway API をセットアップする (レガシー)
](set-up-api-with-vpclink-cli.md)
+ [

# プライベート統合用の API Gateway アカウント (レガシー)
](set-up-api-with-vpclink-accounts.md)

# API Gateway のプライベート統合の Network Load Balancer を設定する (レガシー)
<a name="set-up-nlb-for-vpclink-using-console"></a>

**注記**  
プライベート統合の次の実装では、VPC リンク V1 を使用します。VPC リンク V1 はレガシーリソースです。[REST API には VPC リンク V2](apigateway-vpc-links-v2.md) を使用することをお勧めします。

 次の手順では、Amazon EC2 コンソールを使用して API Gateway のプライベート統合用に Network Load Balancer (NLB) を設定するステップを説明し、各ステップの詳細な手順の参照を提供します。

各 VPC にリソースがあり、1 つの NLB と 1 つ VPCLink 設定するだけで済みます。NLB は、NLB あたり複数の[リスナー](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-listeners.html)と[ターゲットグループ](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html)をサポートしています。各サービスを NLB の特定のリスナーとして設定でき、単一の VPCLink を使用して NLB に接続できます。API Gateway でプライベート統合を作成するときに、各サービスに割り当てられた特定のポートを使用して、各サービスを定義します。詳細については、「[チュートリアル: プライベート統合を使用して REST API を作成する](getting-started-with-private-integration.md)」を参照してください。Network Load Balancer と API は、同じ AWS アカウントによって所有されている必要があります。

**API Gateway コンソールを使用してプライベート統合用の Network Load Balancer を作成するには**

1. AWS マネジメントコンソール にサインインし、Amazon EC2 コンソール ([https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)) を開きます。

1. Amazon EC2 インスタンスでウェブサーバーを設定します。設定例については、「[Amazon Linux 2 への LAMP ウェブサーバーのインストール](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html)」を参照してください。

1. Network Load Balancer を作成し、ターゲットグループに EC2 インスタンスを登録し、ターゲットグループを Network Load Balancer のリスナーに追加します。詳細については、「[Network Load Balancer の使用開始](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/network-load-balancer-getting-started.html)」の手順に従います。

1. Network Load Balancer を作成したら、次の操作を行います。

   1.  Network Load Balancer の ARN をメモします。API を Network Load Balancer の背後にある VPC リソースと統合するために、API Gateway に VPC リンクを作成する際にそれが必要になります。

   1.  PrivateLink のセキュリティグループ評価をオフにします。
      + コンソールを使用して PrivateLink トラフィックのセキュリティグループ評価をオフにするには、**[セキュリティ]** タブ、**[編集]** の順に選択します。**[セキュリティ設定]** で、**[PrivateLink トラフィックにインバウンドルールを適用する]** をオフにします。
      + 次の [set-security-groups](https://docs.aws.amazon.com/cli/latest/reference/elbv2/set-security-groups.html) コマンドを使用して、PrivateLink トラフィックのセキュリティグループの評価をオフにします。

        ```
        aws elbv2 set-security-groups --load-balancer-arn arn:aws:elasticloadbalancing:us-east-2:111122223333:loadbalancer/net/my-loadbalancer/abc12345 \
          --security-groups sg-123345a --enforce-security-group-inbound-rules-on-private-link-traffic off
        ```

**注記**  
API Gateway CIDR は予告なしに変更されることがありますので、依存関係を追加しないでください。

# VPC リンクを作成するためのアクセス許可を API Gateway に付与する (レガシー)
<a name="grant-permissions-to-create-vpclink"></a>

**注記**  
プライベート統合の次の実装では、VPC リンク V1 を使用します。VPC リンク V1 はレガシーリソースです。[REST API には VPC リンク V2](apigateway-vpc-links-v2.md) を使用することをお勧めします。

VPC リンクを作成および維持するためのアカウント内のユーザーは、VPC エンドポイントサービス設定の作成、削除、および表示、VPC エンドポイントサービスのアクセス許可の変更、およびロードバランサーの検証の権限を持っている必要があります。このような権限を付与するには、次のステップを使用します。

**VPC リンクを作成、更新、削除するためのアクセス許可を付与するには**

1. 次のような IAM ポリシーを作成します。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "apigateway:POST",
                   "apigateway:GET",
                   "apigateway:PATCH",
                   "apigateway:DELETE"
               ],
               "Resource": [
                   "arn:aws:apigateway:us-east-1::/vpclinks",
                   "arn:aws:apigateway:us-east-1::/vpclinks/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "elasticloadbalancing:DescribeLoadBalancers"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:CreateVpcEndpointServiceConfiguration",
                   "ec2:DeleteVpcEndpointServiceConfigurations",
                   "ec2:DescribeVpcEndpointServiceConfigurations",
                   "ec2:ModifyVpcEndpointServicePermissions"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

   VPC リンクのタグ付けを有効にする場合は、タグ付けオペレーションを許可してください。詳細については、「[タグ付けオペレーションを許可する](apigateway-tagging-iam-policy.md#allow-tagging)」を参照してください。

1. IAM ロールを作成または選択し、前述のポリシーをロールにアタッチします。

1. 自分または VPC リンクを作成しているアカウントのユーザーに IAM ロールを割り当てます。

# AWS CLI を使用してプライベート統合で API Gateway API をセットアップする (レガシー)
<a name="set-up-api-with-vpclink-cli"></a>

**注記**  
プライベート統合の次の実装では、VPC リンク V1 を使用します。VPC リンク V1 はレガシーリソースです。[REST API には VPC リンク V2](apigateway-vpc-links-v2.md) を使用することをお勧めします。

次のチュートリアルでは、AWS CLI を使用して VPC リンクとプライベート統合を作成する方法を示します。以下の前提条件を満たす必要があります。
+ ターゲットとして VPC ソースを使用して Network Load Balancer を作成し、設定する必要があります。詳細については、「[API Gateway のプライベート統合の Network Load Balancer を設定する (レガシー)](set-up-nlb-for-vpclink-using-console.md)」を参照してください。これは API と同じ AWS アカウントに存在する必要があります。VPC リンクを作成するには、Network Load Balancer ARN が必要です。
+ `VpcLink` を作成および管理するには、API で `VpcLink` を作成するためのアクセス許可が必要です。`VpcLink` を使用するアクセス許可は必要ありません。詳細については、「[VPC リンクを作成するためのアクセス許可を API Gateway に付与する (レガシー)](grant-permissions-to-create-vpclink.md)」を参照してください。

**AWS CLI を使用して、プライベート統合で API を設定するには**

1. 次の [create-vpc-link](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-vpc-link.html) コマンドを使用して、指定した Network Load Balancer をターゲットとする `VpcLink` を作成します。

   ```
   aws apigateway create-vpc-link \
       --name my-test-vpc-link \
       --target-arns arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/net/my-vpclink-test-nlb/1234567890abcdef
   ```

   このコマンドの出力は、リクエストの受信を確認し、作成中の `VpcLink` のステータス `PENDING` を示します。

   ```
   {
       "status": "PENDING", 
       "targetArns": [
           "arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/net/my-vpclink-test-nlb/1234567890abcdef"
       ], 
       "id": "gim7c3", 
       "name": "my-test-vpc-link"
   }
   ```

   API Gateway が `VpcLink` の作成を完了するまでに 2〜4 分かかります。操作が正常に終了すると、`status` は `AVAILABLE` になります。作成した VPC リンクを確認するには、次の [get-vpc-link](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-vpc-link.html) コマンドを使用できます。

   ```
   aws apigateway get-vpc-link --vpc-link-id gim7c3
   ```

   操作が失敗した場合、エラーメッセージを含む `FAILED` と共に `statusMessage` ステータスが表示されます。たとえば、すでに VPC エンドポイントに関連付けられている Network Load Balancer を使用して `VpcLink` を作成しようとすると、`statusMessage` プロパティで次のように表示されます。

   ```
   "NLB is already associated with another VPC Endpoint Service"
   ```

   `VpcLink` が正常に作成された後は、API を作成し、`VpcLink` を通じて VPC リソースと統合することができます。

   新しく作成した `VpcLink` の `id` 値をメモしておきます。この出力例では、`gim7c3` です。プライベート統合を設定する際にそれが必要になります。

1. 次の [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドを使用して、API Gateway [https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html) リソースを作成します。

   ```
   aws apigateway create-rest-api --name 'My VPC Link Test'
   ```

   返された結果の `RestApi` の `id` 値と `RestApi` の `rootResourceId` 値をメモしておきます。API でさらにオペレーションを実行するには、この値が必要です。

   次に、ルートリソース (`/`) に `GET` メソッドのみを持つ API を作成し、そのメソッドを `VpcLink` と統合します。

1. 次の [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) コマンドを使用して、`GET /` メソッドを作成します。

   ```
   aws apigateway put-method \
          --rest-api-id  abcdef123 \
          --resource-id skpp60rab7 \
          --http-method GET \
          --authorization-type "NONE"
   ```

   `VpcLink` とのプロキシ統合を使用しない場合は、少なくとも `200` ステータスコードのメソッドレスポンスも設定する必要があります。ここでは、プロキシ統合を使用します。

1. `GET /` メソッドを作成したら、統合を設定します。プライベート統合の場合は、`connection-id` パラメータを使用して `VpcLink` ID を指定します。ステージ変数を使用するか、`VpcLink` ID を直接入力できます。`uri` パラメータは、エンドポイントへのルーティングリクエストには使用されませんが、`Host` ヘッダーの設定および証明書の検証に使用されます。

------
#### [ Use the VPC link ID ]

   次の [put-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration.html) コマンドを使用して、統合で `VpcLink` ID を直接参照します。

   ```
   aws apigateway put-integration \
       --rest-api-id abcdef123 \
       --resource-id skpp60rab7 \
       --uri 'http://my-vpclink-test-nlb-1234567890abcdef.us-east-2.amazonaws.com' \
       --http-method GET \
       --type HTTP_PROXY \
       --integration-http-method GET \
       --connection-type VPC_LINK \
       --connection-id gim7c3
   ```

------
#### [ Use a stage variable ]

   次の [put-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration.html) コマンドを使用して、ステージ変数で VPC リンク ID を参照します。API をステージにデプロイするときは、VPC リンク ID を設定します。

   ```
   aws apigateway put-integration \
       --rest-api-id abcdef123 \
       --resource-id skpp60rab7 \
       --uri 'http://my-vpclink-test-nlb-1234567890abcdef.us-east-2.amazonaws.com' \
       --http-method GET \
       --type HTTP_PROXY \
       --integration-http-method GET \
       --connection-type VPC_LINK \
       --connection-id "\${stageVariables.vpcLinkId}"
   ```

   ステージ変数表現 (`${stageVariables.vpcLinkId}`) を二重引用符で囲み、`$` 文字をエスケープします。

------

   いつでも統合を更新して `connection-id` を変更することもできます。次の [update-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-integration.html) コマンドを使用して、統合を更新します。

   ```
    aws apigateway update-integration \
       --rest-api-id abcdef123 \
       --resource-id skpp60rab7 \
       --http-method GET \
       --patch-operations '[{"op":"replace","path":"/connectionId","value":"${stageVariables.vpcLinkId}"}]'
   ```

   文字列化された JSON リストを `patch-operations` パラメータ値として使用するようにしてください。

   プライベートプロキシ統合を使用したため、API はデプロイとテスト実行の準備ができました。

1. ステージ変数を使用して `connection-id` を定義した場合は、API をデプロイしてテストする必要があります。次の [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-deployment.html) コマンドを使用して、ステージ変数を含めて API をデプロイします。

   ```
   aws apigateway create-deployment \
       --rest-api-id abcdef123 \
       --stage-name test \
       --variables vpcLinkId=gim7c3
   ```

   `asf9d7` などの別の `VpcLink` ID でステージ変数を更新するには、次の [update-stage](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-stage.html) コマンドを使用します。

   ```
   aws apigateway update-stage \
       --rest-api-id abcdef123 \
       --stage-name test \
       --patch-operations op=replace,path='/variables/vpcLinkId',value='asf9d7'
   ```

   `VpcLink` ID リテラルを使用して `connection-id` プロパティをハードコーディングする場合は、API をデプロイしてテストする必要はありません。[test-invoke-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/test-invoke-method.html) コマンドを使用して、デプロイ前に API をテストします。

1. 次のコマンドを使用して API を呼び出します。

   ```
   curl -X GET https://abcdef123.execute-api.us-east-2.amazonaws.com/test
   ```

   または、ウェブブラウザに API の invoke-URL を入力して結果を表示することもできます。

# プライベート統合用の API Gateway アカウント (レガシー)
<a name="set-up-api-with-vpclink-accounts"></a>

次のリージョン固有の API Gateway アカウント ID は、`AllowedPrincipals` の作成時に `VpcLink` として VPC エンドポイントサービスに自動的に追加されます。


| **リージョン** | **アカウント ID** | 
| --- | --- | 
| us-east-1 | 392220576650 | 
| us-east-2 | 718770453195 | 
| us-west-1 | 968246515281 | 
| us-west-2 | 109351309407 | 
| ca-central-1 | 796887884028 | 
| eu-west-1 | 631144002099 | 
| eu-west-2 | 544388816663 | 
| eu-west-3 | 061510835048 | 
| eu-central-1 | 474240146802 | 
| eu-central-2 | 166639821150 | 
| eu-north-1 | 394634713161 | 
| eu-south-1 | 753362059629 | 
| eu-south-2 | 359345898052 | 
| ap-northeast-1 | 969236854626 | 
| ap-northeast-2 | 020402002396 | 
| ap-northeast-3 | 360671645888 | 
| ap-southeast-1 | 195145609632 | 
| ap-southeast-2 | 798376113853 | 
| ap-southeast-3 | 652364314486 | 
| ap-southeast-4 | 849137399833 | 
| ap-south-1 | 507069717855 | 
| ap-south-2 | 644042651268 | 
| ap-east-1 | 174803364771 | 
| sa-east-1 | 287228555773 | 
| me-south-1 | 855739686837 | 
| me-central-1 | 614065512851 | 

# API Gateway での REST API の Mock 統合
<a name="how-to-mock-integration"></a>

Amazon API Gateway は、API メソッドのモック統合をサポートしています。この機能により、API デベロッパーはバックエンドを統合することなく、API Gateway から直接 API レスポンスを生成できます。API 開発者がこの機能を使用すると、プロジェクト開発の完了前に、API を操作する必要がある他の依存チームのブロックを解除できます。また、この機能を活用して、API の概要や API へのナビゲーションを提供できる API のランディングページをプロビジョニングすることができます。そのようなランディングページの例として、「」で説明されている API 例のルートリソースで、GET メソッドの統合リクエストとレスポンスを参照してください[チュートリアル: サンプルをインポートして REST API を作成する](api-gateway-create-api-from-example.md)

API デベロッパーは、API Gateway がモック統合リクエストにどのように応答するかを決定します。そのため、特定のステータスコードとレスポンスを関連付ける、メソッドの統合リクエストと統合レスポンスを設定します。モック統合で `200` レスポンスを返すメソッドの場合は、以下を返すように統合リクエストボディマッピングテンプレートを設定します。

```
{"statusCode": 200}
```

次のようなボディマッピングテンプレートを持つように `200` 統合レスポンスを設定します。

```
{
    "statusCode": 200,
    "message": "Go ahead without me."
}
```

 同様に、メソッドがたとえば `500` エラーレスポンスを返す場合は、統合リクエストボディマッピングテンプレートを設定して以下を返します。

```
{"statusCode": 500}
```

たとえば、次のマッピングテンプレートを使用して `500` 統合レスポンスを設定します。

```
{
    "statusCode": 500,
    "message": "The invoked method is not supported on the API resource."
}
```

あるいは、統合リクエストマッピングテンプレートを定義せずに、モック統合のメソッドがデフォルトの統合レスポンスを返すこともできます。デフォルトの統合レスポンスは、未定義の [**HTTP status regex (HTTP ステータスの正規表現)**] を持つレスポンスです。適切なパススルー動作が設定されていることを確認します。

**注記**  
モック統合は、大規模なレスポンステンプレートをサポートするためのものではありません。お客様のユースケースにモック統合が必要な場合は、代わりに Lambda 統合を使用することを検討してください。

統合リクエストマッピングテンプレートを使用して、アプリケーションロジックを挿入して、特定の条件に基づいて返すモック統合レスポンスを決定することができます。たとえば、受信リクエストに対して `scope` クエリパラメータを使用して、成功レスポンスまたはエラーレスポンスを返すかどうかを判断できます。

```
{
  #if( $input.params('scope') == "internal" )
    "statusCode": 200
  #else
    "statusCode": 500
  #end
}
```

このように、モック統合の方法では、エラーレスポンスを伴う他のタイプの呼び出しを拒否しながら、内部呼び出しを通過させることができます。



このセクションでは、API Gateway コンソールを使用して、API メソッドのモック統合を有効にする方法を説明します。

**Topics**
+ [

# API Gateway コンソールを使用したモック統合の有効化
](how-to-mock-integration-console.md)

# API Gateway コンソールを使用したモック統合の有効化
<a name="how-to-mock-integration-console"></a>

メソッドが API Gateway で使用可能であることが必要です。「[チュートリアル: HTTP 非プロキシ統合を使用して REST API を作成する](api-gateway-create-api-step-by-step.md)」の手順に従います。

1. API リソースを選択し、**[メソッドを作成]** を選択します。

   メソッドを作成するには、次の操作を行います。

   1. **[メソッドタイプ]** で、メソッドを選択します。

   1. **[統合タイプ]** で、**[Mock]** を選択します。

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

   1. **[メソッドリクエスト]** タブの **[メソッドリクエストの設定]** で、**[編集]** を選択します。

   1. **[URL クエリ文字列パラメータ]** を選択します。**[クエリ文字列を追加]** を選択し、**[名前]** に「**scope**」と入力します。このクエリパラメータは、呼び出し元が内部かどうかを決定します。

   1. **[保存]** を選択します。

1. **[メソッドレスポンス]** タブで **[レスポンスを作成]** を選択し、次の操作を行います。

   1. **[HTTP ステータス]** に「**500**」と入力します。

   1. **[保存]** を選択します。

1. **[統合リクエスト]** タブの **[統合リクエストの設定]** で、**[編集]** を選択します。

1. **[マッピングテンプレート]** を選択し、次の操作を行います。

   1. [**マッピングテンプレートの追加**] を選択します。

   1. **[コンテンツタイプ]** に、「**application/json**」と入力します。

   1. **[テンプレート本文]** で次のように入力します。

      ```
      {
        #if( $input.params('scope') == "internal" )
          "statusCode": 200
        #else
          "statusCode": 500
        #end
      }
      ```

   1. **[保存]** を選択します。

1. **[統合レスポンス]** タブの **[デフォルト - レスポンス]** で、**[編集]** を選択します。

1. **[マッピングテンプレート]** を選択し、次の操作を行います。

   1. **[コンテンツタイプ]** に、「**application/json**」と入力します。

   1. **[テンプレート本文]** で次のように入力します。

      ```
      {
          "statusCode": 200,
          "message": "Go ahead without me"
      }
      ```

   1. **[保存]** を選択します。

1. **[レスポンスの作成]** を選択します。

   500 レスポンスを作成するには、次の操作を行います。

   1. [**HTTP status regex (HTTP ステータスの正規表現)**]に「**5\$1d\$12\$1**」と入力します。

   1. **[メソッドレスポンスのステータス]** で、[**500**] を選択します。

   1. **[保存]** を選択します。

   1. **[5\$1d\$12\$1 - レスポンス]** で、**[編集]** を選択します。

   1. **[マッピングテンプレート]**、**[マッピングテンプレートの追加]** の順に選択します。

   1. **[コンテンツタイプ]** に、「**application/json**」と入力します。

   1. **[テンプレート本文]** で次のように入力します。

      ```
      {
          "statusCode": 500,
          "message": "The invoked method is not supported on the API resource."
      }
      ```

   1. **[保存]** を選択します。

1.  **[テスト]** タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。Mock 統合をテストするには、次の操作を行います。

   1. **[クエリ文字列]** に「`scope=internal`」と入力します。[**Test (テスト)**] を選択します。テストの結果が表示されます。

      ```
      Request: /?scope=internal
      Status: 200
      Latency: 26 ms
      Response Body
      
      {
        "statusCode": 200,
        "message": "Go ahead without me"
      }
      
      Response Headers
      
      {"Content-Type":"application/json"}
      ```

   1. `scope=public` に「`Query strings`」と入力するか、空白のままにします。[**Test (テスト)**] を選択します。テストの結果が表示されます。

      ```
      Request: /
      Status: 500
      Latency: 16 ms
      Response Body
      
      {
        "statusCode": 500,
        "message": "The invoked method is not supported on the API resource."
      }
      
      Response Headers
      
      {"Content-Type":"application/json"}
      ```

また、メソッドレスポンスにヘッダーを追加してから、統合レスポンスでヘッダーマッピングを設定することによって、モック統合レスポンスでヘッダーを返すこともできます。実際に、これは API Gateway コンソールで CORS の必要なヘッダーを返すことによって CORS サポートを有効にする方法です。

# API Gateway での REST API のリクエスト検証
<a name="api-gateway-method-request-validation"></a>

 統合リクエストを進める前に API リクエストの基本的な検証を実行するよう API Gateway を設定できます。検証に失敗した場合、API Gateway はすぐにリクエストに失敗して、400 個のエラーレスポンスを発信者に返し、CloudWatch Logs で検証結果を発行します。これによりバックエンドへの不必要な呼び出すが減少します。さらに重要な点として、アプリケーション固有の検証作業に集中することができます。リクエスト本文を検証するには、必要なリクエストパラメータが有効で null でないことを確認するか、より複雑なデータ検証用のモデルスキーマを指定します。

**Topics**
+ [

## API Gateway における基本的なリクエストの検証の概要
](#api-gateway-request-validation-basic-definitions)
+ [

# REST API のデータモデル
](models-mappings-models.md)
+ [

# API Gateway で基本的なリクエストの検証を設定する
](api-gateway-request-validation-set-up.md)
+ [

# 基本的なリクエスト検証を含むサンプル API の AWS CloudFormation テンプレート
](api-gateway-request-validation-sample-cloudformation.md)

## API Gateway における基本的なリクエストの検証の概要
<a name="api-gateway-request-validation-basic-definitions"></a>

 基本的なリクエストの検証は API Gateway で処理できるため、ユーザーはバックエンドでのアプリケーション固有の検証に集中できます。検証のために、API Gateway は以下の条件のどちらかまたは両方を確認します。
+ 受信リクエストの URI、クエリ文字列、ヘッダーに必要なリクエストパラメータが含まれており、空白ではない。API Gateway はパラメータの存在のみをチェックし、タイプまたは形式はチェックしません。
+  該当するリクエストペイロードが、特定のコンテンツタイプのためのメソッドの[設定済みの JSON スキーマ](https://datatracker.ietf.org/doc/html/draft-zyp-json-schema-04)リクエストに準拠している。一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプを問わず同じモデルを使用するには、データモデルのコンテンツタイプを `$default` に設定します。

検証を有効にするには、[リクエストの検証](https://docs.aws.amazon.com/apigateway/latest/api/API_RequestValidator.html)により検証ルールを指定し、この検証を API の[リクエストの検証のマップ](https://docs.aws.amazon.com/apigateway/latest/api/API_RequestValidator.html)に追加し、検証を個々の API メソッドに割り当てます。

**注記**  
リクエスト本文の検証と[API Gateway で REST API のマッピングテンプレートを使用しないペイロードのメソッドリクエストの動作](integration-passthrough-behaviors.md)は、2 つの異なるトピックです。リクエストペイロードと一致するモデルスキーマがない場合、元のペイロードをパススルーするかブロックするかを選択できます。詳細については、「[API Gateway で REST API のマッピングテンプレートを使用しないペイロードのメソッドリクエストの動作](integration-passthrough-behaviors.md)」を参照してください。

# REST API のデータモデル
<a name="models-mappings-models"></a>

API Gateway では、モデルはペイロードのデータ構造を定義します。API Gateway では、[JSON スキーマのドラフト 4](https://tools.ietf.org/html/draft-zyp-json-schema-04) を使用してモデルを定義します。次の JSON オブジェクトは、PetStore の例のサンプルデータです。

```
{
    "id": 1,
    "type": "dog",
    "price": 249.99
}
```

データには、ペットの `id`、`type`、`price` が含まれています。このデータのモデルにより、以下のことが可能になります。
+ 基本的なリクエストの検証を使用する。
+ データ変換用のマッピングテンプレートを作成する。
+ SDK を生成するときに、ユーザー定義データ型 (UDT) を作成する。

![\[PetStore API の JSON データモデルの例。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/how-to-validate-requests.png)


このモデルの内容は以下のとおりです。

1. `$schema` オブジェクトは、有効な JSON スキーマのバージョン識別子を表します。このスキーマは JSON スキーマのドラフト v4 です。

1. `title` オブジェクトは、人間が読めるモデルの識別子です。このタイトルは `PetStoreModel` です。

1.  `required` 検証キーワードには、基本的なリクエストの検証用の `type` と `price` が必要です。

1. モデルの `properties` は、`id`、`type`、`price` です。各オブジェクトには、モデルに記述されているプロパティがあります。

1. オブジェクト `type` は、値として `dog`、`cat`、`fish` のいずれかのみを持つことができます。

1. オブジェクト `price` は数値で、`minimum` が 25、`maximum` が 500 に制限されます。

## PetStore モデル
<a name="PetStore-model-text"></a>

```
1 {
2 "$schema": "http://json-schema.org/draft-04/schema#",
3  "title": "PetStoreModel",
4  "type" : "object",
5  "required" : [ "price", "type" ],
6  "properties" : {
7    "id" : {
8      "type" : "integer"
9    },
10    "type" : {
11      "type" : "string",
12      "enum" : [ "dog", "cat", "fish" ]
13    },
14    "price" : {
15      "type" : "number",
16      "minimum" : 25.0,
17      "maximum" : 500.0
18    }
19  }
20 }
```

このモデルの内容は以下のとおりです。

1. 2 行目で、`$schema` オブジェクトは有効な JSON スキーマのバージョン識別子を表します。このスキーマは JSON スキーマのドラフト v4 です。

1. 3 行目で、`title` オブジェクトは、人間が読めるモデルの識別子です。このタイトルは `PetStoreModel` です。

1.  5 行目で、`required` 検証キーワードには、基本的なリクエストの検証用の `type` と `price` が必要です。

1.  6～17 行目で、モデルの `properties` は `id`、`type`、`price` です。各オブジェクトには、モデルに記述されているプロパティがあります。

1. 12 行目で、オブジェクト `type` は値として `dog`、`cat`、`fish` のいずれかのみを持つことができます。

1. 14～17 行目で、オブジェクト `price` は数値で、`minimum` が 25、`maximum` が 500 に制限されます。

## より複雑なモデルの作成
<a name="api-gateway-request-validation-model-more-complex"></a>

 `$ref` プリミティブを使用すると、より長いモデルの再利用可能な定義を作成できます。例えば、`price` オブジェクトを記述する `definitions` セクションで、`Price` という定義を作成できます。`$ref` の値は `Price` 定義です。

```
{
  "$schema" : "http://json-schema.org/draft-04/schema#",
  "title" : "PetStoreModelReUsableRef",
  "required" : ["price", "type" ],
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "dog", "cat", "fish" ]
    },
    "price" : {
        "$ref": "#/definitions/Price"
    }
  },
  "definitions" : {
      "Price": {
        "type" : "number",
        "minimum" : 25.0,
        "maximum" : 500.0
            }
      }
}
```

外部モデルファイルで定義された別のモデルスキーマを参照することもできます。`$ref` プロパティの値をモデルの場所に設定します。次の例では、`Price` モデルは API `a1234` の `PetStorePrice` モデルに定義されています。

```
{
  "$schema" : "http://json-schema.org/draft-04/schema#",
  "title" : "PetStorePrice",
  "type": "number",
  "minimum": 25,
  "maximum": 500
}
```

より長いモデルは `PetStorePrice` モデルを参照できます。

```
{
  "$schema" : "http://json-schema.org/draft-04/schema#",
  "title" : "PetStoreModelReusableRefAPI",
  "required" : [ "price", "type" ],
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "dog", "cat", "fish" ]
    },
    "price" : {
        "$ref": "https://apigateway.amazonaws.com/restapis/a1234/models/PetStorePrice"
    }
  }
}
```

## 出力データモデルを使用する
<a name="api-gateway-request-validation-output-model"></a>

データを変換する場合、統合レスポンスでペイロードモデルを定義できます。ペイロードモデルは SDK を生成するときに使用できます。Java、Objective-C、Swift などの厳密に型指定された言語では、オブジェクトはユーザー定義データ型 (UDT) に対応します。SDK の生成時にデータモデルで UDT を指定すると、API Gateway は UDT を作成します。データ変換の詳細については、「[API Gateway での REST API のテンプレート変換のマッピング](models-mappings.md)」を参照してください。

以下は、統合レスポンスからの出力データの例です。

```
{
[
  {
    "description" : "Item 1 is a dog.",
    "askingPrice" : 249.99
  },
  {
    "description" : "Item 2 is a cat.",
    "askingPrice" : 124.99
  },
  {
    "description" : "Item 3 is a fish.",
    "askingPrice" : 0.99
  }
]
}
```

次の例は、出力データを記述するペイロードモデルです。

```
{
"$schema": "http://json-schema.org/draft-04/schema#",
  "title": "PetStoreOutputModel",
  "type" : "object",
  "required" : [ "description", "askingPrice" ],
  "properties" : {
    "description" : {
      "type" : "string"
    },
    "askingPrice" : {
      "type" : "number",
      "minimum" : 25.0,
      "maximum" : 500.0
    }
  }
}
```

このモデルでは、SDK を呼び出し、`PetStoreOutputModel[i].description` プロパティと `PetStoreOutputModel[i].askingPrice` プロパティを読み取ることで、`description` と `askingPrice` のプロパティ値を取得できます。モデルが指定されていない場合、API Gateway は空のモデルを使用してデフォルト UDT を作成します。

## 次のステップ
<a name="api-gateway-request-validation-model-next-steps"></a>
+ このセクションでは、このトピックで紹介した概念について理解を深めるために役立つリソースを紹介します。

  以下のリクエストの検証チュートリアルを参考にしてください。
  + [API Gateway コンソールを使用してリクエストの検証を設定する](api-gateway-request-validation-set-up.md#api-gateway-request-validation-setup-in-console)
  +  [AWS CLI を使用して基本的なリクエストの検証を設定する](api-gateway-request-validation-set-up.md#api-gateway-request-validation-setup-cli)
  +  [OpenAPI 定義を使用して基本的なリクエストの検証を設定する](api-gateway-request-validation-set-up.md#api-gateway-request-validation-setup-importing-swagger)
+  データ変換とマッピングテンプレートの詳細については、「[API Gateway での REST API のテンプレート変換のマッピング](models-mappings.md)」を参照してください。

# API Gateway で基本的なリクエストの検証を設定する
<a name="api-gateway-request-validation-set-up"></a>

 このセクションでは、コンソール、AWS CLI、OpenAPI 定義を使用して API Gateway のリクエストの検証を設定する方法を示します。

**Topics**
+ [

## API Gateway コンソールを使用してリクエストの検証を設定する
](#api-gateway-request-validation-setup-in-console)
+ [

## AWS CLI を使用して基本的なリクエストの検証を設定する
](#api-gateway-request-validation-setup-cli)
+ [

## OpenAPI 定義を使用して基本的なリクエストの検証を設定する
](#api-gateway-request-validation-setup-importing-swagger)

## API Gateway コンソールを使用してリクエストの検証を設定する
<a name="api-gateway-request-validation-setup-in-console"></a>

 API Gateway コンソールで API リクエストの 3 つの検証から 1 つを選択して、リクエストを検証できます。
+ **本体の検証**。
+ **クエリ文字列パラメータとヘッダーの検証**。
+ **本文、クエリ文字列パラメータ、ヘッダーの検証**。

 上記のいずれかの検証を API メソッドに適用すると、API Gateway コンソールは検証を API の [RequestValidators](https://docs.aws.amazon.com/apigateway/latest/api/API_RequestValidator.html) マップに追加します。

このチュートリアルに従うには、CloudFormation テンプレートを使用して不完全な API Gateway API を作成します。この API には、`GET` メソッドと `POST` メソッドを持つ `/validator` リソースがあります。どちらのメソッドも `http://petstore-demo-endpoint.execute-api.com/petstore/pets` HTTP エンドポイントと統合されています。次の 2 種類のリクエストの検証を設定します。
+ `GET` メソッドでは、URL クエリ文字列パラメータに対するリクエストの検証を設定します。
+ `POST` メソッドでは、リクエスト本文に対するリクエストの検証を設定します。

 これにより、特定の API コールのみを API にパススルーできます。

[CloudFormation のアプリケーション作成テンプレート](samples/request-validation-tutorial-console.zip)をダウンロードして解凍します。このテンプレートを使用して不完全な API を作成します。残りのステップは API Gateway コンソールで完了します。

**CloudFormation スタックを作成するには**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. [**スタックの作成**] を選択し、[**With new resources (standard) 新しいリソースを使用 (標準)**] を選択します。

1. [**Specify template (テンプレートの指定)**] で、[**Upload a template file (テンプレートファイルのアップロード)**] を選択します。

1. ダウンロードしたテンプレートを選択します。

1. [**Next (次へ)**] を選択します。

1. [**Stack name**] (スタックの名前) で、**request-validation-tutorial-console** と入力し、[**Next**] (次へ) を選択します。

1. [**Configure stack options**] (スタックオプションの設定) で、[**Next**] (次へ) を選択します。

1. [**Capabilities**] (機能) で、CloudFormation がアカウントに IAM リソースを作成できることを承認します。

1. **[次へ]** を選択し、**[送信]** を選択します。

CloudFormation は、テンプレートで指定されたリソースをプロビジョニングします。リソースのプロビジョニングには数分かかることがあります。CloudFormation スタックのステータスが **CREATE\$1COMPLETE** の場合は、次のステップに進む準備ができています。

**新しく作成した API を選択するには**

1. 新しく作成した **request-validation-tutorial-console** スタックを選択します。

1. **[リソース]** をクリックします。

1. **[物理 ID]** で API を選択します。このリンクを使用して API Gateway コンソールに移動します。

`GET` メソッドと `POST` メソッドを変更する前に、モデルを作成する必要があります。

**モデルを作成するには**

1. 受信リクエストの本文でリクエストの検証を使用するには、モデルが必要です。モデルを作成するには、メインナビゲーションペインで **[モデル]** を選択します。

1. **[モデルの作成]** を選択します。

1. **[Name]** (名前) には **PetStoreModel** を入力します。

1. **[コンテンツタイプ]** として、「**application/json**」と入力します。一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプに関係なく同じモデルを使用するには、「**\$1default**」と入力します。

1. **[説明]** に、モデルの説明として「**My PetStore Model**」と入力します。

1. **[モデルスキーマ]** で、次のモデルをコードエディタに貼り付け、**[作成]** を選択します。

   ```
   {
     "type" : "object",
     "required" : [ "name", "price", "type" ],
     "properties" : {
       "id" : {
         "type" : "integer"
       },
       "type" : {
         "type" : "string",
         "enum" : [ "dog", "cat", "fish" ]
       },
       "name" : {
         "type" : "string"
       },
       "price" : {
         "type" : "number",
         "minimum" : 25.0,
         "maximum" : 500.0
       }
     }
   }
   ```

これらのモデルの詳細については、「[REST API のデータモデル](models-mappings-models.md)」を参照してください。

**`GET` メソッドのリクエスト検証を設定するには**

1. メインナビゲーションペインで **[リソース]**、**[GET]** メソッドの順に選択します。

1. **[メソッドリクエスト]** タブの **[メソッドリクエスト設定]** で、**[編集]** を選択します。

1. **[リクエストの検証]** で、**[クエリ文字列パラメータおよびヘッダーを検証]** を選択します。

1. **[URL クエリ文字列パラメータ]** で、次の操作を行います。

   1. [**クエリ文字列の追加**] を選択します。

   1. **[Name]** (名前) には **petType** を入力します。

   1. **[必須]** をオンにします。

   1. **[キャッシュ]** はオフのままにします。

1. **[保存]** を選択します。

1. **[統合リクエスト]** タブの **[統合リクエストの設定]** で、**[編集]** を選択します。

1. **[URL クエリ文字列パラメータ]** で、次の操作を行います。

   1. [**クエリ文字列の追加**] を選択します。

   1. **[Name]** (名前) には **petType** を入力します。

   1. **[マッピング元]** として「**method.request.querystring.petType**」と入力します。これは、**petType** をペットの種類にマッピングします。

      データマッピングの詳細については、[データマッピングチュートリアル](set-up-data-transformations-in-api-gateway.md#mapping-example-console)を参照してください。

   1. **[キャッシュ]** はオフのままにします。

1. **[保存]** を選択します。

**`GET` メソッドのリクエスト検証をテストするには**

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

1. **[クエリ文字列]** に「**petType=dog**」と入力し、**[テスト]** を選択します。

1. メソッドテストが `200 OK` と犬のリストを返します。

   この出力データを変換する方法については、[データマッピングチュートリアル](set-up-data-transformations-in-api-gateway.md#mapping-example-console)を参照してください。

1. **petType=dog** を削除して **[テスト]** を選択します。

1.  メソッドテストは、`400` エラーを返し、次のエラーメッセージを表示します。

   ```
   {
     "message": "Missing required request parameters: [petType]"
   }
   ```

**`POST` メソッドのリクエスト検証を設定するには**

1. メインナビゲーションペインで、**[ステージ]**、**[POST]** メソッドの順に選択します。

1. **[メソッドリクエスト]** タブの **[メソッドリクエスト設定]** で、**[編集]** を選択します。

1. **[リクエストの検証]** で **[本文を検証]** を選択します。

1. **[リクエスト本文]** で、**[モデルを追加]** を選択します。

1. **[コンテンツタイプ]** に、「**application/json**」と入力します。一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプに関係なく同じモデルを使用するには、「`$default`」と入力します。

    **[モデル]** で、**PetStoreModel** を選択します。

1. **[保存]** を選択します。

**`POST` メソッドのリクエスト検証をテストするには**

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

1. **[リクエスト本文]** で、次の内容をコードエディタに貼り付けます。

   ```
   {
     "id": 2,
     "name": "Bella",
     "type": "dog",
     "price": 400
   }
   ```

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

1. メソッドテストは、`200 OK` と成功メッセージを返します。

1. **[リクエスト本文]** で、次の内容をコードエディタに貼り付けます。

   ```
   {
     "id": 2,
     "name": "Bella",
     "type": "dog",
     "price": 4000
   }
   ```

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

1.  メソッドテストは、`400` エラーを返し、次のエラーメッセージを表示します。

   ```
   {
    "message": "Invalid request body"
   }
   ```

    テストログの一番下に、無効なリクエスト本文の理由が表示されます。この場合、ペットの価格はモデルに指定されている上限を超えていました。

**CloudFormation スタックを削除するには**

1. CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. CloudFormation スタックを選択します。

1. [**Delete**] (削除) を選択し、選択を確定します。

### 次のステップ
<a name="next-steps-request-validation-tutorial"></a>
+ 出力データを変換して、より多くのデータマッピングを実行する方法については、[データマッピングチュートリアル](set-up-data-transformations-in-api-gateway.md#mapping-example-console)を参照してください。
+ [AWS CLI を使用して基本的なリクエストの検証を設定する](#api-gateway-request-validation-setup-cli)チュートリアルに従い、AWS CLI を使用して同様の手順を実行します。

## AWS CLI を使用して基本的なリクエストの検証を設定する
<a name="api-gateway-request-validation-setup-cli"></a>

AWS CLI を使用してリクエストの検証を設定するための検証を作成できます。このチュートリアルに従うには、CloudFormation テンプレートを使用して不完全な API Gateway API を作成します。

**注記**  
これはコンソールチュートリアルと同じ CloudFormation テンプレートではありません。

 事前に公開されている `/validator` リソースを使用して `GET` メソッドと `POST` メソッドを作成します。どちらのメソッドも `http://petstore-demo-endpoint.execute-api.com/petstore/pets` HTTP エンドポイントと統合されます。次の 2 つのリクエストの検証を設定します。
+ `GET` メソッドでは、`params-only` 検証を作成して URL クエリ文字列パラメータを検証します。
+ `POST` メソッドでは、`body-only` 検証を作成してリクエスト本文を検証します。

 これにより、特定の API コールのみを API にパススルーできます。

**CloudFormation スタックを作成するには**

[CloudFormation のアプリケーション作成テンプレート](samples/request-validation-tutorial-cli.zip)をダウンロードして解凍します。

次のチュートリアルを完了するには、[AWS Command Line Interface (AWS CLI) バージョン 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) が必要です。

コマンドが長い場合は、エスケープ文字 (`\`) を使用してコマンドを複数行に分割します。
**注記**  
Windows では、一般的に使用する Bash CLI コマンドの一部 (`zip` など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、[Windows Subsystem for Linux をインストール](https://learn.microsoft.com/en-us/windows/wsl/install)します。このガイドの CLI コマンドの例では、Linux フォーマットを使用しています。Windows CLI を使用している場合、インライン JSON ドキュメントを含むコマンドを再フォーマットする必要があります。

1.  次のコマンドを使用して CloudFormation スタックを作成します。

   ```
   aws cloudformation create-stack --stack-name request-validation-tutorial-cli --template-body file://request-validation-tutorial-cli.zip --capabilities CAPABILITY_NAMED_IAM 
   ```

1. CloudFormation は、テンプレートで指定されたリソースをプロビジョニングします。リソースのプロビジョニングには数分かかることがあります。次のコマンドを使用して CloudFormation スタックのステータスを確認します。

   ```
   aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli
   ```

1. CloudFormation スタックのステータスが `StackStatus: "CREATE_COMPLETE"` になったら、次のコマンドを使用して関連する出力値を取得し、以後のステップで使用します。

   ```
    aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli --query "Stacks[*].Outputs[*].{OutputKey: OutputKey, OutputValue: OutputValue, Description: Description}"
   ```

   出力値は以下のとおりです。
   + ApiId。API の ID です。このチュートリアルの場合、API ID は `abc123` です。
   + ResourceId。`GET` メソッドと `POST` メソッドが公開されている検証リソースの ID です。このチュートリアルの場合、リソース ID は `efg456` です。

**リクエストの検証を作成してモデルをインポートするには**

1. AWS CLI でリクエストの検証を行うには、検証が必要です。リクエストパラメータのみを検証する検証を作成するには、次のコマンドを使用します。

   ```
   aws apigateway create-request-validator --rest-api-id abc123 \
         --no-validate-request-body \
         --validate-request-parameters \
         --name params-only
   ```

   `params-only` 検証の ID をメモしておきます。

1.  リクエスト本文のみを検証する検証を作成するには、次のコマンドを使用します。

   ```
   aws apigateway create-request-validator --rest-api-id abc123 \
         --validate-request-body \
         --no-validate-request-parameters \
         --name body-only
   ```

   `body-only` 検証の ID をメモしておきます。

1.  受信リクエストの本文でリクエストの検証を行うには、モデルが必要です。モデルをインポートするには、以下のコマンドを使用します。

   ```
   aws apigateway create-model --rest-api-id abc123 --name PetStoreModel --description 'My PetStore Model' --content-type 'application/json' --schema '{"type": "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : {"type" : "integer"},"type" : {"type" : "string", "enum" : [ "dog", "cat", "fish" ]},"name" : { "type" : "string"},"price" : {"type" : "number","minimum" : 25.0, "maximum" : 500.0}}}}' 
   ```

   一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプに関係なく同じモデルを使用するには、キーとして `$default` を指定します。

**`GET` メソッドと `POST` メソッドを作成するには**

1. 次のコマンドを使用して、`GET` HTTP メソッドを `/validate` リソースに追加します。このコマンドは、`GET` メソッドを作成して、`params-only` 検証を追加し、必要に応じてクエリ文字列 `petType` を設定します。

   ```
   aws apigateway put-method --rest-api-id abc123 \
          --resource-id efg456 \
          --http-method GET \
          --authorization-type "NONE" \
          --request-validator-id aaa111 \
          --request-parameters "method.request.querystring.petType=true"
   ```

   次のコマンドを使用し、`POST` HTTP メソッドを `/validate` リソースに追加します。このコマンドは、`POST` メソッドを作成して、`body-only` 検証を追加し、モデルを本文専用の検証にアタッチします。

   ```
   aws apigateway put-method --rest-api-id abc123 \
          --resource-id efg456 \
          --http-method POST \
          --authorization-type "NONE" \
          --request-validator-id bbb222 \
          --request-models 'application/json'=PetStoreModel
   ```

1.  次のコマンドを使用して、`GET /validate` メソッドの `200 OK` レスポンスを設定します。

   ```
   aws apigateway put-method-response --rest-api-id abc123  \
               --resource-id efg456 \
               --http-method GET \
               --status-code 200
   ```

    次のコマンドを使用して、`POST /validate` メソッドの `200 OK` レスポンスを設定します。

   ```
   aws apigateway put-method-response --rest-api-id abc123  \
               --resource-id efg456 \
               --http-method POST \
               --status-code 200
   ```

1.  次のコマンドを使用して、`GET /validation` メソッドの指定された HTTP エンドポイントを `Integration` に設定します。

   ```
   aws apigateway put-integration --rest-api-id abc123  \
               --resource-id efg456 \
               --http-method GET \
               --type HTTP \
               --integration-http-method GET \
               --request-parameters '{"integration.request.querystring.type" : "method.request.querystring.petType"}' \
               --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'
   ```

    次のコマンドを使用して、`POST /validation` メソッドの指定された HTTP エンドポイントを `Integration` に設定します。

   ```
   aws apigateway put-integration --rest-api-id abc123  \
                 --resource-id efg456 \
                 --http-method POST \
                 --type HTTP \
                 --integration-http-method GET \
                 --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'
   ```

1.  次のコマンドを使用して、`GET /validation` メソッドの統合レスポンスを設定します。

   ```
   aws apigateway put-integration-response --rest-api-id abc123 \
                 --resource-id efg456\
                 --http-method GET \
                 --status-code 200 \
                 --selection-pattern ""
   ```

    次のコマンドを使用して、`POST /validation` メソッドの統合レスポンスを設定します。

   ```
   aws apigateway put-integration-response --rest-api-id abc123 \
               --resource-id efg456 \
               --http-method POST \
               --status-code 200 \
               --selection-pattern ""
   ```

**API をテストするには**

1. クエリ文字列に対するリクエストの検証を実行する `GET` メソッドをテストするには、次のコマンドを使用します。

   ```
   aws apigateway test-invoke-method --rest-api-id abc123 \
               --resource-id efg456 \
               --http-method GET \
               --path-with-query-string '/validate?petType=dog'
   ```

   結果として、`200 OK` と犬のリストが返されます。

1. 次のコマンドを使用して、クエリ文字列 `petType` を含めずにテストします。

   ```
   aws apigateway test-invoke-method --rest-api-id abc123 \
               --resource-id efg456 \
               --http-method GET
   ```

   結果として `400` エラーが返されます。

1. リクエスト本文に対するリクエストの検証を実行する `POST` メソッドをテストするには、次のコマンドを使用します。

   ```
    aws apigateway test-invoke-method --rest-api-id abc123 \
               --resource-id efg456 \
               --http-method POST \
               --body '{"id": 1, "name": "bella", "type": "dog", "price" : 400 }'
   ```

   結果として、`200 OK` と成功メッセージが返されます。

1. 次のコマンドを実行し、無効な本文を使用してテストします。

   ```
    aws apigateway test-invoke-method --rest-api-id abc123 \
                 --resource-id efg456 \
                 --http-method POST \
                 --body '{"id": 1, "name": "bella", "type": "dog", "price" : 1000 }'
   ```

   犬の価格がモデルで定義されている最大価格を超えているため、結果として `400` エラーが返されます。

**CloudFormation スタックを削除するには**
+ CloudFormation リソースを削除するには、次のコマンドを使用します。

  ```
  aws cloudformation delete-stack  --stack-name request-validation-tutorial-cli
  ```

## OpenAPI 定義を使用して基本的なリクエストの検証を設定する
<a name="api-gateway-request-validation-setup-importing-swagger"></a>

 API レベルでリクエストの検証を宣言するには、[x-amazon-apigateway-request-validators オブジェクト](api-gateway-swagger-extensions-request-validators.md) マップ内の [x-amazon-apigateway-request-validators.requestValidator オブジェクト](api-gateway-swagger-extensions-request-validators.requestValidator.md) オブジェクトのセットを指定して、リクエストのどの部分を検証するかを選択します。OpenAPI 定義の例では、次の 2 つの検証があります。
+ `all` 検証では、本文 (`RequestBodyModel` データモデルを使用) とパラメータの両方を検証します。

  `RequestBodyModel` データモデルでは、入力 JSON オブジェクトに `name`、`type`、`price` の各プロパティを含める必要があります。`name` プロパティは任意の文字列にすることができ、`type` は指定された列挙フィールド (`["dog", "cat", "fish"]`) のいずれかでなければなりません。また、`price` は 25 から 500 の範囲にする必要があります。`id` パラメータは必須ではありません。
+ `param-only` 検証では、パラメータのみを検証します。

 API のすべてのメソッドでリクエストの検証を有効にするには、OpenAPI 定義の API レベルで [x-amazon-apigateway-request-validator プロパティ](api-gateway-swagger-extensions-request-validator.md) プロパティを指定します。OpenAPI 定義の例の場合、`all` 検証は、オーバーライドされない限り、すべての API メソッドで使用されます。モデルを使用して本文を検証する際、一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプに関係なく同じモデルを使用するには、キーとして `$default` を指定します。

個々のメソッドでリクエストの検証を有効にするには、メソッドレベルで `x-amazon-apigateway-request-validator` プロパティを指定します。OpenAPI 定義の例の場合、`param-only` 検証は `GET` メソッドの `all` 検証を上書きします。



OpenAPI のサンプルを API Gateway にインポートするには、[リージョン API を API Gateway にインポートする](import-export-api-endpoints.md) または [エッジ最適化 API を API Gateway にインポートする](import-edge-optimized-api.md) に対する次の手順を参照してください。

------
#### [ OpenAPI 3.0 ]

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "ReqValidators Sample",
    "version" : "1.0.0"
  },
  "servers" : [ {
    "url" : "/{basePath}",
    "variables" : {
      "basePath" : {
        "default" : "/v1"
      }
    }
  } ],
  "paths" : {
    "/validation" : {
      "get" : {
        "parameters" : [ {
          "name" : "q1",
          "in" : "query",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "headers" : {
              "test-method-response-header" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ArrayOfError"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator" : "params-only",
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "400",
              "responseParameters" : {
                "method.response.header.test-method-response-header" : "'static value'"
              },
              "responseTemplates" : {
                "application/xml" : "xml 400 response template",
                "application/json" : "json 400 response template"
              }
            },
            "2\\d{2}" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.querystring.type" : "method.request.querystring.q1"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      },
      "post" : {
        "parameters" : [ {
          "name" : "h1",
          "in" : "header",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/RequestBodyModel"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "200 response",
            "headers" : {
              "test-method-response-header" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ArrayOfError"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator" : "all",
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "POST",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "400",
              "responseParameters" : {
                "method.response.header.test-method-response-header" : "'static value'"
              },
              "responseTemplates" : {
                "application/xml" : "xml 400 response template",
                "application/json" : "json 400 response template"
              }
            },
            "2\\d{2}" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.header.custom_h1" : "method.request.header.h1"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      }
    }
  },
  "components" : {
    "schemas" : {
      "RequestBodyModel" : {
        "required" : [ "name", "price", "type" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "dog", "cat", "fish" ]
          },
          "name" : {
            "type" : "string"
          },
          "price" : {
            "maximum" : 500.0,
            "minimum" : 25.0,
            "type" : "number"
          }
        }
      },
      "ArrayOfError" : {
        "type" : "array",
        "items" : {
          "$ref" : "#/components/schemas/Error"
        }
      },
      "Error" : {
        "type" : "object"
      }
    }
  },
  "x-amazon-apigateway-request-validators" : {
    "all" : {
      "validateRequestParameters" : true,
      "validateRequestBody" : true
    },
    "params-only" : {
      "validateRequestParameters" : true,
      "validateRequestBody" : false
    }
  }
}
```

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger" : "2.0",
  "info" : {
    "version" : "1.0.0",
    "title" : "ReqValidators Sample"
  },
  "basePath" : "/v1",
  "schemes" : [ "https" ],
  "paths" : {
    "/validation" : {
      "get" : {
        "produces" : [ "application/json", "application/xml" ],
        "parameters" : [ {
          "name" : "q1",
          "in" : "query",
          "required" : true,
          "type" : "string"
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "schema" : {
              "$ref" : "#/definitions/ArrayOfError"
            },
            "headers" : {
              "test-method-response-header" : {
                "type" : "string"
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator" : "params-only",
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "400",
              "responseParameters" : {
                "method.response.header.test-method-response-header" : "'static value'"
              },
              "responseTemplates" : {
                "application/xml" : "xml 400 response template",
                "application/json" : "json 400 response template"
              }
            },
            "2\\d{2}" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.querystring.type" : "method.request.querystring.q1"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      },
      "post" : {
        "consumes" : [ "application/json" ],
        "produces" : [ "application/json", "application/xml" ],
        "parameters" : [ {
          "name" : "h1",
          "in" : "header",
          "required" : true,
          "type" : "string"
        }, {
          "in" : "body",
          "name" : "RequestBodyModel",
          "required" : true,
          "schema" : {
            "$ref" : "#/definitions/RequestBodyModel"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "schema" : {
              "$ref" : "#/definitions/ArrayOfError"
            },
            "headers" : {
              "test-method-response-header" : {
                "type" : "string"
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator" : "all",
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "POST",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "400",
              "responseParameters" : {
                "method.response.header.test-method-response-header" : "'static value'"
              },
              "responseTemplates" : {
                "application/xml" : "xml 400 response template",
                "application/json" : "json 400 response template"
              }
            },
            "2\\d{2}" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.header.custom_h1" : "method.request.header.h1"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      }
    }
  },
  "definitions" : {
    "RequestBodyModel" : {
      "type" : "object",
      "required" : [ "name", "price", "type" ],
      "properties" : {
        "id" : {
          "type" : "integer"
        },
        "type" : {
          "type" : "string",
          "enum" : [ "dog", "cat", "fish" ]
        },
        "name" : {
          "type" : "string"
        },
        "price" : {
          "type" : "number",
          "minimum" : 25.0,
          "maximum" : 500.0
        }
      }
    },
    "ArrayOfError" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Error"
      }
    },
    "Error" : {
      "type" : "object"
    }
  },
  "x-amazon-apigateway-request-validators" : {
    "all" : {
      "validateRequestParameters" : true,
      "validateRequestBody" : true
    },
    "params-only" : {
      "validateRequestParameters" : true,
      "validateRequestBody" : false
    }
  }
}
```

------

# 基本的なリクエスト検証を含むサンプル API の AWS CloudFormation テンプレート
<a name="api-gateway-request-validation-sample-cloudformation"></a>

 以下の CloudFormation テンプレート定義の例は、リクエストの検証が有効なサンプル API を定義します。API は、[PetStore API](http://petstore-demo-endpoint.execute-api.com/petstore/pets) のサブセットです。`POST` メソッドを開示し、ペットを `pets` コレクションおよび `GET` メソッドに追加して、指定されたタイプによりペットのクエリを実行します。

 宣言されているリクエスト検証は 2 つあります。

**`GETValidator`**  
この検証は、`GET` メソッドで有効になります。この検証により、必須のクエリパラメータ (`q1`) が受信リクエストに含まれており、空白でないことを API Gateway が確認できるようになります。

**`POSTValidator`**  
この検証は、`POST` メソッドで有効になります。これにより、API Gateway は、コンテンツタイプが `application/json` のとき、ペイロードリクエスト形式が指定された `RequestBodyModel` に準拠していることを検証できます。一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプに関係なく同じモデルを使用するには、`$default` を指定します。`RequestBodyModel` にはペット ID を定義する追加のモデル `RequestBodyModelId` が含まれています。

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  StageName:
    Type: String
    Default: v1
    Description: Name of API stage.
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: ReqValidatorsSample
  RequestBodyModelId:
    Type: 'AWS::ApiGateway::Model'
    Properties:
      RestApiId: !Ref Api
      ContentType: application/json
      Description: Request body model for Pet ID.
      Schema:
        $schema: 'http://json-schema.org/draft-04/schema#'
        title: RequestBodyModelId
        properties:
            id:
              type: integer
  RequestBodyModel: 
    Type: 'AWS::ApiGateway::Model'
    Properties:
      RestApiId: !Ref Api
      ContentType: application/json
      Description: Request body model for Pet type, name, price, and ID.
      Schema:
        $schema: 'http://json-schema.org/draft-04/schema#'
        title: RequestBodyModel
        required:
          - price
          - name
          - type
        type: object
        properties:
            id:
              "$ref": !Sub 
                - 'https://apigateway.amazonaws.com/restapis/${Api}/models/${RequestBodyModelId}'
                - Api: !Ref Api
                  RequestBodyModelId: !Ref RequestBodyModelId
            price: 
              type: number
              minimum: 25
              maximum: 500
            name:
              type: string
            type:
              type: string
              enum:
                - "dog"
                - "cat"
                - "fish"
  GETValidator:
    Type: AWS::ApiGateway::RequestValidator
    Properties:
      Name: params-only
      RestApiId: !Ref Api
      ValidateRequestBody: False
      ValidateRequestParameters: True 
  POSTValidator:
    Type: AWS::ApiGateway::RequestValidator
    Properties:
      Name: body-only
      RestApiId: !Ref Api
      ValidateRequestBody: True
      ValidateRequestParameters: False
  ValidationResource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      RestApiId: !Ref Api
      ParentId: !GetAtt Api.RootResourceId
      PathPart: 'validation'
  ValidationMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref ValidationResource
      HttpMethod: GET
      AuthorizationType: NONE
      RequestValidatorId: !Ref GETValidator
      RequestParameters:
        method.request.querystring.q1: true
      Integration:
        Type: HTTP_PROXY
        IntegrationHttpMethod: GET
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/
  ValidationMethodPost:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref ValidationResource
      HttpMethod: POST
      AuthorizationType: NONE
      RequestValidatorId: !Ref POSTValidator
      RequestModels:
        application/json : !Ref RequestBodyModel 
      Integration:
        Type: HTTP_PROXY
        IntegrationHttpMethod: POST
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/
  ApiDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn:
      - ValidationMethodGet
      - RequestBodyModel 
    Properties:
      RestApiId: !Ref Api
      StageName: !Sub '${StageName}'
Outputs:
  ApiRootUrl:
    Description: Root Url of the API
    Value: !Sub 'https://${Api}.execute-api.${AWS::Region}.amazonaws.com/${StageName}'
```

# API Gateway での REST API のデータ変換
<a name="rest-api-data-transformations"></a>

**注記**  
このセクションでは、非プロキシ統合で使用する関数について説明します。ただし、可能な場合は、REST API ではプロキシ統合を使用することをお勧めします。プロキシ統合にも合理化された統合設定があり、既存の設定を破棄することなくバックエンドで拡張できます。詳細については、「[API Gateway API 統合タイプの選択](api-gateway-api-integration-types.md)」を参照してください。

非プロキシ統合を使用する場合、API Gateway の 2 つの関数を使用して、メソッドリクエストと統合レスポンスを変換できます。統合リクエストのペイロードとは異なるペイロード形式を使用している場合は、メソッドリクエストを変換できます。メソッドレスポンスで返す必要がある形式とは異なるペイロード形式が返された場合、統合レスポンスを変換できます。リクエストのライフサイクルに関する詳細は、「[REST API のリソース例](rest-api-develop.md#rest-api-develop-example)」を参照してください。

次の例は、ヘッダー `"x-version:beta"` の場合、`x-version` ヘッダーパラメータが `app-version` ヘッダーパラメータに変換されるデータ変換を説明しています。`x-version` から `app-version` へのデータ変換は、統合リクエストで行われます。これにより、統合エンドポイントは変換されたヘッダーパラメータ値を受け取ります。統合エンドポイントがステータスコードを返すと、メソッドレスポンスの前にステータスコードが `200` から `204` に変換されます。

![\[API Gateway データ変換の図\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/develop-non-proxy.png)


データ変換を作成するには、以下の関数を使用できます。

**パラメータのマッピング**  
パラメータマッピングで変更できるのは、統合リクエストの URL パスパラメータ、URL クエリ文字列パラメータ、または HTTP ヘッダー値です。統合リクエストペイロードは変更できません。HTTP レスポンスヘッダー値も変更できます。パラメータマッピングを使用して、Cross-Origin Resource Sharing(CORS) の静的ヘッダー値を作成します。  
パラメータマッピングは、プロキシ統合と非プロキシ統合の統合リクエストでは使用できますが、統合レスポンスでは、非プロキシ統合を使用する必要があります。パラメータマッピングでは、[Velocity Template Language (VTL)](https://velocity.apache.org/engine/devel/vtl-reference.html) でのスクリプトは必要ありません。詳細については、「[API Gateway の REST API パラメータマッピング](rest-api-parameter-mapping.md)」を参照してください。

**テンプレート変換のマッピング**  
マッピングテンプレート変換では、マッピングテンプレートを使用して、URL パス パラメータ、URL クエリ文字列パラメータ、HTTP ヘッダー、統合リクエストまたは統合レスポンスの本文をマッピングします。*マッピングテンプレート*は、[JSONPath 式](https://goessner.net/articles/JsonPath/)を使用して [Velocity Template Language (VTL)](https://velocity.apache.org/engine/devel/vtl-reference.html) で表現され、`Content-type` ヘッダーに基づいてペイロードに適用されるスクリプトです。  
マッピングテンプレートでは、以下を実行できます。  
+ Amazon DynamoDB や Lambda 関数などの AWS のサービス、または HTTP エンドポイントとの統合を使用して送信するデータを選択します。詳細については、「[チュートリアル: AWS サービスへの統合のための統合リクエストとレスポンスを変更する](set-up-data-transformations-in-api-gateway.md)」を参照してください。
+ API の統合リクエストと統合レスポンスパラメータを条件付きで上書きし、新しいヘッダー値を作成して、ステータスコードを上書きします。詳細については、「[API Gateway で REST API の API リクエストパラメータおよびレスポンスパラメータとステータスコードを上書きする](apigateway-override-request-response-parameters.md)」を参照してください。
統合リクエスト本文に一致するマッピングテンプレートがない `Content-type` ヘッダーがある場合の API の動作を指定することもできます。これは、統合パススルーの動作と呼ばれます。詳細については、「[API Gateway で REST API のマッピングテンプレートを使用しないペイロードのメソッドリクエストの動作](integration-passthrough-behaviors.md)」を参照してください。

## パラメータマッピングとマッピングテンプレート変換のどちらかを選択する
<a name="rest-api-data-transformations-choose"></a>

可能であれば、データの変換にはパラメータマッピングの使用をお勧めします。API で本文を変更する必要がある場合、または受信統合リクエストまたは統合レスポンスに基づいて条件付き上書きと変更を実行する必要がある場合に、プロキシ統合を使用できないときは、マッピングテンプレート変換を使用します。

# API Gateway の REST API パラメータマッピング
<a name="rest-api-parameter-mapping"></a>

**注記**  
HTTP API を使用している場合は、「[API Gateway で HTTP API の API リクエストとレスポンスを変換する](http-api-parameter-mapping.md)」を参照してください。

パラメータマッピングでは、リクエストまたはレスポンスパラメータをマッピングします。パラメータのマッピングには、パラメータマッピング式または静的な値を使用できます。マッピング式のリストについては、「[API Gateway での REST API パラメータマッピングのソースのリファレンス](rest-api-parameter-mapping-sources.md)」を参照してください。パラメータマッピングは、プロキシ統合と非プロキシ統合の統合リクエストでは使用できますが、統合レスポンスでは、非プロキシ統合を使用する必要があります。

例えば、メソッドリクエストヘッダーパラメータ `puppies` を統合リクエストヘッダーパラメータ `DogsAge0` にマッピングできます。その後、クライアントが API にヘッダー `puppies:true` を送信すると、統合リクエストはリクエストヘッダー `DogsAge0:true` を統合エンドポイントに送信します。次の図は、この例のリクエストライフサイクルを説明しています。

![\[リクエストの API Gateway パラメータマッピングの例の図\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/parameter-mapping-example1.png)


API Gateway を使用してこの例を作成するには、「[例 1: メソッドリクエストパラメータを統合リクエストパラメータにマッピングする](request-response-data-mappings.md#request-response-data-mappings-example-1)」を参照してください。

 別の例としては、統合レスポンスヘッダーパラメータ `kittens` をメソッドレスポンスヘッダーパラメータ `CatsAge0` にマッピングすることもできます。その後、統合エンドポイントが `kittens:false` を返すと、クライアントはヘッダー `CatsAge0:false` を受け取ります。次の図は、この例のリクエストライフサイクルを説明しています。

![\[レスポンスの API Gateway パラメータマッピングの例の図\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/parameter-mapping-example2.png)


**Topics**
+ [

# API Gateway での REST API パラメータマッピングの例
](request-response-data-mappings.md)
+ [

# API Gateway での REST API パラメータマッピングのソースのリファレンス
](rest-api-parameter-mapping-sources.md)

# API Gateway での REST API パラメータマッピングの例
<a name="request-response-data-mappings"></a>

次の例は、API Gateway コンソール、OpenAPI、CloudFormation テンプレートを使用して、パラメータマッピング式を作成する方法を説明しています。パラメータマッピングを使用して必要な CORS ヘッダーを作成する方法の例については、「[API Gateway での REST API の CORS](how-to-cors.md)」を参照してください。

## 例 1: メソッドリクエストパラメータを統合リクエストパラメータにマッピングする
<a name="request-response-data-mappings-example-1"></a>

次の例では、メソッドリクエストヘッダーパラメータ `puppies` を統合リクエストヘッダーパラメータ `DogsAge0` にマッピングします。

------
#### [ AWS マネジメントコンソール ]

**メソッドリクエストパラメータをマッピングするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. メソッドを選択します。

   メソッドには非プロキシ統合が必要です。

1. **[メソッドリクエストの設定]** で、**[編集]** をクリックします。

1. **[HTTP リクエストヘッダー]** を選択します。

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

1. **[Name]** (名前) には **puppies** を入力します。

1. **[保存]** を選択します。

1. **[統合リクエスト]** タブを選択し、**[統合リクエストの設定]** で、**[編集]** を選択します。

   AWS マネジメントコンソール は自動的に `method.request.header.puppies ` から `puppies` にパラメータマッピングを追加します。ただし、**[名前]** を統合エンドポイントで想定されるリクエストヘッダーパラメータと一致するように変更する必要があります。

1. **[Name]** (名前) には **DogsAge0** を入力します。

1. **[保存]** を選択します。

1. 変更を有効にするには、API を再デプロイします。

次の手順では、パラメータマッピングが正常に完了したかを確認する方法を説明します。

**(オプション) パラメータマッピングをテストする**

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

1. [ヘッダー] には、**puppies:true** と入力します。

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

1. **[ログ]** では結果が以下のようになります。

   ```
   Tue Feb 04 00:28:36 UTC 2025 : Method request headers: {puppies=true}
   Tue Feb 04 00:28:36 UTC 2025 : Method request body before transformations: 
   Tue Feb 04 00:28:36 UTC 2025 : Endpoint request URI: http://petstore-demo-endpoint.execute-api.com/petstore/pets
   Tue Feb 04 00:28:36 UTC 2025 : Endpoint request headers: {DogsAge0=true, x-amzn-apigateway-api-id=abcd1234, Accept=application/json, User-Agent=AmazonAPIGateway_aaaaaaa, X-Amzn-Trace-Id=Root=1-abcd-12344}
   ```

   リクエストヘッダーパラメータが、`puppies` から `DogsAge0` に変更されました。

------
#### [ CloudFormation ]

 この例では、[body](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-body) プロパティを使用して、OpenAPI 定義ファイルを API Gateway にインポートします。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Body:
        openapi: 3.0.1
        info:
          title: ParameterMappingExample
          version: "2025-02-04T00:30:41Z"
        paths:
          /pets:
            get:
              parameters:
                - name: puppies
                  in: header
                  schema:
                    type: string
              responses:
                "200":
                  description: 200 response
              x-amazon-apigateway-integration:
                httpMethod: GET
                uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets
                responses:
                  default:
                    statusCode: "200"
                requestParameters:
                  integration.request.header.DogsAge0: method.request.header.puppies
                passthroughBehavior: when_no_match
                type: http
  ApiGatewayDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  ApiGatewayDeployment20250219:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  Stage:
    Type: 'AWS::ApiGateway::Stage'
    Properties:
       DeploymentId: !Ref ApiGatewayDeployment20250219
       RestApiId: !Ref Api
       StageName: prod
```

------
#### [ OpenAPI ]

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "ParameterMappingExample",
    "version" : "2025-02-04T00:30:41Z"
  },
  "paths" : {
    "/pets" : {
      "get" : {
        "parameters" : [ {
          "name" : "puppies",
          "in" : "header",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response"
          }
        },
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.header.DogsAge0" : "method.request.header.puppies"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      }
    }
  }
}
```

------

## 例 2: 複数のメソッドリクエストパラメータを別々の統合リクエストパラメータにマッピングする
<a name="request-response-data-mappings-example-2"></a>

次の例では、複数値メソッドリクエストクエリ文字列パラメータ `methodRequestQueryParam` を統合リクエストクエリ文字列パラメータ `integrationQueryParam` にマッピングして、メソッドリクエストヘッダーパラメータ `methodRequestHeaderParam` を統合リクエストパスパラメータ `integrationPathParam` にマッピングします。

------
#### [ AWS マネジメントコンソール ]

**複数のメソッドリクエストパラメータをマッピングするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. メソッドを選択します。

   メソッドには非プロキシ統合が必要です。

1. **[メソッドリクエストの設定]** で、**[編集]** をクリックします。

1. **[URL クエリ文字列パラメータ]** を選択します。

1. [**クエリ文字列の追加**] を選択します。

1. **[Name]** (名前) には **methodRequestQueryParam** を入力します。

1. **[HTTP リクエストヘッダー]** を選択します。

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

1. **[Name]** (名前) には **methodRequestHeaderParam** を入力します。

1. **[保存]** を選択します。

1. **[統合リクエスト]** タブを選択し、**[統合リクエストの設定]** で、**[編集]** を選択します。

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

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

1. **[Name]** (名前) には **integrationPathParam** を入力します。

1. **[マッピング元]** として「**method.request.header.methodRequestHeaderParam**」と入力します。

   これにより、メソッドリクエストで指定したメソッドリクエストヘッダーが新しい統合リクエストパスパラメータにマッピングされます。

1. **[URL クエリ文字列パラメータ]** を選択します。

1. [**クエリ文字列の追加**] を選択します。

1. **[Name]** (名前) には **integrationQueryParam** を入力します。

1. **[マッピング元]** として「**method.request.multivaluequerystring.methodRequestQueryParam**」と入力します。

   これにより、複数値クエリ文字列パラメータが新しい単一値統合リクエストクエリ文字列パラメータにマッピングされます。

1. **[保存]** を選択します。

1. 変更を有効にするには、API を再デプロイします。

------
#### [ CloudFormation ]

 この例では、[body](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-body) プロパティを使用して、OpenAPI 定義ファイルを API Gateway にインポートします。

次の OpenAPI 定義は、HTTP 統合のために以下のパラメータマッピングを作成します。
+ `methodRequestHeaderParam` という名前のメソッドリクエストのヘッダーから、`integrationPathParam` という名前の統合リクエストパスパラメータへのマッピング
+ `methodRequestQueryParam` という名前の複数値のメソッドリクエストから、`integrationQueryParam` という名前の統合リクエストのクエリ文字列へのマッピング

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Body: 
        openapi: 3.0.1
        info:
          title: Parameter mapping example 2
          version: "2025-01-15T19:12:31Z"
        paths:
          /:
            post:
              parameters:
                - name: methodRequestQueryParam
                  in: query
                  schema:
                    type: string
                - name: methodRequestHeaderParam
                  in: header
                  schema:
                    type: string
              responses:
                "200":
                  description: 200 response
              x-amazon-apigateway-integration:
                httpMethod: GET
                uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets
                responses:
                  default:
                    statusCode: "200"
                requestParameters:
                  integration.request.querystring.integrationQueryParam: method.request.multivaluequerystring.methodRequestQueryParam
                  integration.request.path.integrationPathParam: method.request.header.methodRequestHeaderParam
                requestTemplates:
                  application/json: '{"statusCode": 200}'
                passthroughBehavior: when_no_templates
                timeoutInMillis: 29000
                type: http
  ApiGatewayDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  ApiGatewayDeployment20250219:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  Stage:
    Type: 'AWS::ApiGateway::Stage'
    Properties:
       DeploymentId: !Ref ApiGatewayDeployment20250219
       RestApiId: !Ref Api
       StageName: prod
```

------
#### [ OpenAPI ]

次の OpenAPI 定義は、HTTP 統合のために以下のパラメータマッピングを作成します。
+ `methodRequestHeaderParam` という名前のメソッドリクエストのヘッダーから、`integrationPathParam` という名前の統合リクエストパスパラメータへのマッピング
+ `methodRequestQueryParam` という名前の複数値のメソッドリクエストから、`integrationQueryParam` という名前の統合リクエストのクエリ文字列へのマッピング

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "Parameter mapping example 2",
    "version" : "2025-01-15T19:12:31Z"
  },
  "paths" : {
    "/" : {
      "post" : {
        "parameters" : [ {
          "name" : "methodRequestQueryParam",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "methodRequestHeaderParam",
          "in" : "header",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response"
          }
        },
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.querystring.integrationQueryParam" : "method.request.multivaluequerystring.methodRequestQueryParam",
            "integration.request.path.integrationPathParam" : "method.request.header.methodRequestHeaderParam"
          },
          "requestTemplates" : {
            "application/json" : "{\"statusCode\": 200}"
          },
          "passthroughBehavior" : "when_no_templates",
          "timeoutInMillis" : 29000,
          "type" : "http"
        }
      }
    }
  }
}
```

------

## 例 3: JSON リクエスト本文のフィールドを統合リクエストパラメータにマッピングする
<a name="request-response-data-mappings-example-3"></a>

統合リクエストのパラメータは、[JSONPath 式](http://goessner.net/articles/JsonPath/index.html#e2) を使用して JSON リクエスト本文のフィールドからマッピングすることもできます。次の例では、メソッドリクエスト本文を `body-header` という名前の統合リクエストヘッダーにマッピングし、JSON 式で表されるリクエスト本文の一部を `pet-price` という名前の統合リクエストヘッダーにマッピングします。

この例をテストするには、次のような料金カテゴリを含む入力を指定します。

```
[ 
  { 
    "id": 1, 
    "type": "dog", 
    "price": 249.99 
  }
]
```

------
#### [ AWS マネジメントコンソール ]

**複数のメソッドリクエストパラメータをマッピングするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. `POST` メソッド、`PUT` メソッド、`PATCH` メソッド、または `ANY` メソッドのいずれかを選択します。

   メソッドには非プロキシ統合が必要です。

1. **[統合リクエストの設定]**で、**[編集]** を選択します。

1. **[URLリクエストヘッダーのパラメータ]** をクリックします。

1. **[リクエストヘッダーのパラメータを追加]** をクリックします。

1. **[Name]** (名前) には **body-header** を入力します。

1. **[マッピング元]** として「**method.request.body**」と入力します。

   これにより、メソッドリクエスト本文が新しい統合リクエストヘッダーにマッピングされます。

1. **[リクエストヘッダーのパラメータを追加]** をクリックします。

1. **[Name]** (名前) には **pet-price** を入力します。

1. **[マッピング元]** として「** method.request.body[0].price**」と入力します。

   これにより、メソッドリクエスト本文の一部が新しい統合リクエストヘッダーにマッピングされます。

1. **[保存]** を選択します。

1. 変更を有効にするには、API を再デプロイします。

------
#### [ CloudFormation ]

 この例では、[body](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-body) プロパティを使用して、OpenAPI 定義ファイルを API Gateway にインポートします。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Body: 
        openapi: 3.0.1
        info:
          title: Parameter mapping example 3
          version: "2025-01-15T19:19:14Z"
        paths:
          /:
            post:
              responses:
                "200":
                  description: 200 response
              x-amazon-apigateway-integration:
                httpMethod: GET
                uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets
                responses:
                  default:
                    statusCode: "200"
                requestParameters:
                  integration.request.header.pet-price: method.request.body[0].price
                  integration.request.header.body-header: method.request.body
                requestTemplates:
                  application/json: '{"statusCode": 200}'
                passthroughBehavior: when_no_templates
                timeoutInMillis: 29000
                type: http
  ApiGatewayDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  ApiGatewayDeployment20250219:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  Stage:
    Type: 'AWS::ApiGateway::Stage'
    Properties:
       DeploymentId: !Ref ApiGatewayDeployment20250219
       RestApiId: !Ref Api
       StageName: prod
```

------
#### [ OpenAPI ]

次の OpenAPI 定義は、JSON リクエスト本文の複数のフィールドから統合リクエストパラメータをマッピングします。

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "Parameter mapping example 3",
    "version" : "2025-01-15T19:19:14Z"
  },
  "paths" : {
    "/" : {
      "post" : {
        "responses" : {
          "200" : {
            "description" : "200 response"
          }
        },
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.header.pet-price" : "method.request.body[0].price",
            "integration.request.header.body-header" : "method.request.body"
          },
          "requestTemplates" : {
            "application/json" : "{\"statusCode\": 200}"
          },
          "passthroughBehavior" : "when_no_templates",
          "timeoutInMillis" : 29000,
          "type" : "http"
        }
      }
    }
  }
}
```

------

## 例 4: 統合レスポンスをメソッドレスポンスにマッピングする
<a name="request-response-data-mappings-example-4"></a>

統合レスポンスをメソッドレスポンスにマップすることもできます。次の例では、統合レスポンス本文を `location` という名前のメソッドレスポンスヘッダーにマッピングし、統合レスポンスヘッダー `x-app-id` をメソッドレスポンスヘッダー `id` にマッピングして、複数値の統合レスポンスヘッダー `item` をメソッドレスポンスヘッダー `items` にマッピングします。

------
#### [ AWS マネジメントコンソール ]

**統合レスポンスをマッピングするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. メソッドを選択します。

   メソッドには非プロキシ統合が必要です。

1. **[メソッドレスポンス]** タブを選択して、**[レスポンス 200]** で **[編集]** を選択します。

1. **[ヘッダー名]** では、**[ヘッダーを追加]** を選択します。

1. **id**、**item**、**location** という名前の 3 つのヘッダーを作成します。

1. **[保存]** を選択します。

1. **[統合レスポンス]** タブをクリックして、**[デフォルト - レスポンス]** で、**[編集]** をクリックします。

1. **[ヘッダーのマッピング]** で、以下を入力します。

   1. **[ID]** には **integration.response.header.x-app-id** と入力する

   1. **[項目]** には **integration.response.multivalueheader.item** と入力する

   1. **[場所]** には **integration.response.body.redirect.url** と入力する

1. **[保存]** を選択します。

1. 変更を有効にするには、API を再デプロイします。

------
#### [ CloudFormation ]

 この例では、[body](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-body) プロパティを使用して、OpenAPI 定義ファイルを API Gateway にインポートします。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Body:
        openapi: 3.0.1
        info:
          title: Parameter mapping example
          version: "2025-01-15T19:21:35Z"
        paths:
          /:
            post:
              responses:
                "200":
                  description: 200 response
                  headers:
                    item:
                      schema:
                        type: string
                    location:
                      schema:
                        type: string
                    id:
                      schema:
                        type: string
              x-amazon-apigateway-integration:
                type: http
                httpMethod: GET
                uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets
                responses:
                  default:
                    statusCode: "200"
                    responseParameters:
                      method.response.header.id: integration.response.header.x-app-id
                      method.response.header.location: integration.response.body.redirect.url
                      method.response.header.item: integration.response.multivalueheader.item
                requestTemplates:
                  application/json: '{"statusCode": 200}'
                passthroughBehavior: when_no_templates
                timeoutInMillis: 29000
  ApiGatewayDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  ApiGatewayDeployment20250219:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  Stage:
    Type: 'AWS::ApiGateway::Stage'
    Properties:
       DeploymentId: !Ref ApiGatewayDeployment20250219
       RestApiId: !Ref Api
       StageName: prod
```

------
#### [ OpenAPI ]

次の OpenAPI 定義は、統合レスポンスをメソッドレスポンスにマッピングします。

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "Parameter mapping example",
    "version" : "2025-01-15T19:21:35Z"
  },
  "paths" : {
    "/" : {
      "post" : {
        "responses" : {
          "200" : {
            "description" : "200 response",
            "headers" : {
              "item" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "location" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "id" : {
                "schema" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "http",
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.id" : "integration.response.header.x-app-id",
                "method.response.header.location" : "integration.response.body.redirect.url",
                "method.response.header.item" : "integration.response.multivalueheader.item"
              }
            }
          },
          "requestTemplates" : {
            "application/json" : "{\"statusCode\": 200}"
          },
          "passthroughBehavior" : "when_no_templates",
          "timeoutInMillis" : 29000
        }
      }
    }
  }
}
```

------

# API Gateway での REST API パラメータマッピングのソースのリファレンス
<a name="rest-api-parameter-mapping-sources"></a>

パラメータマッピングを作成する際は、変更するメソッドリクエストまたは統合レスポンスパラメータを指定して、これらのパラメータを変更する方法を指定します。

次の表は、マッピングできるメソッドリクエストパラメータと、マッピングを作成する式をまとめています。これらの式での *name* はメソッドリクエストパラメータ名です。例えば、リクエストヘッダーパラメータ `puppies` をマッピングするには、`method.request.header.puppies` という式を使用します。式は、正規表現 `'^[a-zA-Z0-9._$-]+$]'` と一致する必要があります。プロキシ統合と非プロキシ統合の統合リクエストでは、パラメータマッピングを使用できます。


| **マッピングされたデータソース** | **マッピング式** | 
| --- | --- | 
| メソッドリクエストのパス | method.request.path.name | 
| メソッドリクエストのクエリ文字列 | method.request.querystring.name | 
| 複数値メソッドリクエストのクエリ文字列 | method.request.multivaluequerystring.name | 
| メソッドリクエストのヘッダー | method.request.header.name | 
| 複数値メソッドリクエストのヘッダー | method.request.multivalueheader.name | 
| メソッドリクエストボディ | method.request.body | 
| メソッドリクエストボディ (JsonPath) | `method.request.body.JSONPath_EXPRESSION`. *JSONPath\$1EXPRESSION* はリクエスト本文の JSON フィールドの JSONPath 式です。詳細については、「[JSONPath 式](http://goessner.net/articles/JsonPath/index.html#e2)」を参照してください。  | 
| ステージ変数 | stageVariables.name | 
| コンテキスト変数 |  `context.name` 名前は、[サポートされるコンテキスト変数](api-gateway-mapping-template-reference.md#context-variable-reference)のいずれかである必要があります。 | 
| 静的な値 | `'static_value'`. *STATIC\$1VALUE* はリテラル文字列で、単一引用符のペアで囲まれている必要があります。例えば、`'https://www.example.com'`。 | 

次の表は、マッピングできる統合レスポンスパラメータと、マッピングを作成する式をまとめています。これらの式での *name* はメ統合レスポンスパラメータ名です。メソッドレスポンスヘッダーは、任意の統合レスポンスヘッダーまたは統合レスポンス本文、\$1context 変数、または静的な値からマップできます。統合レスポンスでパラメータマッピングを使用するには、非プロキシ統合を使用する必要があります。


| マッピングされたデータソース | マッピング式 | 
| --- | --- | 
| 統合レスポンスのヘッダー | integration.response.header.name | 
| 統合レスポンスのヘッダー | integration.response.multivalueheader.name | 
| 統合レスポンスの本文 | integration.response.body | 
| 統合レスポンスの本文 (JsonPath) | `integration.response.body.JSONPath_EXPRESSION` *JSONPath\$1EXPRESSION* はレスポンス本文の JSON フィールドの JSONPath 式です。詳細については、「[JSONPath 式](http://goessner.net/articles/JsonPath/index.html#e2)」を参照してください。 | 
| ステージ変数 | stageVariables.name | 
| コンテキスト変数 |  `context.name` 名前は、[サポートされるコンテキスト変数](api-gateway-mapping-template-reference.md#context-variable-reference)のいずれかである必要があります。 | 
| 静的な値 | ` 'static_value'` *STATIC\$1VALUE* はリテラル文字列で、単一引用符のペアで囲まれている必要があります。例えば、`'https://www.example.com'`。 | 

# API Gateway での REST API のテンプレート変換のマッピング
<a name="models-mappings"></a>

マッピングテンプレート変換では、統合リクエストまたは統合レスポンスの変更にマッピングテンプレートを使用します。*マッピングテンプレート*は、[Velocity Template Language (VTL)](https://velocity.apache.org/engine/devel/vtl-reference.html) で表現されるスクリプトであり、`Content-type` ヘッダーに基づいて [JSONPath](https://goessner.net/articles/JsonPath/) を使用してペイロードに適用されます。マッピングテンプレート変換を使用する場合は、マッピングテンプレートを使います。このセクションでは、マッピングテンプレートに関連する概念的な情報を説明します。

次の図は、PetStore 統合エンドポイントと統合されている `POST /pets` リソースのリクエストライフサイクルを説明しています。この API では、ユーザーはペットに関するデータを送信し、統合エンドポイントはペットの譲渡料金を返します。このリクエストライフサイクルでは、マッピングテンプレート変換が、リクエスト本文を統合エンドポイントにフィルタリングして、統合エンドポイントからレスポンス本文をフィルタリングします。

![\[リクエストライフサイクルの例\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/mapping-template-transforms.png)


以下のセクションでは、リクエストレスポンスのライフサイクルについて説明します。

## メソッドリクエストと統合リクエスト
<a name="models-mappings-request"></a>

前の例で、これがメソッドリクエストに送信されたリクエスト本文である場合:

```
POST /pets
    HTTP/1.1
    Host:abcd1234.us-west-2.amazonaws.com
    Content-type: application/json
    
  {
    "id": 1,
    "type": "dog",
    "Age": 11,
  }
```

このリクエスト本文は、統合エンドポイントで使用される適切な形式ではないため、API Gateway はマッピングテンプレート変換を実行します。API Gateway は、Content-Type `application/json` 用に定義されたマッピングテンプレートがあるため、マッピングテンプレート変換のみを実行します。Content-Type のマッピングテンプレートを定義しない場合、デフォルトでは、API Gateway は統合リクエストを介して統合エンドポイントに本文を渡します。この動作を変更するには、「[API Gateway で REST API のマッピングテンプレートを使用しないペイロードのメソッドリクエストの動作](integration-passthrough-behaviors.md)」を参照してください。

次のマッピングテンプレートは、統合エンドポイントに送信される前に、統合リクエストのメソッドリクエストデータを変換します。

```
#set($inputRoot = $input.path('$'))
  {
    "dogId" : "dog_"$elem.id,
    "Age": $inputRoot.Age
  }
```

1. `$inputRoot` 変数は、前のセクションにおける元の JSON データのルートオブジェクトです。ディレクティブは `#` 記号で始まります。

1. `dog` は、ユーザーの `id` と文字列値を連結したものです。

1. `Age` はメソッドリクエスト本文からのものです。

次に、以下の出力が統合エンドポイントに転送されます。

```
{
    "dogId" : "dog_1",
    "Age": 11
  }
```

## 統合レスポンスとメソッドレスポンス
<a name="models-mappings-response"></a>

統合エンドポイントへのリクエストが正常に完了すると、エンドポイントは API Gateway の統合レスポンスにレスポンスを送信します。以下は、統合エンドポイントからの出力データの例です。

```
{
    "dogId" : "dog_1",
    "adoptionFee": 19.95,
}
```

メソッドレスポンスは、統合レスポンスが返すペイロードとは異なるペイロードを想定しています。API Gateway はマッピングテンプレート変換を実行します。API Gateway は、Content-Type `application/json` 用に定義されたマッピングテンプレートがあるため、マッピングテンプレート変換のみを実行します。Content-Type のマッピングテンプレートを定義しない場合、デフォルトでは、API Gateway は統合レスポンスを介してメソッドレスポンスに本文を渡します。この動作を変更するには、「[API Gateway で REST API のマッピングテンプレートを使用しないペイロードのメソッドリクエストの動作](integration-passthrough-behaviors.md)」を参照してください。

```
#set($inputRoot = $input.path('$'))
  {
    "adoptionFee" : $inputRoot.adoptionFee,
  }
```

以下の出力は、メソッドレスポンスに送信されます。

```
{"adoptionFee": 19.95}
```

これで、マッピングテンプレート変換の例は完了です。可能であれば、データの変換には、マッピングテンプレート変換を使用する代わりに、プロキシ統合を使用することをお勧めします。詳細については、「[API Gateway API 統合タイプの選択](api-gateway-api-integration-types.md)」を参照してください。

# API Gateway で REST API のマッピングテンプレートを使用しないペイロードのメソッドリクエストの動作
<a name="integration-passthrough-behaviors"></a>

メソッドリクエストにペイロードがあり、`Content-Type` ヘッダーにマッピングテンプレートが定義されていない場合は、クライアントが提供するリクエストペイロードを変換せずに統合リクエストを介してバックエンドに渡すことができます。このプロセスは統合パススルーと呼ばれます。

 受信リクエストの実際のパススルー動作は、この設定によって決まります。3 つのオプションがあります。

**リクエストした Content-Type ヘッダーと一致するテンプレートがない場合**  
メソッドリクエストのコンテンツタイプが、マッピングテンプレートと関連付けられたコンテンツタイプに一致しない場合に、統合リクエストをパススルーしてメソッドリクエスト本文を変換せずにバックエンドに渡す場合は、このオプションを選択します。  
API Gateway API を呼び出すときは、[[統合]](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) の `passthroughBehavior` プロパティの値として `WHEN_NO_MATCH` を設定して、このオプションを選択します。

**テンプレートが定義されていない場合 (推奨)**  
統合リクエストでマッピングテンプレートが定義されていないときに、統合リクエストをパススルーしてメソッドリクエスト本文を変換せずにバックエンドに渡す場合は、このオプションを選択します。このオプションを選択した際にテンプレートが定義されている場合、定義されたマッピングテンプレートのいずれにも一致しないペイロードとコンテンツタイプのメソッドリクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。  
API Gateway API を呼び出すときは、[[統合]](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) の `passthroughBehavior` プロパティの値として `WHEN_NO_TEMPLATES` を設定して、このオプションを選択します。

**なし**  
統合リクエストでマッピングテンプレートが定義されていないときに、統合リクエストをパススルーしてメソッドリクエストボディを変換せずにバックエンドに渡さない場合は、このオプションを選択します。このオプションを選択したときにテンプレートが定義されている場合、マッピングされていないコンテンツタイプのメソッドリクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。  
API Gateway API を呼び出すときは、[[統合]](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) の `passthroughBehavior` プロパティの値として `NEVER` を設定して、このオプションを選択します。

 次の例では、可能なパススルー動作について説明します。

例 1: `application/json` コンテンツタイプで 1 つのマッピングテンプレートが統合リクエストで定義されている。


| Content-type | パススルーのオプション | 行動 | 
| --- | --- | --- | 
| なし API Gateway のデフォルトは `application/json` | WHEN\$1NO\$1MATCH | リクエストペイロードはテンプレートを使用して変換されます。 | 
| なし API Gateway のデフォルトは `application/json` | WHEN\$1NO\$1TEMPLATES | リクエストペイロードはテンプレートを使用して変換されます。 | 
| なし API Gateway のデフォルトは `application/json` | NEVER | リクエストペイロードはテンプレートを使用して変換されます。 | 
| application/json | WHEN\$1NO\$1MATCH | リクエストペイロードはテンプレートを使用して変換されます。 | 
| application/json | WHEN\$1NO\$1TEMPLATES | リクエストペイロードはテンプレートを使用して変換されます。 | 
| application/json | NEVER | リクエストペイロードはテンプレートを使用して変換されます。 | 
| application/xml | WHEN\$1NO\$1MATCH | リクエストペイロードは変換されず、そのままバックエンドに送信されます。 | 
| application/xml | WHEN\$1NO\$1TEMPLATES | リクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。 | 
| application/xml | NEVER | リクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。 | 

例 2: `application/xml` コンテンツタイプで 1 つのマッピングテンプレートが統合リクエストで定義されている。


| Content-type | パススルーのオプション | 行動 | 
| --- | --- | --- | 
| なし API Gateway のデフォルトは `application/json` | WHEN\$1NO\$1MATCH | リクエストペイロードは変換されず、そのままバックエンドに送信されます。 | 
| なし API Gateway のデフォルトは `application/json` | WHEN\$1NO\$1TEMPLATES | リクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。 | 
| なし API Gateway のデフォルトは `application/json` | NEVER | リクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。 | 
| application/json | WHEN\$1NO\$1MATCH | リクエストペイロードは変換されず、そのままバックエンドに送信されます。 | 
| application/json | WHEN\$1NO\$1TEMPLATES | リクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。 | 
| application/json | NEVER | リクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。 | 
| application/xml | WHEN\$1NO\$1MATCH | リクエストペイロードはテンプレートを使用して変換されます。 | 
| application/xml | WHEN\$1NO\$1TEMPLATES | リクエストペイロードはテンプレートを使用して変換されます。 | 
| application/xml | NEVER | リクエストペイロードはテンプレートを使用して変換されます。 | 

例 3: 統合リクエストで定義されているマッピングテンプレートがない


| Content-type | パススルーのオプション | 行動 | 
| --- | --- | --- | 
| なし API Gateway のデフォルトは `application/json` | WHEN\$1NO\$1MATCH | リクエストペイロードは変換されず、そのままバックエンドに送信されます。 | 
| なし API Gateway のデフォルトは `application/json` | WHEN\$1NO\$1TEMPLATES | リクエストペイロードは変換されず、そのままバックエンドに送信されます。 | 
| なし API Gateway のデフォルトは `application/json` | NEVER | リクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。 | 
| application/json | WHEN\$1NO\$1MATCH | リクエストペイロードは変換されず、そのままバックエンドに送信されます。 | 
| application/json | WHEN\$1NO\$1TEMPLATES | リクエストペイロードは変換されず、そのままバックエンドに送信されます。 | 
| application/json | NEVER | リクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。 | 
| application/xml | WHEN\$1NO\$1MATCH | リクエストペイロードは変換されず、そのままバックエンドに送信されます。 | 
| application/xml | WHEN\$1NO\$1TEMPLATES | リクエストペイロードは変換されず、そのままバックエンドに送信されます。 | 
| application/xml | NEVER | リクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。 | 

# 追加の API Gateway での REST API マッピングテンプレート例
<a name="example-photos"></a>

次の例は、マッピングテンプレートを使用して統合リクエストと統合レスポンスデータを変換する API Gateway のフォトアルバム API を説明しています。この例では、データモデルを使用して、メソッドリクエストと統合レスポンスのペイロードも定義しています。データモデルの詳細については、「[REST API のデータモデル](models-mappings-models.md)」を参照してください。

## メソッドリクエストと統合リクエスト
<a name="example-photos-request"></a>

以下は、メソッドリクエスト本文を定義するモデルです。この入力モデルでは、発信者が 1 ページの写真をアップロードする必要があり、ページごとに最低 10 枚の写真が必要です。この入力モデルを使用して SDK を生成したり、API のリクエストの検証に使用したりできます。リクエストの検証の使用中に、メソッドリクエスト本文がモデルのデータ構造に準拠していない場合、API Gateway はリクエストを失敗にします。

```
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "PhotosInputModel",
  "type": "object",
  "properties": {
    "photos": {
      "type": "object",
      "required" : [
      "photo"
      ],
      "properties": {
        "page": { "type": "integer" },
        "pages": { "type": "string" },
        "perpage": { "type": "integer", "minimum" : 10 },
        "total": { "type": "string" },
        "photo": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": { "type": "string" },
              "owner": { "type": "string" },
              "photographer_first_name" : {"type" : "string"},
              "photographer_last_name" : {"type" : "string"},
              "secret": { "type": "string" },
              "server": { "type": "string" },
              "farm": { "type": "integer" },
              "title": { "type": "string" },
              "ispublic": { "type": "boolean" },
              "isfriend": { "type": "boolean" },
              "isfamily": { "type": "boolean" }
            }
          }
        }
      }
    }
  }
}
```

以下は、上記のデータモデルのデータ構造に準拠するメソッドリクエスト本文の例です。

```
{
  "photos": {
    "page": 1,
    "pages": "1234",
    "perpage": 100,
    "total": "123398",
    "photo": [
      {
        "id": "12345678901",
        "owner": "23456789@A12",
        "photographer_first_name" : "Saanvi",
        "photographer_last_name" : "Sarkar",
        "secret": "abc123d456",
        "server": "1234",
        "farm": 1,
        "title": "Sample photo 1",
        "ispublic": true,
        "isfriend": false,
        "isfamily": false
      },
      {
        "id": "23456789012",
        "owner": "34567890@B23",
        "photographer_first_name" : "Richard",
        "photographer_last_name" : "Roe",
        "secret": "bcd234e567",
        "server": "2345",
        "farm": 2,
        "title": "Sample photo 2",
        "ispublic": true,
        "isfriend": false,
        "isfamily": false
      }
    ]
  }
}
```

この例では、クライアントが上記のメソッドリクエスト本文を送信すると、このマッピングテンプレートは統合エンドポイントに必要な形式と一致するようにペイロードを変換します。

```
#set($inputRoot = $input.path('$'))
{
  "photos": [
#foreach($elem in $inputRoot.photos.photo)
    {
      "id": "$elem.id",
      "photographedBy": "$elem.photographer_first_name $elem.photographer_last_name",
      "title": "$elem.title",
      "ispublic": $elem.ispublic,
      "isfriend": $elem.isfriend,
      "isfamily": $elem.isfamily
    }#if($foreach.hasNext),#end
		
#end
  ]
}
```

次の例は、変換からの出力データです。

```
{
  "photos": [
    {
      "id": "12345678901",
      "photographedBy": "Saanvi Sarkar",
      "title": "Sample photo 1",
      "ispublic": true,
      "isfriend": false,
      "isfamily": false
    },		
    {
      "id": "23456789012",
      "photographedBy": "Richard Roe",
      "title": "Sample photo 2",
      "ispublic": true,
      "isfriend": false,
      "isfamily": false
    }		
  ]
}
```

このデータは統合リクエストに送信されてから、統合エンドポイントに送信されます。

## 統合レスポンスとメソッドレスポンス
<a name="photos-example-response"></a>

以下は、統合エンドポイントからの写真データの出力モデルの例です。このモデルはメソッドレスポンスモデルに使用できます。これは、API 用に厳密に型指定した SDK を生成するときに必要です。これにより、出力が Java や Objective-C の適切なクラスにキャストされます。

```
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "PhotosOutputModel",
  "type": "object",
  "properties": {
    "photos": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": { "type": "string" },
          "photographedBy": { "type": "string" },
          "title": { "type": "string" },
          "ispublic": { "type": "boolean" },
          "isfriend": { "type": "boolean" },
          "isfamily": { "type": "boolean" }
        }
      }
    }
  }
}
```

統合エンドポイントは、このモデルのデータ構造に準拠するレスポンスで応答しない場合があります。例えば、統合レスポンスは次のようになります。

```
  "photos": [
    {
      "id": "12345678901",
      "photographedBy": "Saanvi Sarkar",
      "title": "Sample photo 1",
      "description": "My sample photo 1",
      "public": true,
      "friend": false,
      "family": false
    },		
    {
      "id": "23456789012",
      "photographedBy": "Richard Roe",
      "title": "Sample photo 2",
      "description": "My sample photo 1",
      "public": true,
      "friend": false,
      "family": false
    }		
  ]
}
```

次のマッピングテンプレートの例では、統合レスポンスデータをメソッドレスポンスで想定される形式に変換します。

```
#set($inputRoot = $input.path('$'))
{
  "photos": [
#foreach($elem in $inputRoot.photos.photo)
    {
      "id": "$elem.id",
      "photographedBy": "$elem.photographer_first_name $elem.photographer_last_name",
      "title": "$elem.title",
      "ispublic": $elem.public,
      "isfriend": $elem.friend,
      "isfamily": $elem.family
    }#if($foreach.hasNext),#end
		
#end
  ]
}
```

次の例は、変換からの出力データです。

```
{
  "photos": [
    {
      "id": "12345678901",
      "photographedBy": "Saanvi Sarkar",
      "title": "Sample photo 1",
      "ispublic": true,
      "isfriend": false,
      "isfamily": false
    },		
    {
      "id": "23456789012",
      "photographedBy": "Richard Roe",
      "title": "Sample photo 2",
      "ispublic": true,
      "isfriend": false,
      "isfamily": false
    }		
  ]
}
```

このデータはメソッドレスポンスに送信されてから、クライアントに送信されます。

# API Gateway で REST API の API リクエストパラメータおよびレスポンスパラメータとステータスコードを上書きする
<a name="apigateway-override-request-response-parameters"></a>

マッピングテンプレート変換を使用して、任意のタイプのリクエストパラメータ、レスポンスヘッダー、またはレスポンスステータスコードを上書きできます。マッピングテンプレートを使用して、以下を実行できます。
+ 多対 1 のパラメータマッピングを実行する
+ 標準 API Gateway マッピングが適用された適用された後にパラメータをオーバーライドする
+ 本文の内容やその他のパラメータ値に基づいて条件付きでパラメータをマッピングする
+ プログラムで新しいパラメータを作成する
+ 統合エンドポイントから返されたステータスコードをオーバーライドする

オーバーライドは最終的なものです。オーバーライドは各パラメータに一度だけ適用できます。同じパラメータを複数回オーバーライドしようとすると、API Gateway から `5XX` レスポンスが返されます。テンプレート全体で同じパラメータを複数回オーバーライドする必要がある場合は、変数を作成してテンプレートの終了時にオーバーライドを適用することをお勧めします。テンプレートはテンプレート全体が解析された後にのみ適用されます。

## 例 1: 統合本文に基づいてステータスコードを上書きする
<a name="apigateway-override-request-response-examples"></a>

次の例では、[サンプル API](api-gateway-create-api-from-example.md) を使用して、統合レスポンス本文に基づいてステータスコードを上書きします。

------
#### [ AWS マネジメントコンソール ]

**統合レスポンス本文に基づいてステータスコードを上書きするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. [**API の作成**] を選択します。

1. **[REST API]** では、**[構築]** を選択します。

1. **[API の詳細]** では、**[API の例]** を選択します。

1. **[API の作成]** を選択します。

   API Gateway は、サンプルのペットストア API を作成します。ペットに関する情報を取得するには、`GET /pets/{petId}` の API メソッドリクエストを使用します。ここで、`{petId}` は、ペットの ID 番号に対応するパスパラメータです。

   この例では、エラー状態が検出された場合、`GET` メソッドのレスポンスコードを `400` に上書きします。

1. **[リソース]** ツリーで、`/{petId}` の下の `GET` メソッドを選択します。

1. まず、API の現在の実装をテストします。

   **[テスト]** タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

1. **[petId]** に「**-1**」と入力し、**[テスト]** を選択します。

   **[レスポンス本文]** は、次のとおりの範囲外エラーを示します。

   ```
   {
     "errors": [
       {
         "key": "GetPetRequest.petId",
         "message": "The value is out of range."
       }
     ]
   }
   ```

   さらに、**[ログ]** の最後の行は `Method completed with status: 200` で終わります。

   統合は正常に完了しましたが、エラーが発生しました。次に、統合本文に基づいてステータスコードを上書きします。

1. **[統合レスポンス]** タブの **[デフォルト - レスポンス]** で、**[編集]** を選択します。

1. **[マッピングテンプレート]** を選択します。

1. [**マッピングテンプレートの追加**] を選択します。

1. **[コンテンツタイプ]** に、「**application/json**」と入力します。

1. **[テンプレート本文]** で次のように入力します。

   ```
   #set($inputRoot = $input.path('$'))
   $input.json("$")
   #if($inputRoot.toString().contains("error"))
   #set($context.responseOverride.status = 400)
   #end
   ```

   このマッピングテンプレートは、統合レスポンスに `error` 文字列が含まれている場合、`$context.responseOverride.status` 変数を使用してステータスコードを `400` に上書きします。

1. **[保存]** を選択します。

1. **[テスト]** タブを選択します。

1. **[petId]** に「**-1**」と入力します。

1. 結果として、[**Response Body (レスポンス本文)**] は範囲外エラーを示します。

   ```
   {
     "errors": [
       {
         "key": "GetPetRequest.petId",
         "message": "The value is out of range."
       }
     ]
   }
   ```

   ただし、**[ログ]** の最後の行は、`Method completed with status: 400` で終わるようになりました。

------
#### [ CloudFormation ]

 この例では、[body](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-body) プロパティを使用して、OpenAPI 定義ファイルを API Gateway にインポートします。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Body: 
        openapi: 3.0.1
        info:
          title: PetStore Example 1
          description: Example pet store API.
          version: "2025-01-14T00:13:18Z"
        paths:
          /pets/{petId}:
            get:
              parameters:
                - name: petId
                  in: path
                  required: true
                  schema:
                    type: string
              responses:
                "200":
                  description: 200 response
              x-amazon-apigateway-integration:
                httpMethod: GET
                uri: http://petstore.execute-api.us-east-1.amazonaws.com/petstore/pets/{petId}
                responses:
                  default:
                    statusCode: "200"
                    responseTemplates:
                      application/json: |-
                        #set($inputRoot = $input.path('$'))
                        $input.json("$")
                        #if($inputRoot.toString().contains("error"))
                        #set($context.responseOverride.status = 400)
                        #end
                requestParameters:
                  integration.request.path.petId: method.request.path.petId
                passthroughBehavior: when_no_match
                type: http
        components:
          schemas:
            Pet:
              type: object
              properties:
                id:
                  type: integer
                type:
                  type: string
                price:
                  type: number
  ApiGatewayDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  ApiGatewayDeployment20250219:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  Stage:
    Type: 'AWS::ApiGateway::Stage'
    Properties:
       DeploymentId: !Ref ApiGatewayDeployment20250219
       RestApiId: !Ref Api
       StageName: prod
```

------
#### [ OpenAPI ]

次の OpenAPI 定義は、`GET pets/{petId}` リソースを作成して、統合本文に基づいてステータスコードを上書きします。

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "PetStore Example 1",
    "description" : "Example pet store API.",
    "version" : "2025-01-14T00:13:18Z"
  },
  "paths" : {
    "/pets/{petId}" : {
      "get" : {
        "parameters" : [ {
          "name" : "petId",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response"
          }
        },
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "GET",
          "uri" : "http://petstore.execute-api.us-east-1.amazonaws.com/petstore/pets/{petId}",
          "responses" : {
            "default" : {
              "statusCode" : "200",
              "responseTemplates" : {
                "application/json" : "#set($inputRoot = $input.path('$'))\n$input.json(\"$\")\n#if($inputRoot.toString().contains(\"error\"))\n#set($context.responseOverride.status = 400)\n#end"
              }
            }
          },
          "requestParameters" : {
            "integration.request.path.petId" : "method.request.path.petId"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      }
    }
  },
  "components" : {
    "schemas" : {
      "Pet" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer"
          },
          "type" : {
            "type" : "string"
          },
          "price" : {
            "type" : "number"
          }
        }
      }
    }
  }
}
```

------

## 例 2: リクエストヘッダーを上書きして新しいヘッダーを作成する
<a name="apigateway-override-request-response-examples-2"></a>

次の例では、[サンプル API](api-gateway-create-api-from-example.md) を使用してリクエストヘッダーを上書きして、新しいヘッダーを作成します。

------
#### [ AWS マネジメントコンソール ]

**新しいヘッダーを作成してメソッドのリクエストヘッダーを上書きするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. 前のチュートリアルで作成した API の例を選択します。API の名前は **[PetStore]** であるはずです。

1. **[リソース]** ツリーで、`/pet` の下の `GET` メソッドを選択します。

1. **[メソッドリクエスト]** タブの **[メソッドリクエストの設定]** で、**[編集]** を選択します。

1. **[HTTP リクエストヘッダー]** を選択した後、**[ヘッダーの追加]** を選択します。

1. **[Name]** (名前) には **header1** を入力します。

1. **[ヘッダーを追加]** を選択し、**header2** という名前の 2 つ目のヘッダーを作成します。

1. **[保存]** を選択します。

   次に、マッピングテンプレートを使用して、これらのヘッダーを単一のヘッダー値に結合します。

1. **[統合リクエスト]** タブの **[統合リクエストの設定]** で、**[編集]** を選択します。

1. **[リクエスト本文のパススルー]** で、**[テンプレートが定義されていない場合 (推奨)]** を選択します。

1. **[マッピングテンプレート]** を選択し、次の操作を行います。

   1. [**マッピングテンプレートの追加**] を選択します。

   1. **[コンテンツタイプ]** に、「**application/json**」と入力します。

   1. **[テンプレート本文]** で次のように入力します。

      ```
      #set($header1Override = "pets")
      #set($header3Value = "$input.params('header1')$input.params('header2')")
      $input.json("$")
      #set($context.requestOverride.header.header3 = $header3Value)
      #set($context.requestOverride.header.header1 = $header1Override)
      #set($context.requestOverride.header.multivalueheader=[$header1Override, $header3Value])
      ```

      このマッピングテンプレートは、`header1` を文字列 `pets` で上書きし、`header1` と `header2` を組み合わせた `$header3Value` という名前の複数値ヘッダーを作成します。

1. **[保存]** を選択します。

1. **[テスト]** タブを選択します。

1. **[ヘッダー]** で、次のコードをコピーします。

   ```
   header1:header1Val
   header2:header2Val
   ```

1. [**Test (テスト)**] を選択します。

   **[ログ]** には次のとおり、このテキストを含むエントリが表示されるはずです。

   ```
   Endpoint request headers: {header3=header1Valheader2Val, 
   header2=header2Val, header1=pets, x-amzn-apigateway-api-id=api-id,
   Accept=application/json, multivalueheader=pets,header1Valheader2Val}
   ```

------
#### [ CloudFormation ]

 この例では、[body](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-body) プロパティを使用して、OpenAPI 定義ファイルを API Gateway にインポートします。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Body: 
        openapi: 3.0.1
        info:
          title: PetStore Example 2
          description: Example pet store API.
          version: "2025-01-14T00:36:18Z"
        paths:
          /pets:
            get:
              parameters:
                - name: header2
                  in: header
                  schema:
                    type: string
                - name: page
                  in: query
                  schema:
                    type: string
                - name: type
                  in: query
                  schema:
                    type: string
                - name: header1
                  in: header
                  schema:
                    type: string
              responses:
                "200":
                  description: 200 response
              x-amazon-apigateway-integration:
                httpMethod: GET
                uri: http://petstore.execute-api.us-east-1.amazonaws.com/petstore/pets
                responses:
                  default:
                    statusCode: "200"
                requestParameters:
                  integration.request.header.header1: method.request.header.header1
                  integration.request.header.header2: method.request.header.header2
                  integration.request.querystring.page: method.request.querystring.page
                  integration.request.querystring.type: method.request.querystring.type
                requestTemplates:
                  application/json: |-
                    #set($header1Override = "pets")
                    #set($header3Value = "$input.params('header1')$input.params('header2')")
                    $input.json("$")
                    #set($context.requestOverride.header.header3 = $header3Value)
                    #set($context.requestOverride.header.header1 = $header1Override)
                    #set($context.requestOverride.header.multivalueheader=[$header1Override, $header3Value])
                passthroughBehavior: when_no_match
                type: http
        components:
          schemas:
            Pet:
              type: object
              properties:
                id:
                  type: integer
                type:
                  type: string
                price:
                  type: number
  ApiGatewayDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  ApiGatewayDeployment20250219:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn: Api 
    Properties: 
      RestApiId: !Ref Api
  Stage:
    Type: 'AWS::ApiGateway::Stage'
    Properties:
       DeploymentId: !Ref ApiGatewayDeployment20250219
       RestApiId: !Ref Api
       StageName: prod
```

------
#### [ OpenAPI ]

 次の OpenAPI 定義は、リソース `GET pets` を作成し、リクエストヘッダーを上書きして新しいヘッダーを作成します。

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "PetStore Example 2",
    "description" : "Example pet store API.",
    "version" : "2025-01-14T00:36:18Z"
  },
  "paths" : {
    "/pets" : {
      "get" : {
        "parameters" : [ {
          "name" : "header2",
          "in" : "header",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "page",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "type",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "header1",
          "in" : "header",
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response"
          }
        },
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "GET",
          "uri" : "http://petstore.execute-api.us-east-1.amazonaws.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.header.header1" : "method.request.header.header1",
            "integration.request.header.header2" : "method.request.header.header2",
            "integration.request.querystring.page" : "method.request.querystring.page",
            "integration.request.querystring.type" : "method.request.querystring.type"
          },
          "requestTemplates" : {
            "application/json" : "#set($header1Override = \"pets\")\n#set($header3Value = \"$input.params('header1')$input.params('header2')\")\n$input.json(\"$\")\n#set($context.requestOverride.header.header3 = $header3Value)\n#set($context.requestOverride.header.header1 = $header1Override)\n#set($context.requestOverride.header.multivalueheader=[$header1Override, $header3Value])"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      }
    }
  }
}
```

------

マッピングテンプレートの上書きを使用するには、マッピングテンプレートで以下の `$context` 変数のいずれかを使用します。`$context` 変数のリストについては、「[データ変換のコンテキスト変数](api-gateway-mapping-template-reference.md#context-variable-reference)」を参照してください。

# チュートリアル: AWS サービスへの統合のための統合リクエストとレスポンスを変更する
<a name="set-up-data-transformations-in-api-gateway"></a>

次のチュートリアルでは、マッピングテンプレート変換を使用して、コンソールと AWS CLI で統合リクエストとレスポンスを変換するためのマッピングテンプレートを設定する方法を説明します。

**Topics**
+ [

## API Gateway コンソールを使用してデータ変換を設定する
](#mapping-example-console)
+ [

## AWS CLI を使用してデータ変換を設定する
](#mapping-example-cli)
+ [

## 完成したデータ変換の CloudFormation テンプレート
](#api-gateway-data-transformations-full-cfn-stack)

## API Gateway コンソールを使用してデータ変換を設定する
<a name="mapping-example-console"></a>

このチュートリアルでは、.zip ファイル ([data-transformation-tutorial-console.zip](samples/data-transformation-tutorial-console.zip)) を使用して不完全な API と DynamoDB テーブルを作成します。この不完全な API には、`GET` メソッドと `POST` メソッドを持つ `/pets` リソースがあります。
+ `GET` メソッドは `http://petstore-demo-endpoint.execute-api.com/petstore/pets` HTTP エンドポイントからデータを取得します。出力データは、[API Gateway での REST API のテンプレート変換のマッピング](models-mappings.md) のマッピングテンプレートに従って変換されます。
+ `POST` メソッドを使用すると、ユーザーはマッピングテンプレートを使用して Amazon DynamoDB テーブルにペット情報を `POST` できます。

[CloudFormation のアプリケーション作成テンプレート](samples/data-transformation-tutorial-console.zip)をダウンロードして解凍します。このテンプレートを使用して、ペット情報と不完全な API を投稿するための DynamoDB テーブルを作成します。残りのステップは API Gateway コンソールで完了します。

**CloudFormation スタックを作成するには**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. [**スタックの作成**] を選択し、[**With new resources (standard) 新しいリソースを使用 (標準)**] を選択します。

1. [**Specify template (テンプレートの指定)**] で、[**Upload a template file (テンプレートファイルのアップロード)**] を選択します。

1. ダウンロードしたテンプレートを選択します。

1. [**Next (次へ)**] を選択します。

1. [**Stack name**] (スタックの名前) で、**data-transformation-tutorial-console** と入力し、[**Next**] (次へ) を選択します。

1. [**Configure stack options**] (スタックオプションの設定) で、[**Next**] (次へ) を選択します。

1. [**Capabilities**] (機能) で、CloudFormation がアカウントに IAM リソースを作成できることを承認します。

1. **[次へ]** を選択し、**[送信]** を選択します。

CloudFormation は、テンプレートで指定されたリソースをプロビジョニングします。リソースのプロビジョニングには数分かかることがあります。CloudFormation スタックのステータスが **CREATE\$1COMPLETE** の場合は、次のステップに進む準備ができています。

**`GET` 統合レスポンスをテストするには**

1. **data-transformation-tutorial-console** の CloudFormation スタックの **[リソース]** タブで、API の物理 ID を選択します。

1. メインナビゲーションペインで **[リソース]**、**[GET]** メソッドの順に選択します。

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

   テストの出力には、次の内容が表示されます。

   ```
   [
     {
       "id": 1,
       "type": "dog",
       "price": 249.99
     },
     {
       "id": 2,
       "type": "cat",
       "price": 124.99
     },
     {
       "id": 3,
       "type": "fish",
       "price": 0.99
     }
   ]
   ```

   この出力を [API Gateway での REST API のテンプレート変換のマッピング](models-mappings.md) のマッピングテンプレートに従って変換します。

**`GET` 統合レスポンスを変換するには**

1. **[統合レスポンス]** タブを選択します。

   現在、マッピングテンプレートは定義されていないため、統合レスポンスは変換されません。

1. **[デフォルト - レスポンス]** で **[編集]** を選択します。

1. **[マッピングテンプレート]** を選択し、次の操作を行います。

   1. [**マッピングテンプレートの追加**] を選択します。

   1. **[コンテンツタイプ]** に、「**application/json**」と入力します。

   1. **[テンプレート本文]** で次のように入力します。

      ```
      #set($inputRoot = $input.path('$'))
      [
      #foreach($elem in $inputRoot)
        {
          "description" : "Item $elem.id is a $elem.type.",
          "askingPrice" : $elem.price
        }#if($foreach.hasNext),#end
      
      #end
      ]
      ```

   **[保存]** を選択します。

**`GET` 統合レスポンスをテストするには**
+ **[テスト]** タブ、**[テスト]** の順に選択します。

  テストの出力に、変換されたレスポンスが表示されます。

  ```
  [
    {
      "description" : "Item 1 is a dog.",
      "askingPrice" : 249.99
    },
    {
      "description" : "Item 2 is a cat.",
      "askingPrice" : 124.99
    },
    {
      "description" : "Item 3 is a fish.",
      "askingPrice" : 0.99
    }
  ]
  ```

**`POST` メソッドからの入力データを変換するには**

1. **[POST]** メソッドを選択します。

1. **[統合リクエスト]** タブを選択し、**[統合リクエストの設定]** で、**[編集]** を選択します。

   CloudFormation テンプレートでは、いくつかの統合リクエストフィールドが入力されています。
   +  統合タイプは AWS のサービスです。
   +  AWS のサービスは DynamoDB です。
   +  HTTP メソッドは `POST` です。
   +  アクションは `PutItem` です。
   +  API Gateway が DynamoDB テーブルに項目を入力できるようにする実行ロールは `data-transformation-tutorial-console-APIGatewayRole` です。CloudFormation は、API Gateway が DynamoDB とやり取りするための最小限のアクセス許可を持つように、このロールを作成済みです。

    DynamoDB テーブルの名前は未指定です。次の手順に従って名前を指定します。

1. **[リクエスト本文のパススルー]** で、**[なし]** を選択します。

   つまり、API はマッピングテンプレートを持たない Content-Type のデータを拒否します。

1. **[マッピングテンプレート]** を選択します。

1. **[コンテンツタイプ]** は `application/json` に設定されます。つまり、application/json 以外のコンテンツタイプは API によって拒否されます。統合パススルーの動作の詳細については、「[API Gateway で REST API のマッピングテンプレートを使用しないペイロードのメソッドリクエストの動作](integration-passthrough-behaviors.md)」を参照してください。

1. テキストエディタに次のコードを入力します。

   ```
   {
       "TableName":"data-transformation-tutorial-console-ddb",
       "Item": {
           "id": {
               "N": $input.json("$.id")
           },
           "type": {
               "S": $input.json("$.type")
           },
           "price": {
               "N": $input.json("$.price")
           }
       }
   }
   ```

    このテンプレートでは、テーブルを `data-transformation-tutorial-console-ddb` として指定し、項目を `id`、`type`、`price` として設定します。項目は、`POST` メソッドの本体から取得されます。データモデルを使用してマッピングテンプレートを作成することもできます。詳細については、「[API Gateway での REST API のリクエスト検証](api-gateway-method-request-validation.md)」を参照してください。

1. **[保存]** ボタンを選択し、マッピングテンプレートを保存します。

**`POST` メソッドからメソッドと統合レスポンスを追加するには**

CloudFormation は、空白のメソッドと統合レスポンスを作成済みです。このレスポンスを編集して詳細情報を入力します。レスポンスの編集方法の詳細については、「[API Gateway での REST API パラメータマッピングの例](request-response-data-mappings.md)」を参照してください。

1. **[統合レスポンス]** タブの **[デフォルト - レスポンス]** で、**[編集]** を選択します。

1. **[マッピングテンプレート]**、**[マッピングテンプレートの追加]** の順に選択します。

1. **[コンテンツタイプ]** に「**application/json**」と入力します。

1. コードエディタで、次の出力マッピングテンプレートを入力し、出力メッセージを送信します。

   ```
   { "message" : "Your response was recorded at $context.requestTime" }
   ```

   コンテキスト変数の詳細については、「[データ変換のコンテキスト変数](api-gateway-mapping-template-reference.md#context-variable-reference)」を参照してください。

1. **[保存]** ボタンを選択し、マッピングテンプレートを保存します。

**`POST` メソッドをテストする**

**[テスト]** タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

1. リクエスト本文に、次の例を入力します。

   ```
   {
             "id": "4",
             "type" : "dog",
             "price": "321"
   }
   ```

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

   出力に成功メッセージが表示されるはずです。

    DynamoDB コンソール ([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)) を開いて、サンプル項目がテーブルにあることを確認できます。

**CloudFormation スタックを削除するには**

1. CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. CloudFormation スタックを選択します。

1. [**Delete**] (削除) を選択し、選択を確定します。

## AWS CLI を使用してデータ変換を設定する
<a name="mapping-example-cli"></a>

このチュートリアルでは、.zip ファイル ([data-transformation-tutorial-cli.zip](samples/data-transformation-tutorial-cli.zip)\$1 を使用して不完全な API と DynamoDB テーブルを作成します。この不完全な API には、`http://petstore-demo-endpoint.execute-api.com/petstore/pets` HTTP エンドポイントと統合された `GET` メソッドを持つ `/pets` リソースがあります。`POST` メソッドを作成して DynamoDB テーブルに接続し、マッピングテンプレートを使用して DynamoDB テーブルにデータを入力します。
+ 出力データは、[API Gateway での REST API のテンプレート変換のマッピング](models-mappings.md) のマッピングテンプレートに従って変換します。
+ `POST` メソッドを作成し、ユーザーがマッピングテンプレートを使用して Amazon DynamoDB テーブルにペット情報を `POST` できるようにします。

**CloudFormation スタックを作成するには**

[CloudFormation のアプリケーション作成テンプレート](samples/data-transformation-tutorial-cli.zip)をダウンロードして解凍します。

次のチュートリアルを完了するには、[AWS Command Line Interface (AWS CLI) バージョン 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) が必要です。

コマンドが長い場合は、エスケープ文字 (`\`) を使用してコマンドを複数行に分割します。
**注記**  
Windows では、一般的に使用する Bash CLI コマンドの一部 (`zip` など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、[Windows Subsystem for Linux をインストール](https://learn.microsoft.com/en-us/windows/wsl/install)します。このガイドの CLI コマンドの例では、Linux フォーマットを使用しています。Windows CLI を使用している場合、インライン JSON ドキュメントを含むコマンドを再フォーマットする必要があります。

1.  次のコマンドを使用して CloudFormation スタックを作成します。

   ```
   aws cloudformation create-stack --stack-name data-transformation-tutorial-cli --template-body file://data-transformation-tutorial-cli.zip --capabilities CAPABILITY_NAMED_IAM 
   ```

1. CloudFormation は、テンプレートで指定されたリソースをプロビジョニングします。リソースのプロビジョニングには数分かかることがあります。次のコマンドを使用して CloudFormation スタックのステータスを確認します。

   ```
   aws cloudformation describe-stacks --stack-name data-transformation-tutorial-cli
   ```

1. CloudFormation スタックのステータスが `StackStatus: "CREATE_COMPLETE"` になったら、次のコマンドを使用して関連する出力値を取得し、以後のステップで使用します。

   ```
    aws cloudformation describe-stacks --stack-name data-transformation-tutorial-cli --query "Stacks[*].Outputs[*].{OutputKey: OutputKey, OutputValue: OutputValue, Description: Description}"
   ```

   出力値は以下のとおりです。
   + ApiRole。API Gateway が DynamoDB テーブルに項目を配置できるようにするロールの名前です。このチュートリアルの場合、ロール名は `data-transformation-tutorial-cli-APIGatewayRole-ABCDEFG` です。
   + DDBTableName。DynamoDB テーブルの名前です。このチュートリアルの場合、インスタンス名は `data-transformation-tutorial-cli-ddb` です。
   + ResourceId。`GET` メソッドと `POST` メソッドを公開するペットリソースの ID です。このチュートリアルの場合、リソース ID は `efg456` です。
   + ApiId。API の ID です。このチュートリアルの場合、API の ID は `abc123` です。

**データ変換の前に `GET` メソッドをテストするには**
+ 次のコマンドを使用して、`GET` メソッドをテストします。

  ```
  aws apigateway test-invoke-method --rest-api-id abc123 \
            --resource-id efg456 \
            --http-method GET
  ```

  テストの出力には、次の内容が表示されます。

  ```
  [
    {
      "id": 1,
      "type": "dog",
      "price": 249.99
    },
    {
      "id": 2,
      "type": "cat",
      "price": 124.99
    },
    {
      "id": 3,
      "type": "fish",
      "price": 0.99
    }
  ]
  ```

  この出力を [API Gateway での REST API のテンプレート変換のマッピング](models-mappings.md) のマッピングテンプレートに従って変換します。

**`GET` 統合レスポンスを変換するには**
+ 次のコマンドを使用して、`GET` メソッドの統合レスポンスを更新します。*rest-api-id* と *resource-id* を実際の値に置き換えます。

  次のコマンドを使用して統合レスポンスを作成します。

  ```
  aws apigateway put-integration-response --rest-api-id abc123 \
    --resource-id efg456 \
    --http-method GET \
    --status-code 200 \
    --selection-pattern "" \
    --response-templates '{"application/json": "#set($inputRoot = $input.path(\"$\"))\n[\n#foreach($elem in $inputRoot)\n {\n  \"description\": \"Item $elem.id is a $elem.type\",\n  \"askingPrice\": \"$elem.price\"\n }#if($foreach.hasNext),#end\n\n#end\n]"}'
  ```

**`GET` メソッドをテストするには**
+ 次のコマンドを使用して `GET` メソッドをテストします。

  ```
  aws apigateway test-invoke-method --rest-api-id abc123 \
    --resource-id efg456 \
    --http-method GET \
  ```

  テストの出力に、変換されたレスポンスが表示されます。

  ```
  [
    {
      "description" : "Item 1 is a dog.",
      "askingPrice" : 249.99
    },
    {
      "description" : "Item 2 is a cat.",
      "askingPrice" : 124.99
    },
    {
      "description" : "Item 3 is a fish.",
      "askingPrice" : 0.99
    }
  ]
  ```

**`POST` メソッドを作成するには**

1. 次のコマンドを使用して、`/pets` リソースで新しいメソッドを作成します。

   ```
   aws apigateway put-method --rest-api-id abc123 \
     --resource-id efg456 \
     --http-method POST \
     --authorization-type "NONE" \
   ```

   このメソッドを使用すると、CloudFormation スタックで作成した DynamoDB テーブルにペット情報を送信できます。

1.  次のコマンドを使用して、`POST` メソッドで AWS のサービス統合を作成します。

   ```
   aws apigateway put-integration --rest-api-id abc123 \
     --resource-id efg456 \
     --http-method POST \
     --type AWS \
     --integration-http-method POST \
     --uri "arn:aws:apigateway:us-east-2:dynamodb:action/PutItem" \
     --credentials arn:aws:iam::111122223333:role/data-transformation-tutorial-cli-APIGatewayRole-ABCDEFG \
     --request-templates '{"application/json":"{\"TableName\":\"data-transformation-tutorial-cli-ddb\",\"Item\":{\"id\":{\"N\":$input.json(\"$.id\")},\"type\":{\"S\":$input.json(\"$.type\")},\"price\":{\"N\":$input.json(\"$.price\")} }}"}'
   ```

1.  次のコマンドを使用して、`POST` メソッドの呼び出しが成功した場合のメソッドレスポンスを作成します。

   ```
   aws apigateway put-method-response --rest-api-id abc123 \
     --resource-id efg456 \
     --http-method POST \
     --status-code 200
   ```

1. 次のコマンドを使用して、`POST` メソッドの呼び出しが成功した場合の統合レスポンスを作成します。

   ```
   aws apigateway put-integration-response --rest-api-id abc123 \
     --resource-id efg456 \
     --http-method POST \
     --status-code 200 \
     --selection-pattern "" \
     --response-templates '{"application/json": "{\"message\": \"Your response was recorded at $context.requestTime\"}"}'
   ```

**`POST` メソッドをテストするには**
+ 次のコマンドを使用して、`POST` メソッドをテストします。

  ```
  aws apigateway test-invoke-method --rest-api-id abc123 \
    --resource-id efg456 \
    --http-method POST \
    --body '{\"id\": \"4\", \"type\": \"dog\", \"price\": \"321\"}'
  ```

  出力に、成功のメッセージが表示されます。

**CloudFormation スタックを削除するには**
+ 次のコマンドを使用して CloudFormation リソースを削除します。

  ```
  aws cloudformation delete-stack  --stack-name data-transformation-tutorial-cli
  ```

## 完成したデータ変換の CloudFormation テンプレート
<a name="api-gateway-data-transformations-full-cfn-stack"></a>

次の例は、完成した CloudFormation テンプレートです。これにより、API と、`GET` メソッドと `POST` メソッドを持つ `/pets` リソースを作成します。
+ `GET` メソッドは、`http://petstore-demo-endpoint.execute-api.com/petstore/pets` HTTP エンドポイントからデータを取得します。出力データは、[API Gateway での REST API のテンプレート変換のマッピング](models-mappings.md) のマッピングテンプレートに従って変換されます。
+ `POST` メソッドを使用すると、ユーザーはマッピングテンプレートを使用して DynamoDB テーブルにペット情報を `POST` できます。

### CloudFormation テンプレートの例
<a name="mapping-template-cfn-example"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: A completed Amazon API Gateway REST API that uses non-proxy integration to POST to an Amazon DynamoDB table and non-proxy integration to GET transformed pets data.
Parameters:
  StageName:
    Type: String
    Default: v1
    Description: Name of API stage.
Resources:
  DynamoDBTable:
    Type: 'AWS::DynamoDB::Table'
    Properties:
      TableName: !Sub data-transformation-tutorial-complete
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: N
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 5
  APIGatewayRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Action:
              - 'sts:AssumeRole'
            Effect: Allow
            Principal:
              Service:
                - apigateway.amazonaws.com
      Policies:
        - PolicyName: APIGatewayDynamoDBPolicy
          PolicyDocument:
            Version: 2012-10-17		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - 'dynamodb:PutItem'
                Resource: !GetAtt DynamoDBTable.Arn
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: data-transformation-complete-api
      ApiKeySourceType: HEADER
  PetsResource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      RestApiId: !Ref Api
      ParentId: !GetAtt Api.RootResourceId
      PathPart: 'pets'
  PetsMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref PetsResource
      HttpMethod: GET
      ApiKeyRequired: false
      AuthorizationType: NONE
      Integration:
        Type: HTTP
        Credentials: !GetAtt APIGatewayRole.Arn
        IntegrationHttpMethod: GET
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/
        PassthroughBehavior: WHEN_NO_TEMPLATES
        IntegrationResponses:
          - StatusCode: '200'
            ResponseTemplates:
              application/json: "#set($inputRoot = $input.path(\"$\"))\n[\n#foreach($elem in $inputRoot)\n {\n  \"description\": \"Item $elem.id is a $elem.type\",\n  \"askingPrice\": \"$elem.price\"\n }#if($foreach.hasNext),#end\n\n#end\n]"
      MethodResponses:
        - StatusCode: '200'
  PetsMethodPost:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref PetsResource
      HttpMethod: POST
      ApiKeyRequired: false
      AuthorizationType: NONE
      Integration:
        Type: AWS
        Credentials: !GetAtt APIGatewayRole.Arn
        IntegrationHttpMethod: POST
        Uri: arn:aws:apigateway:us-west-1:dynamodb:action/PutItem
        PassthroughBehavior: NEVER
        RequestTemplates: 
          application/json: "{\"TableName\":\"data-transformation-tutorial-complete\",\"Item\":{\"id\":{\"N\":$input.json(\"$.id\")},\"type\":{\"S\":$input.json(\"$.type\")},\"price\":{\"N\":$input.json(\"$.price\")} }}"
        IntegrationResponses:
          - StatusCode: 200
            ResponseTemplates:
              application/json: "{\"message\": \"Your response was recorded at $context.requestTime\"}"
      MethodResponses:
        - StatusCode: '200'

  ApiDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn:
      - PetsMethodGet
    Properties:
      RestApiId: !Ref Api
      StageName: !Sub '${StageName}'
Outputs:
  ApiId:
    Description: API ID for CLI commands
    Value: !Ref Api
  ResourceId:
    Description: /pets resource ID for CLI commands
    Value: !Ref PetsResource
  ApiRole:
    Description: Role ID to allow API Gateway to put and scan items in DynamoDB table
    Value: !Ref APIGatewayRole
  DDBTableName:
    Description: DynamoDB table name
    Value: !Ref DynamoDBTable
```

# API Gateway のテンプレート変換のマッピングに変数を使用する例
<a name="api-gateway-mapping-variable-examples"></a>

以下の例は、マッピングテンプレートで `$context` 変数、`input` 変数、`util` 変数を使用する方法を説明しています。入力イベントを API Gateway に返すモック統合または Lambda 非プロキシ統合を使用できます。サポートされているデータ変換のすべての変数のリストについては、「[API Gateway のデータ変換の変数](api-gateway-mapping-template-reference.md)」を参照してください。

## 例 1: 統合エンドポイントに複数の `$context` 変数を渡す
<a name="context-variables-template-example"></a>

次の例は、統合リクエストペイロード内で、受信 `$context` 変数をわずかに異なる名前のバックエンド変数にマッピングするマッピングテンプレートを示しています。

```
{
    "stage" : "$context.stage",
    "request_id" : "$context.requestId",
    "api_id" : "$context.apiId",
    "resource_path" : "$context.resourcePath",
    "resource_id" : "$context.resourceId",
    "http_method" : "$context.httpMethod",
    "source_ip" : "$context.identity.sourceIp",
    "user-agent" : "$context.identity.userAgent",
    "account_id" : "$context.identity.accountId",
    "api_key" : "$context.identity.apiKey",
    "caller" : "$context.identity.caller",
    "user" : "$context.identity.user",
    "user_arn" : "$context.identity.userArn"
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{
  stage: 'prod',
  request_id: 'abcdefg-000-000-0000-abcdefg',
  api_id: 'abcd1234',
  resource_path: '/',
  resource_id: 'efg567',
  http_method: 'GET',
  source_ip: '192.0.2.1',
  user-agent: 'curl/7.84.0',
  account_id: '111122223333',
  api_key: 'MyTestKey',
  caller: 'ABCD-0000-12345',
  user: 'ABCD-0000-12345',
  user_arn: 'arn:aws:sts::111122223333:assumed-role/Admin/carlos-salazar'
}
```

変数の 1 つは API キーです。この例では、メソッドが 1 つの API キーを要求することを前提としています。

## 例 2: すべてのリクエストパラメータを JSON ペイロードを介して統合エンドポイントに渡す
<a name="input-examples-mapping-templates"></a>

次の例では、`path` パラメータ、`querystring` パラメータ、`header` パラメータを含むすべてのリクエストパラメータを JSON ペイロードを介して統合エンドポイントに渡します。

```
#set($allParams = $input.params())
{
  "params" : {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type" : {
      #foreach($paramName in $params.keySet())
      "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
      #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}
```

リクエストに次の入力パラメータがある場合:
+ `myparam` という名前のパスパラメータ
+ クエリ文字列パラメータ `querystring1=value1,value2`
+ ヘッダー `"header1" : "value1"`

このマッピングテンプレートの出力は、次のようになります。

```
{"params":{"path":{"example2":"myparamm"},"querystring":{"querystring1":"value1,value2"},"header":{"header1":"value1"}}}
```

## 例 3: メソッドリクエストのサブセクションを統合エンドポイントに渡す
<a name="input-example-json-mapping-template"></a>

 次の例では、入力パラメータ `name` を使用して、パラメータ `name` のみを取得し、入力パラメータ `input.json('$')` を使用してメソッドリクエスト本文全体を取得します。

```
{
    "name" : "$input.params('name')",
    "body" : $input.json('$') 
}
```

クエリ文字列パラメータ `name=Bella&type=dog` と次の本文を含むリクエストの場合:

```
{
    "Price" : "249.99",
    "Age": "6"
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{
    "name" : "Bella",
    "body" : {"Price":"249.99","Age":"6"}
}
```

このマッピングテンプレートは、クエリ文字列パラメータ `type=dog` を削除します。

 JSON の入力に JavaScript で解析できない文字がエスケープされずに含まれている場合、API Gateway は 400 レスポンスを返すことがあります。JSON の入力を正しく解析できるようにするには、`$util.escapeJavaScript($input.json('$'))` を適用します。

前の例に `$util.escapeJavaScript($input.json('$'))` を適用した結果は次のとおりです。

```
{
    "name" : "$input.params('name')",
    "body" : "$util.escapeJavaScript($input.json('$'))"
}
```

この場合、このマッピングテンプレートの出力は、次のようになります。

```
{
    "name" : "Bella",
    "body": {"Price":"249.99","Age":"6"}
}
```

## 例 4: JSONPath 式を使用してメソッドリクエストのサブセクションを統合エンドポイントに渡す
<a name="input-example-inputs-mapping-template"></a>

次の例では、JSONPath 式を使用して、リクエスト本文から入力パラメータ `name` と `Age` のみを取得します。

```
{
    "name" : "$input.params('name')",
    "body" : $input.json('$.Age')  
}
```

クエリ文字列パラメータ `name=Bella&type=dog` と次の本文を含むリクエストの場合:

```
{
    "Price" : "249.99",
    "Age": "6"
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{
    "name" : "Bella",
    "body" : "6"
}
```

このマッピングテンプレートは、クエリ文字列パラメータ `type=dog` と `Price` フィールドを本文から削除します。

 メソッドリクエストのペイロードに JavaScript で解析できない文字がエスケープされずに含まれている場合、API Gateway は `400` レスポンスを返すことがあります。JSON の入力を正しく解析できるようにするには、`$util.escapeJavaScript()` を適用します。

前の例に `$util.escapeJavaScript($input.json('$.Age'))` を適用した結果は次のとおりです。

```
{
    "name" : "$input.params('name')",
    "body" : "$util.escapeJavaScript($input.json('$.Age'))" 
}
```

この場合、このマッピングテンプレートの出力は、次のようになります。

```
{
    "name" : "Bella",
    "body": "\"6\""
}
```

## 例 5: JSONPath 式を使用してメソッドリクエストに関する情報を統合エンドポイントに渡す
<a name="input-example-request-and-response"></a>

次の例では、`$input.params()`、`$input.path()`、`$input.json()` を使用して、メソッドリクエストに関する情報を統合エンドポイントに送信します。このマッピングテンプレートは、`size()` メソッドを使用してリスト内の要素の数を提供します。

```
{
    "id" : "$input.params('id')",
    "count" : "$input.path('$.things').size()",
    "things" : $input.json('$.things')
}
```

パスパラメータ `123` と次の本文を含むリクエストの場合:

```
{
      "things": {
            "1": {},
            "2": {},
            "3": {}
      }
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{"id":"123","count":"3","things":{"1":{},"2":{},"3":{}}}
```

 メソッドリクエストのペイロードに JavaScript で解析できない文字がエスケープされずに含まれている場合、API Gateway は `400` レスポンスを返すことがあります。JSON の入力を正しく解析できるようにするには、`$util.escapeJavaScript()` を適用します。

前の例に `$util.escapeJavaScript($input.json('$.things'))` を適用した結果は次のとおりです。

```
{
     "id" : "$input.params('id')",
     "count" : "$input.path('$.things').size()",
     "things" : "$util.escapeJavaScript($input.json('$.things'))"
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{"id":"123","count":"3","things":"{\"1\":{},\"2\":{},\"3\":{}}"}
```

# API Gateway のデータ変換の変数
<a name="api-gateway-mapping-template-reference"></a>

パラメータマッピングを作成する場合、データソースとしてコンテキスト変数を使用できます。マッピングテンプレート変換を作成する場合、[Velocity Template Language (VTL)](https://velocity.apache.org/engine/devel/vtl-reference.html) で記述するスクリプトでコンテキスト変数、入力変数、util 変数を使用できます。これらの参照変数を使用するマッピングテンプレートの例については、「[API Gateway のテンプレート変換のマッピングに変数を使用する例](api-gateway-mapping-variable-examples.md)」を参照してください。

アクセスのログ記録の参照変数のリストについては、「[API Gateway のアクセスのログ記録のための変数](api-gateway-variables-for-access-logging.md)」を参照してください。

## データ変換のコンテキスト変数
<a name="context-variable-reference"></a>

データ変換には、次の大文字と小文字が区別される `$context` 変数を使用できます。


| パラメータ | 説明 | 
| --- | --- | 
| \$1context.accountId |  API 所有者の AWS アカウント ID。  | 
| \$1context.apiId |  API Gateway が API に割り当てる識別子。  | 
| \$1context.authorizer.claims.property |  メソッドの呼び出し側が認証に成功した後に Amazon Cognito ユーザープールから返されるクレームのプロパティ。詳細については、「[Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する](apigateway-integrate-with-cognito.md)」を参照してください。  `$context.authorizer.claims` を呼び出すと NULL が返されます。   | 
| \$1context.authorizer.principalId |  クライアントにより送信され、API Gateway Lambda オーソライザー (以前のカスタムオーソライザー) から返されたトークンと関連付けられたプリンシパルユーザー ID。詳細については、「[API Gateway Lambda オーソライザーを使用する](apigateway-use-lambda-authorizer.md)」を参照してください。  | 
| \$1context.authorizer.property |  API Gateway Lambda オーソライザーの関数から返された `context` マップの指定されたキー/値ペアの文字列化された値。たとえば、オーソライザーが次の `context` マップを返すとします。 <pre>"context" : {<br />  "key": "value",<br />  "numKey": 1,<br />  "boolKey": true<br />}</pre> `$context.authorizer.key` の呼び出しでは `"value"` 文字列が返され、`$context.authorizer.numKey` の呼び出しでは `"1"` 文字列が返され、`$context.authorizer.boolKey` の呼び出しでは `"true"` 文字列が返されます。 *プロパティ* でサポートされる特殊文字は、アンダースコア `(_)` 文字のみです。 詳細については、「[API Gateway Lambda オーソライザーを使用する](apigateway-use-lambda-authorizer.md)」を参照してください。  | 
| \$1context.awsEndpointRequestId |  AWS エンドポイントのリクエスト ID  | 
| \$1context.deploymentId | API デプロイの ID。 | 
| \$1context.domainName |  API の呼び出しに使用された完全ドメイン名。これは、受信 `Host` ヘッダーと同じである必要があります。  | 
| \$1context.domainPrefix |  `$context.domainName` の 1 つ目のラベル。  | 
| \$1context.error.message |  API Gateway のエラーメッセージを含む文字列。この変数は、Velocity Template Language エンジン、およびアクセスログ記録では処理されない、[GatewayResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html) 本文マッピングテンプレートの単純な変数の置換でのみ使用できます。詳細については、「[CloudWatch メトリクスを使用して WebSocket API の実行をモニタリングする](apigateway-websocket-api-logging.md)」および「[エラーレスポンスをカスタマイズするためのゲートウェイレスポンスのセットアップ](api-gateway-gatewayResponse-definition.md#customize-gateway-responses)」を参照してください。  | 
| \$1context.error.messageString | \$1context.error.message を引用符で囲んだ値、つまり "\$1context.error.message"。 | 
| \$1context.error.responseType |  [GatewayResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html) の [type](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html#responseType)。この変数は、Velocity Template Language エンジン、およびアクセスログ記録では処理されない、[GatewayResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html) 本文マッピングテンプレートの単純な変数の置換でのみ使用できます。詳細については、「[CloudWatch メトリクスを使用して WebSocket API の実行をモニタリングする](apigateway-websocket-api-logging.md)」および「[エラーレスポンスをカスタマイズするためのゲートウェイレスポンスのセットアップ](api-gateway-gatewayResponse-definition.md#customize-gateway-responses)」を参照してください。  | 
| \$1context.error.validationErrorString |  詳細な検証エラーメッセージを含む文字列。  | 
| \$1context.extendedRequestId | API Gateway が生成して API リクエストに割り当てる拡張 ID。拡張リクエスト ID には、デバッグとトラブルシューティングに役立つ情報が含まれています。 | 
| \$1context.httpMethod |  使用される HTTP メソッドです。有効な値には、`DELETE`、`GET`、`HEAD`、`OPTIONS`、`PATCH`、`POST` および `PUT` があります。  | 
| \$1context.identity.accountId |  リクエストに関連付けられた AWS アカウント ID です。  | 
| \$1context.identity.apiKey |  API キーを必要とする API メソッドの場合、この変数はメソッドリクエストに関連付けられている API キーです。API キーを必要としないメソッドの場合、この変数は null になります。詳細については、「[API Gateway での REST API の使用量プランと API キー](api-gateway-api-usage-plans.md)」を参照してください。  | 
| \$1context.identity.apiKeyId | API キーを必要とする API リクエストに関連付けられた API キー ID。 | 
| \$1context.identity.caller |  リクエストに署名した発信者のプリンシパル ID。IAM 認可を使用するリソースでサポートされています。  | 
| \$1context.identity.cognitoAuthenticationProvider |  リクエスト元の発信者が使用するすべての Amazon Cognito 認証プロバイダーのカンマ区切りのリスト。リクエストが Amazon Cognito 認証情報で署名されている場合にのみ使用できます。 たとえば、Amazon Cognito ユーザープールのアイデンティティの場合、`cognito-idp. region.amazonaws.com/user_pool_id,cognito-idp.region.amazonaws.com/user_pool_id:CognitoSignIn:token subject claim` 利用可能な Amazon Cognito 認証プロバイダーについては、「Amazon Cognito 開発者ガイド」の「[フェデレーティッド ID の使用](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html)」を参照してください。** | 
| \$1context.identity.cognitoAuthenticationType |  リクエストを行う発信者の Amazon Cognito 認証タイプ。リクエストが Amazon Cognito 認証情報で署名されている場合にのみ使用できます。有効な値は、認証されたアイデンティティ`authenticated`および認証されていないアイデンティティ`unauthenticated`です。 | 
| \$1context.identity.cognitoIdentityId |  リクエストを行う発信者の Amazon Cognito ID。リクエストが Amazon Cognito 認証情報で署名されている場合にのみ使用できます。  | 
| \$1context.identity.cognitoIdentityPoolId |  リクエストを行う発信者の Amazon Cognito ID プール ID。リクエストが Amazon Cognito 認証情報で署名されている場合にのみ使用できます。  | 
| \$1context.identity.principalOrgId |  [AWS 組織 ID](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_details.html)。  | 
| \$1context.identity.sourceIp |  API Gateway エンドポイントへのリクエストを行う即時 TCP 接続のソース IP アドレス。  | 
| \$1context.identity.clientCert.clientCertPem |  クライアントが相互 TLS 認証中に提示した PEM エンコードされたクライアント証明書。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。相互 TLS 認証が失敗した場合にのみ、アクセスログに存在します。  | 
| \$1context.identity.clientCert.subjectDN |  クライアントが提示する証明書のサブジェクトの識別名。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。相互 TLS 認証が失敗した場合にのみ、アクセスログに存在します。  | 
| \$1context.identity.clientCert.issuerDN |  クライアントが提示する証明書の発行者の識別名。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。相互 TLS 認証が失敗した場合にのみ、アクセスログに存在します。  | 
| \$1context.identity.clientCert.serialNumber |  証明書のシリアル番号。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。相互 TLS 認証が失敗した場合にのみ、アクセスログに存在します。  | 
| \$1context.identity.clientCert.validity.notBefore |  証明書が無効になる前の日付。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。相互 TLS 認証が失敗した場合にのみ、アクセスログに存在します。  | 
| \$1context.identity.clientCert.validity.notAfter |  証明書が無効になった日付。相互 TLS が有効なカスタムドメイン名を使用してクライアントが API にアクセスすると、アクセスログに存在します。相互 TLS 認証が失敗した場合にのみ、アクセスログに存在します。  | 
|  \$1context.identity.vpcId | API Gateway エンドポイントへのリクエストを行う VPC の VPC ID。 | 
|  \$1context.identity.vpceId |  API Gateway エンドポイントへのリクエストを行う VPC エンドポイントの VPC エンドポイント ID。プライベート API がある場合にのみ表示されます。  | 
| \$1context.identity.user |  リソースアクセスに対して許可されるユーザーのプリンシパル識別子。IAM 認可を使用するリソースでサポートされています。  | 
| \$1context.identity.userAgent |  API 発信者の [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent) ヘッダー。  | 
| \$1context.identity.userArn |  認証後に識別された有効ユーザーの Amazon リソースネーム (ARN) です。詳細については、「[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)」を参照してください。  | 
| \$1context.isCanaryRequest |  リクエストが canary に送信された場合は `true` を返し、リクエストが canary に送信されなかった場合は `false` を返します。canary が有効になっている場合にのみ表示されます。 | 
| \$1context.path | リクエストパス。たとえば、https://\$1rest-api-id\$1.execute-api.\$1region\$1.amazonaws.com/\$1stage\$1/root/child の非プロキシリクエスト URL の場合、\$1context.path 値は /\$1stage\$1/root/child。 | 
| \$1context.protocol | HTTP/1.1 などのリクエストプロトコル。 API Gateway API は HTTP/2 リクエストを受け入れることができますが、API Gateway は HTTP/1.1 を使用してバックエンド統合にリクエストを送信します。その結果、クライアントが HTTP/2 を使用するリクエストを送信した場合でも、リクエストプロトコルは HTTP/1.1 として記録されます。   | 
| \$1context.requestId |  リクエストの ID。クライアントは、このリクエスト ID を上書きできます。API Gateway が生成する一意のリクエスト ID に `$context.extendedRequestId` を使用します。  | 
| \$1context.requestOverride.header.header\$1name |  リクエストヘッダーオーバーライド。このパラメータが定義されている場合、[**Integration Request (統合リクエスト)**] ペインで定義されている [**HTTP Headers (HTTP ヘッダー)**] の代わりに使用されるヘッダーが含まれます。詳細については、「[API Gateway で REST API の API リクエストパラメータおよびレスポンスパラメータとステータスコードを上書きする](apigateway-override-request-response-parameters.md)」を参照してください。  | 
| \$1context.requestOverride.path.path\$1name |  リクエストパスオーバーライド。このパラメータが定義されている場合、[**Integration Request (統合リクエスト)**] ペインで定義されている [**URL Path Parameters (URL パスパラメータ)**] の代わりに使用されるリクエストパスが含まれます。詳細については、「[API Gateway で REST API の API リクエストパラメータおよびレスポンスパラメータとステータスコードを上書きする](apigateway-override-request-response-parameters.md)」を参照してください。  | 
| \$1context.requestOverride.querystring.querystring\$1name |  リクエストクエリ文字列オーバーライド。このパラメータが定義されている場合、[**Integration Request (統合リクエスト)**] ペインで定義されている [**URL Query String Parameters (URL クエリ文字列パラメータ)**] の代わりに使用されるリクエストクエリ文字列が含まれます。詳細については、「[API Gateway で REST API の API リクエストパラメータおよびレスポンスパラメータとステータスコードを上書きする](apigateway-override-request-response-parameters.md)」を参照してください。  | 
| \$1context.responseOverride.header.header\$1name | レスポンスヘッダーオーバーライド。このパラメータが定義されている場合、[Integration Response (統合レスポンス)] ペインの [Default mapping (デフォルトのマッピング)] として定義されている [Response header (レスポンスヘッダー)] の代わりに返されるヘッダーが含まれます。詳細については、「[API Gateway で REST API の API リクエストパラメータおよびレスポンスパラメータとステータスコードを上書きする](apigateway-override-request-response-parameters.md)」を参照してください。 | 
| \$1context.responseOverride.status | レスポンスステータスコードオーバーライド。このパラメータが定義されている場合、[Integration Response (統合レスポンス)] ペインの [Default mapping (デフォルトのマッピング)] として定義されている [Method response status (メソッドレスポンスのステータス)] の代わりに返されるステータスコードが含まれます。詳細については、「[API Gateway で REST API の API リクエストパラメータおよびレスポンスパラメータとステータスコードを上書きする](apigateway-override-request-response-parameters.md)」を参照してください。 | 
| \$1context.requestTime | [CLF](https://httpd.apache.org/docs/current/logs.html#common) 形式の要求時間 (dd/MMM/yyyy:HH:mm:ss \$1-hhmm)。 | 
| \$1context.requestTimeEpoch | [エポック](https://en.wikipedia.org/wiki/Unix_time)形式のリクエスト時間 (ミリ秒単位)。 | 
| \$1context.resourceId |  API Gateway がリソースに割り当てる識別子です。  | 
| \$1context.resourcePath |  リソースへのパスです。たとえば、`https://{rest-api-id}.execute-api.{region}.amazonaws.com/{stage}/root/child` の非プロキシリクエスト URI の場合、`$context.resourcePath` 値は `/root/child`。詳細については、「[チュートリアル: HTTP 非プロキシ統合を使用して REST API を作成する](api-gateway-create-api-step-by-step.md)」を参照してください。  | 
| \$1context.stage |  API リクエストのデプロイステージ (`Beta`、`Prod` など)。  | 
| \$1context.wafResponseCode |  [AWS WAF](https://docs.aws.amazon.com/waf/latest/developerguide/waf-chapter.html) から受け取ったレスポンス: `WAF_ALLOW` または `WAF_BLOCK`。ステージがウェブ ACL に関連付けられていない場合は、設定されません。詳細については、「[AWS WAF を使用して API Gateway の REST API を保護する](apigateway-control-access-aws-waf.md)」を参照してください。  | 
| \$1context.webaclArn |  リクエストを許可するかブロックするかを決定するために使用されるウェブ ACL の完全な ARN。ステージがウェブ ACL に関連付けられていない場合は、設定されません。詳細については、「[AWS WAF を使用して API Gateway の REST API を保護する](apigateway-control-access-aws-waf.md)」を参照してください。  | 

## 入力変数
<a name="input-variable-reference"></a>

次の大文字と小文字が区別される `$input` 変数を使用して、メソッドリクエストペイロードとメソッドリクエストパラメータを参照できます。以下の機能を使用できます。


| 変数と関数 | 説明 | 
| --- | --- | 
| \$1input.body |  文字列として raw リクエストペイロードを返します。`$input.body` を使用して、浮動小数点数全体 (`10.00` など) を保持できます。 | 
| \$1input.json(x) | この関数は、JSONPath の式を評価し、結果を JSON 文字列で返します。 たとえば `$input.json('$.pets')` は、`pets` 構造を表す JSON 文字列を返します。 JSONPath の詳細については、[JSONPath](https://goessner.net/articles/JsonPath/) または [JSONPath for Java](https://github.com/json-path/JsonPath) を参照してください。 | 
| \$1input.params() |  すべてのリクエストパラメータのマップを返します。インジェクション攻撃の可能性を避けるため、`$util.escapeJavaScript` を使用して結果をサニタイズすることをお勧めします。リクエストのサニタイズを完全に制御するには、テンプレートなしでプロキシ統合を使用し、統合でリクエストのサニタイズを処理します。 | 
| \$1input.params(x) | パラメータ名文字列 `x` が指定された場合に、パス、クエリ文字列、またはヘッダー値から (この順番で検索される) メソッドリクエストパラメータの値を返します。インジェクション攻撃の可能性を避けるため、`$util.escapeJavaScript` を使用してパラメータをサニタイズすることをお勧めします。パラメータのサニタイズを完全に制御するには、テンプレートなしでプロキシ統合を使用し、統合でリクエストのサニタイズを処理します。 | 
| \$1input.path(x) | JSONPath 式文字列 (`x`) を受け取り、結果の JSON オブジェクト表現を返します。これにより、[Apache Velocity Template Language (VTL)](https://velocity.apache.org/engine/devel/vtl-reference.html) でペイロード要素にネイティブにアクセスして操作できます。 たとえば、式 `$input.path('$.pets')` が次のようにオブジェクトを返すとします。 <pre>[<br />  { <br />    "id": 1, <br />    "type": "dog", <br />    "price": 249.99 <br />  }, <br />  { <br />    "id": 2, <br />    "type": "cat", <br />    "price": 124.99 <br />  }, <br />  { <br />    "id": 3, <br />    "type": "fish", <br />    "price": 0.99 <br />  } <br />]</pre> `$input.path('$.pets').size()` は を返します。`"3"` JSONPath の詳細については、[JSONPath](https://goessner.net/articles/JsonPath/) または [JSONPath for Java](https://github.com/json-path/JsonPath) を参照してください。 | 

## ステージ変数
<a name="stagevariables-template-reference"></a>

メソッド統合では、次のステージ変数を ARN と URL のプレースホルダーとして使用できます。詳細については、「[API Gateway で REST API のステージ変数を使用する](stage-variables.md)」を参照してください。


| 構文 | 説明 | 
| --- | --- | 
| \$1stageVariables.variable\$1name, \$1stageVariables['variable\$1name'], または \$1\$1stageVariables['variable\$1name']\$1  |  *variable\$1name* はステージ変数名を表します。  | 

## Util 変数
<a name="util-template-reference"></a>

マッピングテンプレートのユーティリティ関数を使用するには、次の大文字と小文字が区別される `$util` 変数を使用できます。別に指定されていない限り、デフォルトの文字は UTF-8 に設定されます。


| 関数 | 説明 | 
| --- | --- | 
| \$1util.escapeJavaScript() |  JavaScript 文字列ルールを使用して文字列内の文字をエスケープします。  この関数は、通常の一重引用符 (`'`) をエスケープした一重引用符 (`\'`) に変換します。ただし、エスケープした一重引用符は JSON で有効ではありません。したがって、この関数からの出力を JSON のプロパティで使用する場合、エスケープした一重引用符 (`\'`) を通常の一重引用符 (`'`) に戻す必要があります。これを次の例で示します:  <pre> "input" : "$util.escapeJavaScript(data).replaceAll("\\'","'")"</pre>   | 
| \$1util.parseJson() |   "stringified" JSON を受け取り、結果のオブジェクト表現を返します。この関数の結果を使用して、Apache Velocity Template Language (VTL) でペイロード要素にネイティブにアクセスしてこれらの要素を操作できるようになります。たとえば、次のペイロードがあるとします。 <pre>{"errorMessage":"{\"key1\":\"var1\",\"key2\":{\"arr\":[1,2,3]}}"}</pre>  さらに、次のマッピングテンプレートを使用するとします。 <pre>#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage')))<br />{<br />   "errorMessageObjKey2ArrVal" : $errorMessageObj.key2.arr[0]<br />}<br /></pre> この場合、次の出力が返されます。 <pre>{<br />   "errorMessageObjKey2ArrVal" : 1<br />}<br /></pre>  | 
| \$1util.urlEncode() | 文字列を「application/x-www-form-urlencoded」形式に変換します。 | 
| \$1util.urlDecode() | 「application/x-www-form-urlencoded」文字列をデコードします。 | 
| \$1util.base64Encode() | データを base64 エンコードされた文字列にエンコードします。 | 
| \$1util.base64Decode() | base64 エンコードされた文字列からデータをデコードします。 | 

# API Gateway での REST API のゲートウェイレスポンス
<a name="api-gateway-gatewayResponse-definition"></a>

 ゲートウェイレスポンスは、API Gateway によって定義されたレスポンスタイプで識別されます。レスポンスは、HTTP ステータスコード、パラメータマッピングで指定される追加のヘッダーのセット、および [VTL](https://velocity.apache.org/engine/devel/vtl-reference.html) 以外のマッピングテンプレートで生成されるペイロードで構成されます。

 API Gateway REST API では、ゲートウェイレスポンスは [GatewayResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html) によって表されます。OpenAPI では、`GatewayResponse` インスタンスは [x-amazon-apigateway-gateway-responses.gatewayResponse](api-gateway-swagger-extensions-gateway-responses.gatewayResponse.md) 拡張子で記述されます。

ゲートウェイレスポンスを有効にするには、API レベルで[サポートされているレスポンスタイプ](supported-gateway-response-types.md)のゲートウェイレスポンスを設定します。API Gateway からこのタイプのレスポンスが返されるたびに、ゲートウェイレスポンスに定義されているヘッダーマッピングとペイロードマッピングテンプレートに適用されてマッピングされた結果が API 発信者に返されます。

 次のセクションでは、API Gateway コンソールと API Gateway REST API を使用してゲートウェイレスポンスを設定する方法を示します。

## エラーレスポンスをカスタマイズするためのゲートウェイレスポンスのセットアップ
<a name="customize-gateway-responses"></a>

API Gateway は、受信リクエストを処理できない場合、統合バックエンドにリクエストを転送せずにクライアントにエラーレスポンスを返します。デフォルトでは、エラーレスポンスにエラーを説明する短いメッセージが含まれます。たとえば、未定義の API リソースに対してオペレーションを呼び出そうとすると、`{ "message": "Missing Authentication Token" }` というメッセージが含まれたエラーレスポンスが返されます。API Gateway に慣れていないユーザーには、メッセージの意味がわかりにくい場合があります。

 一部のエラーレスポンスについては、API デベロッパーがカスタマイズして異なる形式で返すことが API Gateway で許可されています。たとえば、`Missing Authentication Token` の場合は、次の例に示すように、元のレスポンスペイロードにヒントを追加し、考えられる原因を説明できます: `{"message":"Missing Authentication Token", "hint":"The HTTP method or resources may not be supported."}`。

 API が外部交換と AWS クラウドの間を仲介する場合は、統合リクエストまたは統合レスポンスの VTL マッピングテンプレートを使用して、ペイロードを 1 つの形式から別の形式にマッピングします。ただし、VTL マッピングテンプレートはレスポンスが正常に返される有効なリクエストに対してのみ使用できます。

無効なリクエストに対しては、API Gateway は統合を完全にバイパスしてエラーレスポンスを返します。エラーレスポンスを交換に準拠した形式にするには、カスタマイズを使用する必要があります。カスタマイズは、単純な変数の置換のみをサポートする VTL 以外のマッピングテンプレートでレンダリングされます。

 API Gateway で生成されたエラーレスポンスを API Gateway で生成される任意のレスポンスに一般化したものは、*ゲートウェイレスポンス*と呼ばれます。これにより、API Gateway で生成されたレスポンスは統合レスポンスから区別されます。ゲートウェイレスポンスのマッピングテンプレートは、`$context` 変数の値と `$stageVariables` プロパティの値にアクセスできます。また、`method.request.param-position.param-name` 形式のメソッドリクエストのパラメータにもアクセスできます。

`$context` 変数の詳細については、「[データ変換のコンテキスト変数](api-gateway-mapping-template-reference.md#context-variable-reference)」を参照してください。の詳細については、「`$stageVariables`」を参照してください。[ステージ変数](api-gateway-mapping-template-reference.md#stagevariables-template-reference)。メソッドリクエストパラメータの詳細については、「[入力変数](api-gateway-mapping-template-reference.md#input-variable-reference)」を参照してください。

**Topics**
+ [

## エラーレスポンスをカスタマイズするためのゲートウェイレスポンスのセットアップ
](#customize-gateway-responses)
+ [

# API Gateway コンソールを使用して REST API のゲートウェイレスポンスをセットアップする
](set-up-gateway-response-using-the-console.md)
+ [

# API Gateway REST API を使用してゲートウェイレスポンスを設定する
](set-up-gateway-response-using-the-api.md)
+ [

# OpenAPI でゲートウェイレスポンスのカスタマイズを設定する
](set-up-gateway-responses-in-swagger.md)
+ [

# API Gateway でのゲートウェイレスポンスタイプ
](supported-gateway-response-types.md)

# API Gateway コンソールを使用して REST API のゲートウェイレスポンスをセットアップする
<a name="set-up-gateway-response-using-the-console"></a>

次の例は、API Gateway コンソールを使用して REST API のゲートウェイレスポンスをセットアップする方法を示しています。

**API Gateway コンソールを使用してゲートウェイレスポンスをカスタマイズするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. メインナビゲーションペインで、**[ゲートウェイレスポンス]** を選択します。

1. レスポンスタイプを選択し、**[編集]** を選択します。このチュートリアルでは、**[認証トークンが見つかりません]** を例として使用します。

1. API Gateway で生成された **[ステータスコード]** を変更し、API の要件を満たす別のステータスコードを返すことができます。この例では、カスタマイズにより、ステータスコードがデフォルト値 (`403`) から `404` に変更されます。これは、見つからないと見なすことができるサポートされていないリソースや無効なリソースをクライアントが呼び出したときに、このエラーメッセージが発生するためです。

1. カスタムヘッダーを返すには、**[レスポンスヘッダー]** で **[ヘッダーの追加]** を選択します。例として、以下のカスタムヘッダーを追加します。

   ```
   Access-Control-Allow-Origin:'a.b.c'
   x-request-id:method.request.header.x-amzn-RequestId
   x-request-path:method.request.path.petId
   x-request-query:method.request.querystring.q
   ```

   前述のヘッダーマッピングで、静的ドメイン名 (`'a.b.c'`) は `Allow-Control-Allow-Origin` ヘッダーにマッピングされて、CORS から API へのアクセスが許可されます。`x-amzn-RequestId` パス変数はレスポンスの `request-id` にマッピングされます。受信リクエストの `petId` パス変数はレスポンスの `request-path` ヘッダーにマッピングされます。元のリクエストの `q` クエリパラメータはレスポンスの `request-query` ヘッダーにマッピングされます。

1. **[レスポンステンプレート]** で、**[コンテンツタイプ]** を `application/json` にしたまま、**[テンプレートの本文]** エディタに次の本文マッピングテンプレートを入力します。

   ```
   {
        "message":"$context.error.messageString",
        "type": "$context.error.responseType",
        "statusCode": "'404'",
        "stage": "$context.stage",
        "resourcePath": "$context.resourcePath",
        "stageVariables.a": "$stageVariables.a"
   }
   ```

   この例では、`$context` プロパティと `$stageVariables` プロパティを、ゲートウェイレスポンス本文のプロパティにマッピングする方法を示しています。

1. **[Save changes]** (変更の保存) をクリックします。

1. 新規または既存のステージに API をデプロイします。

該当する API メソッドの呼び出し URL は `https://o81lxisefl.execute-api.us-east-1.amazonaws.com/custErr/pets/{petId}` であると仮定して、次の CURL コマンドを呼び出してゲートウェイレスポンスをテストします。

```
curl -v -H 'x-amzn-RequestId:123344566' https://o81lxisefl.execute-api.us-east-1.amazonaws.com/custErr/pets/5/type?q=1
```

追加のクエリ文字列パラメータ `q=1` は、API と互換性がないため、指定したゲートウェイレスポンスからエラーが返されます。次のようなゲートウェイレスポンスが返されます。

```
> GET /custErr/pets/5?q=1 HTTP/1.1
Host: o81lxisefl.execute-api.us-east-1.amazonaws.com
User-Agent: curl/7.51.0
Accept: */*
 
HTTP/1.1 404 Not Found
Content-Type: application/json
Content-Length: 334
Connection: keep-alive
Date: Tue, 02 May 2017 03:15:47 GMT
x-amzn-RequestId: 123344566
Access-Control-Allow-Origin: a.b.c
x-amzn-ErrorType: MissingAuthenticationTokenException
header-1: static
x-request-query: 1
x-request-path: 5
X-Cache: Error from cloudfront
Via: 1.1 441811a054e8d055b893175754efd0c3.cloudfront.net (CloudFront)
X-Amz-Cf-Id: nNDR-fX4csbRoAgtQJ16u0rTDz9FZWT-Mk93KgoxnfzDlTUh3flmzA==
 
{
     "message":"Missing Authentication Token",
     "type": MISSING_AUTHENTICATION_TOKEN,
     "statusCode": '404',
     "stage": custErr,
     "resourcePath": /pets/{petId},
     "stageVariables.a": a
}
```

前述の例では、API バックエンドが [Pet Store](http://petstore-demo-endpoint.execute-api.com/petstore/pets) であること、さらに API にステージ変数 `a` が定義されていることを前提としています。

# API Gateway REST API を使用してゲートウェイレスポンスを設定する
<a name="set-up-gateway-response-using-the-api"></a>

 API Gateway REST API を使用してゲートウェイレスポンスをカスタマイズする前に、API が作成済みで、その識別子を取得済みであることが必要です。API 識別子を取得するには、[restapi:gateway-responses](https://docs.aws.amazon.com/apigateway/latest/api/API_GetGatewayResponses.html) リンクリレーションに従い、その結果を確認します。

**API Gateway REST API を使用してゲートウェイレスポンスをカスタマイズするには**

1. [ゲートウェイレスポンス](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html)インスタンス全体を上書きするには、[gatewayresponse:put](https://docs.aws.amazon.com/apigateway/latest/api/API_PutGatewayResponse.html) アクションを呼び出します。URL パスパラメータで目的の [responseType](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html#responseType) を指定し、リクエストペイロードに [statusCode](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html#statusCode)、[responseParameters](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html#responseParameters)、および [responseTemplates](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html#responseTemplates) マッピングを指定します。

1. `GatewayResponse` インスタンスの一部を更新するには、[gatewayresponse:update](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateGatewayResponse.html) アクションを呼び出します。URL パラメータに `responseType` を指定し、リクエストペイロードに、たとえば `GatewayResponse` や `responseParameters` マッピングなど、必要な個々の `responseTemplates` プロパティを指定します。

# OpenAPI でゲートウェイレスポンスのカスタマイズを設定する
<a name="set-up-gateway-responses-in-swagger"></a>

 API ルートレベルで `x-amazon-apigateway-gateway-responses` 拡張子を使用し、OpenAPI でゲートウェイレスポンスをカスタマイズできます。次の OpenAPI の定義は、`MISSING_AUTHENTICATION_TOKEN` タイプの [GatewayResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_GatewayResponse.html) をカスタマイズする例を示しています。

```
  "x-amazon-apigateway-gateway-responses": {
    "MISSING_AUTHENTICATION_TOKEN": {
      "statusCode": 404,
      "responseParameters": {
        "gatewayresponse.header.x-request-path": "method.input.params.petId",
        "gatewayresponse.header.x-request-query": "method.input.params.q",
        "gatewayresponse.header.Access-Control-Allow-Origin": "'a.b.c'",
        "gatewayresponse.header.x-request-header": "method.input.params.Accept"
      },
      "responseTemplates": {
        "application/json": "{\n     \"message\": $context.error.messageString,\n     \"type\":  \"$context.error.responseType\",\n     \"stage\":  \"$context.stage\",\n     \"resourcePath\":  \"$context.resourcePath\",\n     \"stageVariables.a\":  \"$stageVariables.a\",\n     \"statusCode\": \"'404'\"\n}"
      }
    }
```

この例では、カスタマイズによってステータスコードをデフォルト (`403`) から `404` に変更します。また、ゲートウェイレスポンスに 4 つのヘッダーパラメータと、`application/json` メディアタイプの 1 つの本文マッピングテンプレートを追加します。

# API Gateway でのゲートウェイレスポンスタイプ
<a name="supported-gateway-response-types"></a>

 API Gateway では、API デベロッパーがカスタマイズできる以下のゲートウェイレスポンスを公開しています。


| ゲートウェイレスポンスのタイプ | デフォルトのステータスコード | 説明 | 
| --- | --- | --- | 
| ACCESS\$1DENIED | 403 | 認可が失敗した場合のゲートウェイレスポンス—たとえば、カスタムまたは Amazon Cognito オーソライザーによってアクセスが拒否された場合などが該当します。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| API\$1CONFIGURATION\$1ERROR | 500 | API 設定が無効な場合のゲートウェイレスポンス — たとえば、無効なエンドポイントアドレスが送信された場合、バイナリサポートが有効になっているときにバイナリデータに対する Base64 デコーディングが失敗した場合、統合レスポンスマッピングがいずれのテンプレートとも一致せず、デフォルトテンプレートも設定されていない場合などが該当します。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_5XX` タイプになります。 | 
| AUTHORIZER\$1CONFIGURATION\$1ERROR | 500 | カスタムまたは Amazon Cognito オーソライザーへの接続が失敗した場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_5XX` タイプになります。 | 
| AUTHORIZER\$1FAILURE | 500 | カスタムまたは Amazon Cognito オーソライザーが発信者の認証に失敗した場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_5XX` タイプになります。 | 
| BAD\$1REQUEST\$1PARAMETERS | 400 | 有効になっているリクエストの検証に基づいてリクエストパラメータを検証できない場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| BAD\$1REQUEST\$1BODY | 400 | 有効になっているリクエストの検証に基づいてリクエストボディを検証できない場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| DEFAULT\$14XX |  Null | レスポンスタイプが未指定で、ステータスコードが `4XX` のデフォルトのゲートウェイレスポンス。このフォールバックゲートウェイレスポンスのステータスコードを変更すると、他のすべての `4XX` レスポンスのステータスコードが新しい値に変更されます。このステータスコードを null にリセットすると、他のすべての `4XX` レスポンスのステータスコードが元の値に戻ります。  [AWS WAF カスタムレスポンス](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html)は、カスタムゲートウェイレスポンスよりも優先されます。   | 
| DEFAULT\$15XX | Null | レスポンスタイプが未指定で、ステータスコードが `5XX` のデフォルトのゲートウェイレスポンス。このフォールバックゲートウェイレスポンスのステータスコードを変更すると、他のすべての `5XX` レスポンスのステータスコードが新しい値に変更されます。このステータスコードを null にリセットすると、他のすべての `5XX` レスポンスのステータスコードが元の値に戻ります。 | 
| EXPIRED\$1TOKEN | 403 | AWS 認証トークンの有効期限が切れた場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| INTEGRATION\$1FAILURE | 504 | 統合が失敗した場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_5XX` タイプになります。 | 
| INTEGRATION\$1TIMEOUT | 504 | 統合がタイムアウトした場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_5XX` タイプになります。 | 
| INVALID\$1API\$1KEY | 403 | API キーを必要としているメソッドに対して無効な API キーが送信された場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| INVALID\$1SIGNATURE | 403 | AWS 署名が無効な場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| MISSING\$1AUTHENTICATION\$1TOKEN | 403 | 認証トークンが見つからない場合のゲートウェイレスポンス。サポートされていない API メソッドやリソースをクライアントが呼び出そうとした場合などが該当します。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| QUOTA\$1EXCEEDED | 429 | 使用量プランのクォータが超過した場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| REQUEST\$1TOO\$1LARGE | 413 | リクエストが大きすぎる場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `HTTP content length exceeded 10485760 bytes` になります。 | 
| RESOURCE\$1NOT\$1FOUND | 404 | API リクエストが認証および認可 (API キー認証および認可を除く) に合格した後で、指定されたリソースを API Gateway で見つけることができない場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| THROTTLED | 429 | 使用量プランレベル、メソッドレベル、ステージレベル、またはアカウントレベルのスロットリング制限を超えた場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| UNAUTHORIZED | 401 | カスタムまたは Amazon Cognito オーソライザーが発信者の認証に失敗した場合のゲートウェイレスポンス。 | 
| UNSUPPORTED\$1MEDIA\$1TYPE | 415 | 厳格なパススルー動作が有効になっているときに、ペイロードがサポートされていないメディアタイプである場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。 | 
| WAF\$1FILTERED | 403 | リクエストが AWS WAF によってブロックされた場合のゲートウェイレスポンス。レスポンスタイプが未指定の場合、このレスポンスはデフォルトで `DEFAULT_4XX` タイプになります。  [AWS WAF カスタムレスポンス](https://docs.aws.amazon.com/waf/latest/developerguide/waf-custom-request-response.html)は、カスタムゲートウェイレスポンスよりも優先されます。   | 

# API Gateway での REST API の CORS
<a name="how-to-cors"></a>

[Cross-origin resource sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) は、ブラウザで実行されているスクリプトから開始されるクロスオリジン HTTP リクエストを制限するブラウザのセキュリティ機能です。詳細については、「[CORS とは](https://aws.amazon.com/what-is/cross-origin-resource-sharing/)」を参照してください。

## CORS サポートを有効にするかどうかを決定する
<a name="apigateway-cors-request-types"></a>

*クロスオリジン* HTTP リクエストは、以下に対して行われます。
+ 別の*ドメイン* (例: `example.com` から `amazondomains.com` へ)
+ 別の*サブドメイン* (例: `example.com` から `petstore.example.com` へ)
+ 別の*ポート* (例: `example.com` から `example.com:10777` へ)
+ 別の*プロトコル* (例: `https://example.com` から `http://example.com` へ)

 API にアクセスできず、`Cross-Origin Request Blocked` を含むエラーメッセージが表示される場合は、CORS を有効にする必要がある場合があります。

クロスオリジン HTTP リクエストは、*シンプルな*リクエスト、および*シンプルではない*リクエストの 2 種類に分類できます。

## シンプルなリクエストの CORS を有効にする
<a name="apigateway-cors-simple-request"></a>

以下の条件がすべて当てはまる場合、HTTP リクエストは*シンプル*です。
+ `GET`、`HEAD`、および `POST` のリクエストのみを許可する API リソースに対して発行されます。
+ それが `POST` メソッドリクエストの場合、`Origin` ヘッダーを含める必要があります。
+ リクエストのペイロードコンテンツタイプが `text/plain`、`multipart/form-data`、または `application/x-www-form-urlencoded` の場合。
+ リクエストにカスタムヘッダーが含まれていません。
+ [シンプルなリクエストに関する Mozilla CORS のドキュメント](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests)に一覧表示されている追加要件。

シンプルなクロスオリジンの `POST` メソッドリクエストの場合、リソースからのレスポンスにはヘッダー `Access-Control-Allow-Origin: '*'` または `Access-Control-Allow-Origin:'origin'` を含める必要があります。

他のすべてのクロスオリジン HTTP リクエストは*シンプルではない*リクエストです。

## シンプルではないリクエストの CORS を有効にする
<a name="apigateway-enable-cors-non-simple"></a>

API のリソースがシンプルではないリクエストを受け取った場合は、統合タイプに応じて追加の CORS サポートを有効にする必要があります。

### 非プロキシ統合の CORS を有効にする
<a name="apigateway-enable-cors-mock"></a>

これらの統合の場合、[CORS プロトコル](https://fetch.spec.whatwg.org/#http-cors-protocol)は、実際のリクエストを送信する前に、ブラウザからサーバーにプリフライトリクエストを送信し、サーバーからの承認 (または認証情報のリクエスト) を待つことを要求します。プリフライトリクエストに適切なレスポンスを送信するように API を設定する必要があります。

 プリフライトレスポンスを作成するには 

1. モック統合の `OPTIONS` メソッドを作成します。

1. 以下のレスポンスヘッダーを 200 メソッドレスポンスに追加します。
   + `Access-Control-Allow-Headers`
   + `Access-Control-Allow-Methods`
   + `Access-Control-Allow-Origin`

1. 統合パススルーの動作を `NEVER` に設定します。この場合、マッピングされていないコンテンツタイプのメソッドリクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。詳細については、「[API Gateway で REST API のマッピングテンプレートを使用しないペイロードのメソッドリクエストの動作](integration-passthrough-behaviors.md)」を参照してください。

1. レスポンスヘッダーの値を入力します。すべてのオリジン、すべてのメソッド、および共通のヘッダーを許可するには、以下のヘッダー値を使用します。
   + `Access-Control-Allow-Headers: 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'`
   + `Access-Control-Allow-Methods: 'DELETE,GET,HEAD,OPTIONS,PUT,POST,PATCH'`
   + `Access-Control-Allow-Origin: '*'`

プリフライトリクエストを作成したら、少なくとも 200 個すべてのレスポンスに対して、すべての CORS 対応メソッドの `Access-Control-Allow-Origin: '*'` ヘッダーまたは `Access-Control-Allow-Origin:'origin'` ヘッダーを返す必要があります。

### AWS マネジメントコンソールを使用して非プロキシ統合の CORS を有効にする
<a name="apigateway-enable-cors-mock-console"></a>

AWS マネジメントコンソールを使用して CORS を有効にすることができます。API Gateway は、`OPTIONS` メソッドを作成し、`Access-Control-Allow-Origin` ヘッダーを既存のメソッド統合レスポンスに追加します。これは常に機能するとは限りません。場合によっては、少なくとも 200 個すべてのレスポンスに対して、すべての CORS 対応メソッドの `Access-Control-Allow-Origin` ヘッダーを返すように統合レスポンスを手動で変更する必要があります。

API のバイナリメディアタイプが `*/*` に設定されている場合は、API Gateway が `OPTIONS` メソッドを作成するときに、`contentHandling` を `CONVERT_TO_TEXT` に変更します。

次の [update-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-integration.html) コマンドは、統合リクエストの `contentHandling` を `CONVERT_TO_TEXT` に変更します。

```
aws apigateway update-integration \
  --rest-api-id abc123 \
  --resource-id aaa111 \
  --http-method OPTIONS \
  --patch-operations op='replace',path='/contentHandling',value='CONVERT_TO_TEXT'
```

次の [update-integration-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-integration-response.html) コマンドは、統合レスポンスの `contentHandling` を `CONVERT_TO_TEXT` に変更します。

```
aws apigateway update-integration-response \
  --rest-api-id abc123 \
  --resource-id aaa111 \
  --http-method OPTIONS \
  --status-code 200 \
  --patch-operations op='replace',path='/contentHandling',value='CONVERT_TO_TEXT'
```

## プロキシ統合の CORS サポートを有効にする
<a name="apigateway-enable-cors-proxy"></a>

Lambda プロキシ統合または HTTP プロキシ統合の場合、プロキシ統合は統合レスポンスを返さないため、バックエンドが `Access-Control-Allow-Origin` ヘッダー、`Access-Control-Allow-Methods` ヘッダー、`Access-Control-Allow-Headers` ヘッダーを返す必要があります。

以下の Lambda 関数の例は、必要な CORS ヘッダーを返します。

------
#### [ Node.js ]

```
export const handler = async (event) => {
    const response = {
        statusCode: 200,
        headers: {
            "Access-Control-Allow-Headers" : "Content-Type",
            "Access-Control-Allow-Origin": "https://www.example.com",
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET"
        },
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};
```

------
#### [ Python 3 ]

```
import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'headers': {
            'Access-Control-Allow-Headers': 'Content-Type',
            'Access-Control-Allow-Origin': 'https://www.example.com',
            'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
        },
        'body': json.dumps('Hello from Lambda!')
    }
```

------

**Topics**
+ [

## CORS サポートを有効にするかどうかを決定する
](#apigateway-cors-request-types)
+ [

## シンプルなリクエストの CORS を有効にする
](#apigateway-cors-simple-request)
+ [

## シンプルではないリクエストの CORS を有効にする
](#apigateway-enable-cors-non-simple)
+ [

## プロキシ統合の CORS サポートを有効にする
](#apigateway-enable-cors-proxy)
+ [

# API Gateway コンソールを使用してリソースで CORS を有効にする
](how-to-cors-console.md)
+ [

# API Gateway のインポート API を使用して、リソースで CORS を有効にする
](enable-cors-for-resource-using-swagger-importer-tool.md)
+ [

# API Gateway API の CORS をテストする
](apigateway-test-cors.md)

# API Gateway コンソールを使用してリソースで CORS を有効にする
<a name="how-to-cors-console"></a>

API Gateway コンソールを使用して、作成した REST API リソース上の 1 つまたはすべてのメソッドに対する CORS サポートを有効にできます。COR サポートを有効にしたら、統合パススルーの動作を `NEVER` に設定します。この場合、マッピングされていないコンテンツタイプのメソッドリクエストは、HTTP 415 Unsupported Media Type レスポンスで拒否されます。詳細については、[API Gateway で REST API のマッピングテンプレートを使用しないペイロードのメソッドリクエストの動作](integration-passthrough-behaviors.md)を参照してください。

**重要**  
リソースには子リソースを含めることができます。リソースおよびそのメソッドに対する CORS サポートを有効にしても、子リソースおよびそのメソッドに対して再帰的に有効になるわけではありません。

**REST API リソースで CORS サポートを有効にするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. APIを選択します。

1. [**リソース**] のリソースを選択します。

1. **[リソースの詳細]** セクションで、**[CORS の有効化]** を選択します。

      
![\[[リソース] ペインで、[CORS を有効にする] を選択します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/amazon-api-gateway-new-console-enable-cors.png)

1.  **[CORS の有効化]** フォームで、以下の操作を行います。

   1. (オプション) カスタムゲートウェイレスポンスを作成し、そのレスポンスの CORS サポートを有効にする場合は、ゲートウェイレスポンスを選択します。

   1. それぞれのメソッドを選択して CORS サポートを有効にします。`OPTION` メソッドでは CORS が有効になっている必要があります。

      `ANY` メソッドの CORS サポートを有効にすると、すべてのメソッドで CORS が有効になります。

   1.  **[Access-Control-Allow-Headers]** 入力フィールドに、クライアントがリソースの実際のリクエストで送信する必要があるヘッダーのカンマ区切りリストの静的な文字列を入力します。コンソールで提供されたヘッダーのリスト `'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'` を使用するか、独自のヘッダーを指定します。

   1. コンソールで提供された値 `'*'` を [**Access-Control-Allow-Origin**] ヘッダー値として使用してすべてのオリジンからのアクセスリクエストを許可するか、リソースへのアクセスを許可するオリジンを指定します。

   1. **[保存]** を選択します。  
![\[どのヘッダーを許可するかを選択する\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/amazon-api-gateway-new-console-enable-cors-resources.png)
**重要**  
 上記の手順をプロキシ統合の `ANY` メソッドに適用すると、適切な CORS ヘッダーは設定されません。代わりに、バックエンドは `Access-Control-Allow-Origin` などの適切な CORS ヘッダーを返す必要があります。

`GET` メソッドで CORS を有効にすると、すでに追加されていない場合は `OPTIONS` メソッドがリソースに追加されます。`200` メソッドの `OPTIONS` レスポンスは、プリフライトハンドシェイクを満たすため 3 つの `Access-Control-Allow-*` ヘッダーを返すよう自動的に設定されます。さらに、実際の (`GET`) メソッドは、デフォルトでその 200 レスポンスで `Access-Control-Allow-Origin` ヘッダーを返すように設定されます。他の種類のレスポンスでは、`Cross-origin access` エラーが発生しないようにする場合、'\$1' または特定のオリジンを使って `Access-Control-Allow-Origin'` ヘッダーを返すよう手動で設定する必要があります。

リソースで CORS サポートを有効にした後、新しい設定を有効にするには API をデプロイまたは再デプロイする必要があります。詳細については、「[デプロイを作成する](set-up-deployments.md#create-deployment)」を参照してください。

**注記**  
手順を実行してもリソースで CORS サポートを有効にできない場合は、CORS 設定をサンプルの API `/pets` リソースと比較することをお勧めします。サンプル API の作成方法については、「[チュートリアル: サンプルをインポートして REST API を作成する](api-gateway-create-api-from-example.md)」を参照してください。

# API Gateway のインポート API を使用して、リソースで CORS を有効にする
<a name="enable-cors-for-resource-using-swagger-importer-tool"></a>

[API Gateway の API のインポート](api-gateway-import-api.md)を使用している場合、OpenAPI ファイルを使用して CORS サポートをセットアップできます。最初に、必要なヘッダーを返すリソースの、`OPTIONS` メソッドを定義する必要があります。

**注記**  
ウェブブラウザは、Access-Control-Allow-Headers ヘッダーおよび Access-Control-Allow-Origin ヘッダーが、CORS リクエストを受け入れる各 API メソッドでセットアップされると想定します。また、一部のブラウザは、同じリソースの `OPTIONS` メソッドに対して HTTP リクエストを行ってから、同じヘッダーを受け取ることを想定します。

## `Options` メソッドの例
<a name="enable-cors-for-resource-using-swagger-importer-tool-options"></a>

次の例では、モック統合の `OPTIONS` メソッドを作成します。

------
#### [ OpenAPI 3.0 ]

```
/users:
  options:
    summary: CORS support
    description: |
      Enable CORS by returning correct headers
    tags:
    - CORS
    responses:
      200:
        description: Default response for CORS method
        headers:
          Access-Control-Allow-Origin:
            schema:
              type: "string"
          Access-Control-Allow-Methods:
            schema:
              type: "string"
          Access-Control-Allow-Headers:
            schema:
              type: "string"
        content: {}
    x-amazon-apigateway-integration:
      type: mock
      requestTemplates:
        application/json: "{\"statusCode\": 200}"
      passthroughBehavior: "never"
      responses:
        default:
          statusCode: "200"
          responseParameters:
            method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
            method.response.header.Access-Control-Allow-Methods: "'*'"
            method.response.header.Access-Control-Allow-Origin: "'*'"
```

------
#### [ OpenAPI 2.0 ]

```
/users: 
   options:
      summary: CORS support
      description: |
        Enable CORS by returning correct headers
      consumes:
        - "application/json"
      produces:
        - "application/json"
      tags:
        - CORS
      x-amazon-apigateway-integration:
        type: mock
        requestTemplates: "{\"statusCode\": 200}"
        passthroughBehavior: "never"
        responses:
          "default":
            statusCode: "200"
            responseParameters:
              method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
              method.response.header.Access-Control-Allow-Methods : "'*'"
              method.response.header.Access-Control-Allow-Origin : "'*'"
      responses:
        200:
          description: Default response for CORS method
          headers:
            Access-Control-Allow-Headers:
              type: "string"
            Access-Control-Allow-Methods:
              type: "string"
            Access-Control-Allow-Origin:
              type: "string"
```

------

リソースに `OPTIONS` メソッドを設定したら、CORS リクエストを受け入れる必要がある同じリソースのその他のメソッドに、必要なヘッダーを追加できます。

1. **Access-Control-Allow-Origin** と **Access-Control-Allow-Origin** を応答のタイプに対して宣言します。

------
#### [ OpenAPI 3.0 ]

   ```
       responses:
         200:
           description: Default response for CORS method
           headers:
             Access-Control-Allow-Origin:
               schema:
                 type: "string"
             Access-Control-Allow-Methods:
               schema:
                 type: "string"
             Access-Control-Allow-Headers:
               schema:
                 type: "string"
           content: {}
   ```

------
#### [ OpenAPI 2.0 ]

   ```
       responses:
           200:
             description: Default response for CORS method
             headers:
               Access-Control-Allow-Headers:
                 type: "string"
               Access-Control-Allow-Methods:
                 type: "string"
               Access-Control-Allow-Origin:
                 type: "string"
   ```

------

1. `x-amazon-apigateway-integration` タグで、これらのヘッダーのマッピングを静的な値にセットアップします。

------
#### [ OpenAPI 3.0 ]

   ```
       responses:
           default:
             statusCode: "200"
             responseParameters:
               method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
               method.response.header.Access-Control-Allow-Methods: "'*'"
               method.response.header.Access-Control-Allow-Origin: "'*'"
             responseTemplates:
               application/json: |
                 {}
   ```

------
#### [ OpenAPI 2.0 ]

   ```
       responses:
             "default":
               statusCode: "200"
               responseParameters:
                 method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
                 method.response.header.Access-Control-Allow-Methods : "'*'"
                 method.response.header.Access-Control-Allow-Origin : "'*'"
   ```

------

## API の例
<a name="enable-cors-for-resource-using-swagger-importer-tool-complete-example"></a>

次の例では、`OPTIONS` メソッド、および `GET` メソッドと `HTTP` 統合を含む完全な API を作成します。

------
#### [ OpenAPI 3.0 ]

```
openapi: "3.0.1"
info:
  title: "cors-api"
  description: "cors-api"
  version: "2024-01-16T18:36:01Z"
servers:
- url: "/{basePath}"
  variables:
    basePath:
      default: "/test"
paths:
  /:
    get:
      operationId: "GetPet"
      responses:
        "200":
          description: "200 response"
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: "string"
          content: {}
      x-amazon-apigateway-integration:
        httpMethod: "GET"
        uri: "http://petstore.execute-api.us-east-1.amazonaws.com/petstore/pets"
        responses:
          default:
            statusCode: "200"
            responseParameters:
              method.response.header.Access-Control-Allow-Origin: "'*'"
        passthroughBehavior: "never"
        type: "http"
    options:
      responses:
        "200":
          description: "200 response"
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: "string"
            Access-Control-Allow-Methods:
              schema:
                type: "string"
            Access-Control-Allow-Headers:
              schema:
                type: "string"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Empty"
      x-amazon-apigateway-integration:
        responses:
          default:
            statusCode: "200"
            responseParameters:
              method.response.header.Access-Control-Allow-Methods: "'GET,OPTIONS'"
              method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
              method.response.header.Access-Control-Allow-Origin: "'*'"
        requestTemplates:
          application/json: "{\"statusCode\": 200}"
        passthroughBehavior: "never"
        type: "mock"
components:
  schemas:
    Empty:
      type: "object"
```

------
#### [  OpenAPI 2.0  ]

```
swagger: "2.0"
info:
  description: "cors-api"
  version: "2024-01-16T18:36:01Z"
  title: "cors-api"
basePath: "/test"
schemes:
- "https"
paths:
  /:
    get:
      operationId: "GetPet"
      produces:
      - "application/json"
      responses:
        "200":
          description: "200 response"
          headers:
            Access-Control-Allow-Origin:
              type: "string"
      x-amazon-apigateway-integration:
        httpMethod: "GET"
        uri: "http://petstore.execute-api.us-east-1.amazonaws.com/petstore/pets"
        responses:
          default:
            statusCode: "200"
            responseParameters:
              method.response.header.Access-Control-Allow-Origin: "'*'"
        passthroughBehavior: "never"
        type: "http"
    options:
      consumes:
      - "application/json"
      produces:
      - "application/json"
      responses:
        "200":
          description: "200 response"
          schema:
            $ref: "#/definitions/Empty"
          headers:
            Access-Control-Allow-Origin:
              type: "string"
            Access-Control-Allow-Methods:
              type: "string"
            Access-Control-Allow-Headers:
              type: "string"
      x-amazon-apigateway-integration:
        responses:
          default:
            statusCode: "200"
            responseParameters:
              method.response.header.Access-Control-Allow-Methods: "'GET,OPTIONS'"
              method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
              method.response.header.Access-Control-Allow-Origin: "'*'"
        requestTemplates:
          application/json: "{\"statusCode\": 200}"
        passthroughBehavior: "never"
        type: "mock"
definitions:
  Empty:
    type: "object"
```

------

# API Gateway API の CORS をテストする
<a name="apigateway-test-cors"></a>

API を呼び出し、レスポンスの CORS ヘッダーを確認することで、API の CORS 設定をテストできます。次の `curl` コマンドは、デプロイされた API に OPTIONS リクエストを送信します。

```
curl -v -X OPTIONS https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}
```

```
< HTTP/1.1 200 OK
< Date: Tue, 19 May 2020 00:55:22 GMT
< Content-Type: application/json
< Content-Length: 0
< Connection: keep-alive
< x-amzn-RequestId: a1b2c3d4-5678-90ab-cdef-abc123
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Headers: Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token
< x-amz-apigw-id: Abcd=
< Access-Control-Allow-Methods: DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT
```

レスポンスの `Access-Control-Allow-Origin`、`Access-Control-Allow-Headers`、および `Access-Control-Allow-Methods` ヘッダーは、API が CORS をサポートすることを示しています。詳細については、「[API Gateway での REST API の CORS](how-to-cors.md)」を参照してください。

# API Gateway での REST API のバイナリメディアタイプ
<a name="api-gateway-payload-encodings"></a>

API Gateway では、API リクエストおよびレスポンスにテキストまたはバイナリペイロードがあります。テキストペイロードは `UTF-8` でエンコードされた JSON 文字列です。テキストペイロード以外のすべてはバイナリペイロードです。バイナリペイロードの例には、JPEG ファイル、GZip ファイル、XML ファイルなどがあります。バイナリメディアをサポートするために必要な API 設定は、API がプロキシ統合を使用するか非プロキシ統合を使用するかによって異なります。

ペイロードレスポンスストリーミングとプロキシ統合を使用する場合、バイナリメディアタイプを設定する必要はありません。詳細については、「[API Gateway でプロキシ統合の統合レスポンスをストリーミングする](response-transfer-mode.md)」を参照してください。

## AWS Lambda プロキシ統合
<a name="api-gateway-payload-encodings-proxy"></a>

AWS Lambda プロキシ統合のバイナリペイロードを処理するには、関数のレスポンスを base64 でエンコードする必要があります。また、API の [binaryMediaTypes](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apigw-Type-RestApi-binaryMediaTypes) を設定する必要があります。API の `binaryMediaTypes` 設定は、API がバイナリデータとして扱うコンテンツタイプのリストです。バイナリメディアタイプの例には、`image/png` または `application/octet-stream` が含まれます。ワイルドカード文字 (`*`) を使用して、複数のメディアタイプを対象にすることができます。

API Gateway は、クライアントからの最初の `Accept` ヘッダーを使用して、レスポンスがバイナリメディアを返すかどうかを判断します。ブラウザからのリクエストなど、`Accept` ヘッダー値の順序を制御できない場合に、バイナリメディアを返すには、API のバイナリメディアタイプを `*/*` に設定します。

サンプルコードについては、「[API Gateway のLambda プロキシ統合からバイナリメディアを返す](lambda-proxy-binary-media.md)」を参照してください。

ペイロードレスポンスストリーミングと Lambda プロキシ統合を使用する場合、バイナリメディアタイプを設定する必要はありません。詳細については、「[API Gateway でペイロードレスポンスストリーミングと Lambda プロキシ統合を設定する](response-transfer-mode-lambda.md)」を参照してください。

## 非プロキシ統合
<a name="api-gateway-payload-encodings-non-proxy"></a>

非プロキシ統合のバイナリペイロードを処理するには、メディアタイプを `RestApi` リソースの [binaryMediaTypes](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apigw-Type-RestApi-binaryMediaTypes) リストに追加します。API の `binaryMediaTypes` 設定は、API がバイナリデータとして扱うコンテンツタイプのリストです。[Integration](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) リソースと [IntegrationResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html) リソースに [contentHandling](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html#contentHandling) プロパティを設定することもできます。`contentHandling` 値は、`CONVERT_TO_BINARY`、`CONVERT_TO_TEXT`、または未定義にすることができます。

**注記**  
`MOCK` またはプライベート統合の場合、AWS マネジメントコンソールでは `contentHandling` プロパティの設定はサポートされていません。`contentHandling` プロパティを設定するには、AWS CLI、CloudFormation、または SDK を使用する必要があります。

`contentHandling` 値の内容と、レスポンスの `Content-Type` ヘッダーと受信リクエストの `Accept` ヘッダーのどちらが `binaryMediaTypes` リストのエントリに一致するかどうかに応じて、API Gateway は raw バイナリバイトを base64 でエンコードされた文字列としてエンコードする、base64 でエンコードされた文字列をその raw バイトに戻す、または変更を加えずに本文を渡すことができます。

API Gateway で API のバイナリペイロードをサポートするには、次のように API を設定する必要があります。
+ [RestApi](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html) リソースの `binaryMediaTypes` リストに必要なメディアタイプを追加します。このプロパティと `contentHandling` プロパティが定義されていない場合、ペイロードは UTF-8 でエンコードされた JSON 設定として処理されます。
+ [Integration](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) リソースの `contentHandling` プロパティを指定します。
  + リクエストペイロードを base64 でエンコードされた文字列からそのバイナリ BLOB に変換するには、プロパティを `CONVERT_TO_BINARY` に設定します。
  + リクエストペイロードをバイナリ BLOB から base64 でエンコードされた文字列に変換するには、プロパティを `CONVERT_TO_TEXT` に設定します。
  + ペイロードを変更せずにパススルーするには、プロパティを未定義のままにします。バイナリペイロードを変更せずにパススルーするには、`Content-Type` がいずれかの `binaryMediaTypes` エントリに一致し、API で[パススルー動作](integration-passthrough-behaviors.md)が有効になっていることも必要です。
+ [IntegrationResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html) リソースの `contentHandling` プロパティを設定します。`contentHandling` プロパティ、クライアントリクエストの `Accept` ヘッダー、API の `binaryMediaTypes` の組み合わせによって、API Gateway がコンテンツタイプの変換を処理する方法が決まります。詳細については、「[API Gateway でのコンテンツタイプの変換](api-gateway-payload-encodings-workflow.md)」を参照してください。

**重要**  
リクエストの `Accept` ヘッダーに複数のメディアタイプが含まれている場合、API Gateway は最初の `Accept` メディアタイプのみ受け入れます。`Accept` メディアタイプの順序を制御できず、バイナリコンテンツのメディアタイプがリストの先頭にない場合は、API の `Accept` リストに最初の `binaryMediaTypes` メディアタイプを追加します。API Gateway は、このリスト内のすべてのコンテンツタイプをバイナリとして処理します。  
たとえば、ブラウザで `<img>` 要素を使用して JPEG ファイルを送信するため、ブラウザがリクエストで `Accept:image/webp,image/*,*/*;q=0.8` を送信することがあります。`image/webp` を `binaryMediaTypes` リストに追加することで、エンドポイントは JPEG ファイルをバイナリとして受け取ります。

API Gateway がテキストとバイナリペイロードを処理する方法の詳細については、「[API Gateway でのコンテンツタイプの変換](api-gateway-payload-encodings-workflow.md)」を参照してください。

# API Gateway でのコンテンツタイプの変換
<a name="api-gateway-payload-encodings-workflow"></a>

 API の `binaryMediaTypes`、クライアントリクエストのヘッダー、統合の `contentHandling` プロパティの組み合わせによって、API Gateway がペイロードをエンコードする方法が決まります。

次の表に、API Gateway がリクエストの `Content-Type` ヘッダーの特定の設定のリクエストペイロード、[RestApi](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html) リソースの `binaryMediaTypes` リスト、[Integration](https://docs.aws.amazon.com/apigateway/latest/api/API_Integration.html) リソースの `contentHandling` プロパティ値を変換する方法を示します。


| メソッドリクエストペイロード | リクエスト `Content-Type` ヘッダー | `binaryMediaTypes` | `contentHandling` | 統合リクエストペイロード | 
| --- | --- | --- | --- | --- | 
| テキストデータ | 任意のデータ型 | 未定義 | 未定義 | UTF8 でエンコードされた文字列 | 
| テキストデータ | 任意のデータ型 | 未定義 | CONVERT\$1TO\$1BINARY | Base64 でデコードされたバイナリ BLOB | 
| テキストデータ | 任意のデータ型 | 未定義 | CONVERT\$1TO\$1TEXT | UTF8 でエンコードされた文字列 | 
| テキストデータ | テキストデータ型 | 一致するメディアタイプで設定 | 未定義 | テキストデータ | 
| テキストデータ | テキストデータ型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1BINARY | Base64 でデコードされたバイナリ BLOB | 
| テキストデータ | テキストデータ型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1TEXT | テキストデータ | 
| バイナリデータ | バイナリデータ型 | 一致するメディアタイプで設定 | 未定義 | バイナリデータ | 
| バイナリデータ | バイナリデータ型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1BINARY | バイナリデータ | 
| バイナリデータ | バイナリデータ型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1TEXT | Base64 でエンコードされた文字列 | 

次の表に、API Gateway がリクエストの `Accept` ヘッダーの特定の設定のレスポンスペイロード、[RestApi](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html) リソースの `binaryMediaTypes` リスト、[IntegrationResponse](https://docs.aws.amazon.com/apigateway/latest/api/API_IntegrationResponse.html) リソースの `contentHandling` プロパティ値を変換する方法を示します。

**重要**  
 リクエストの `Accept` ヘッダーに複数のメディアタイプが含まれている場合、API Gateway は最初の `Accept` メディアタイプのみ受け入れます。`Accept` メディアタイプの順序を制御できず、バイナリコンテンツのメディアタイプがリストの先頭にない場合は、API の `Accept` リストに最初の `binaryMediaTypes` メディアタイプを追加します。API Gateway は、このリスト内のすべてのコンテンツタイプをバイナリとして処理します。  
たとえば、ブラウザで `<img>` 要素を使用して JPEG ファイルを送信するため、ブラウザがリクエストで `Accept:image/webp,image/*,*/*;q=0.8` を送信することがあります。`image/webp` を `binaryMediaTypes` リストに追加することで、エンドポイントは JPEG ファイルをバイナリとして受け取ります。


| 統合レスポンスペイロード | リクエスト `Accept` ヘッダー | `binaryMediaTypes` | `contentHandling` | メソッドレスポンスペイロード | 
| --- | --- | --- | --- | --- | 
| テキストまたはバイナリデータ | テキスト型 | 未定義 | 未定義 | UTF8 でエンコードされた文字列 | 
| テキストまたはバイナリデータ | テキスト型 | 未定義 | CONVERT\$1TO\$1BINARY | Base64 でデコードされた BLOB | 
| テキストまたはバイナリデータ | テキスト型 | 未定義 | CONVERT\$1TO\$1TEXT | UTF8 でエンコードされた文字列 | 
| テキストデータ | テキスト型 | 一致するメディアタイプで設定 | 未定義 | テキストデータ | 
| テキストデータ | テキスト型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1BINARY | Base64 でデコードされた BLOB | 
| テキストデータ | テキスト型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1TEXT | UTF8 でエンコードされた文字列 | 
| テキストデータ | バイナリ型 | 一致するメディアタイプで設定 | 未定義 | Base64 でデコードされた BLOB | 
| テキストデータ | バイナリ型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1BINARY | Base64 でデコードされた BLOB | 
| テキストデータ | バイナリ型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1TEXT | UTF8 でエンコードされた文字列 | 
| バイナリデータ | テキスト型 | 一致するメディアタイプで設定 | 未定義 | Base64 でエンコードされた文字列 | 
| バイナリデータ | テキスト型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1BINARY | バイナリデータ | 
| バイナリデータ | テキスト型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1TEXT | Base64 でエンコードされた文字列 | 
| バイナリデータ | バイナリ型 | 一致するメディアタイプで設定 | 未定義 | バイナリデータ | 
| バイナリデータ | バイナリ型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1BINARY | バイナリデータ | 
| バイナリデータ | バイナリ型 | 一致するメディアタイプで設定 | CONVERT\$1TO\$1TEXT | Base64 でエンコードされた文字列 | 

テキストペイロードをバイナリ BLOB に変換するとき、API Gateway はテキストデータが Base64 でエンコードされた文字列であるとみなし、バイナリデータを Base64 でデコードされた BLOB として出力します。変換に失敗した場合、API 設定エラーを示す `500` レスポンスを返します。そのような変換のマッピングテンプレートは提供しませんが、API で[パススルー動作](integration-passthrough-behaviors.md)を有効にする必要があります。

バイナリペイロードをテキスト文字列に変換した場合、API Gateway は常にバイナリデータに Base64 エンコードを適用します。そのようなペイロードのマッピングテンプレートを定義できますが、サンプルマッピングテンプレートの次の抜粋に示すように、マッピングテンプレート内の Base64 でエンコードされた文字列には `$input.body` を通じてのみアクセスできます。

```
{   
    "data": "$input.body"
}
```

バイナリペイロードが変更されずに渡されるようにするには、API で[パススルー動作](integration-passthrough-behaviors.md)を有効にする必要があります。

# API Gateway コンソールを使用したバイナリサポートの有効化
<a name="api-gateway-payload-encodings-configure-with-console"></a>

このセクションでは、API Gateway コンソールを使用してバイナリサポートを有効にする方法ついて説明します。例として、Amazon S3 と統合された API を使用します。サポートされるメディアタイプを設定するタスクと、ペイロードの処理方法を指定する方法に焦点を当てます。Amazon S3 と統合された API を作成する方法の詳細については、「[チュートリアル: REST API を Amazon S3 のプロキシとして作成する](integrating-api-with-aws-services-s3.md)」を参照してください。

**API Gateway コンソールを使用してバイナリサポートを有効にするには**

1. API のバイナリメディアタイプの設定

   1. 新しい API を作成するか、既存の API を選択します。この例では、API に `FileMan` という名前を付けます。

   1. プライマリナビゲーションパネルで選択した API で、**[API の設定]** を選択します。

   1. **[API の設定]** ペインで、**[バイナリメディアタイプ]** セクションの **[メディアタイプを管理]** を選択します。

   1. **[バイナリメディアタイプを追加]** を選択します。

   1. 必要なメディアタイプ (例: **image/png**) を入力テキストフィールドに入力します。必要に応じて、このステップを繰り返して他のメディアタイプを追加します。すべてのバイナリメディアタイプをサポートするには、`*/*` を指定します。

   1. **[Save changes]** (変更の保存) をクリックします。

1. API メソッドのメッセージペイロードを処理する方法を設定します。

   1. API で新しいリソースを作成するか、既存のリソースを選択します。この例では、`/{folder}/{item}` リソースを使用します。

   1. リソースで新しいメソッドを作成するか、既存のメソッドを選択します。例として、Amazon S3 で `GET /{folder}/{item}` アクションと統合された `Object GET` メソッドを使用します。

   1. **[コンテンツの処理]** で、オプションを選択します。

         
![\[API Gateway コンソールで GET メソッドをセットアップします。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/binary-support-content-handling-on-method-new-console.png)

      クライアントとバックエンドが同じバイナリ形式を受け入れるときに本文を変換しない場合は、[**Passthrough (パススルー)**] を選択します。バイナリリクエストペイロードを JSON プロパティとして渡すことがバックエンドで要求される場合などに、バイナリ本文を Base64 でエンコードされた文字列に変換するには、**[テキストに変換]** を選択します。また、クライアントが Base64 でエンコードされた文字列を送信してバックエンドが元のバイナリ形式を要求する場合や、エンドポイントが Base64 でエンコードされた文字列を返してクライアントがバイナリ出力のみ受け入れる場合は、**[バイナリに変換]** を選択します。

   1. **[リクエスト本文のパススルー]** で、**[テンプレートが定義されていない場合 (推奨)]** を選択し、リクエスト本文に対するパススルー動作を有効にします。

      **[なし]** を選択することもできます。つまり、API はマッピングテンプレートを持たない Content-Type のデータを拒否します。

   1. 統合リクエストで、受信リクエストの `Accept` ヘッダーを保持します。これは、`contentHandling` を `passthrough` に設定し、ランタイムにその設定を上書きする場合に行う必要があります。

         
![\[統合リクエストで Accept ヘッダーを保持します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/binary-support-preserve-incoming-accept-header-new-console.png)

   1. テキストに変換する場合は、Base64 でエンコードされたバイナリデータを必要な形式にするマッピングテンプレートを定義します。

      マッピングテンプレートをテキストに変換する例は次のとおりです。

      ```
      {
        "operation": "thumbnail",
        "base64Image": "$input.body"
      }
      ```

      このマッピングテンプレートの形式は、入力のエンドポイント要件によって異なります。

   1. **[保存]** を選択します。

# API Gateway REST API を使用したバイナリサポートの有効化
<a name="api-gateway-payload-encodings-configure-with-control-service-api"></a>

次のタスクは、API Gateway REST API コールを使用してバイナリサポートを有効にする方法を示します。

**Topics**
+ [

## サポートされるバイナリメディアタイプの API への追加と更新
](#api-gateway-payload-encodings-setup-with-api-set-encodings-map)
+ [

## リクエストペイロード変換の設定
](#api-gateway-payload-encodings-setup-with-api-set-integration-request-encoding)
+ [

## レスポンスペイロード変換の設定
](#api-gateway-payload-encodings-setup-with-api-set-integration-response-encoding)
+ [

## バイナリデータをテキストデータに変換する
](#api-gateway-payload-encodings-convert-binary-to-string)
+ [

## テキストデータをバイナリペイロードに変換する
](#api-gateway-payload-encodings-convert-string-to-binary)
+ [

## バイナリペイロードを渡す
](#api-gateway-payload-encodings-pass-binary-as-is)

## サポートされるバイナリメディアタイプの API への追加と更新
<a name="api-gateway-payload-encodings-setup-with-api-set-encodings-map"></a>

API Gateway が新しいバイナリメディアタイプをサポートするようにするには、`binaryMediaTypes` リソースの `RestApi` リストにバイナリメディアタイプを追加する必要があります。たとえば、API Gateway が JPEG イメージを処理するようにするには、`PATCH` リクエストを `RestApi` リソースに送信します。

```
PATCH /restapis/<restapi_id>

{
  "patchOperations" : [ {
    "op" : "add",
    "path" : "/binaryMediaTypes/image~1jpeg"
  } 
 ]
}
```

`image/jpeg` プロパティ値の一部となっている `path` の MIME タイプの指定は、`image~1jpeg` としてエスケープされます。

サポートされるバイナリメディアタイプを更新するには、`binaryMediaTypes` リソースの `RestApi` リストにあるメディアタイプを置き換えるか、削除します。たとえば、バイナリサポートを JPEG ファイルから raw バイトに変更するには、次のように `PATCH` リクエストを `RestApi` リソースに送信します。

```
PATCH /restapis/<restapi_id>

{
  "patchOperations" : [{
    "op" : "replace",
    "path" : "/binaryMediaTypes/image~1jpeg",
    "value" : "application/octet-stream"
  },
  {
    "op" : "remove",
    "path" : "/binaryMediaTypes/image~1jpeg"
  }]
}
```

## リクエストペイロード変換の設定
<a name="api-gateway-payload-encodings-setup-with-api-set-integration-request-encoding"></a>

エンドポイントにバイナリ入力が必要な場合、`contentHandling` リソースの `Integration` プロパティを `CONVERT_TO_BINARY` に設定します。これを行うには、次のように `PATCH` リクエストを送信します。

```
PATCH /restapis/<restapi_id>/resources/<resource_id>/methods/<http_method>/integration

{
  "patchOperations" : [ {
    "op" : "replace",
    "path" : "/contentHandling",
    "value" : "CONVERT_TO_BINARY"
  }]
}
```

## レスポンスペイロード変換の設定
<a name="api-gateway-payload-encodings-setup-with-api-set-integration-response-encoding"></a>

クライアントが、エンドポイントから返された Base64 でエンコードされたペイロードの代わりにバイナリ BLOB として結果を受け入れる場合、`contentHandling` リソースの `IntegrationResponse` プロパティを `CONVERT_TO_BINARY` に設定します。これを行うには、次のように `PATCH` リクエストを送信します。

```
PATCH /restapis/<restapi_id>/resources/<resource_id>/methods/<http_method>/integration/responses/<status_code>

{
  "patchOperations" : [ {
    "op" : "replace",
    "path" : "/contentHandling",
    "value" : "CONVERT_TO_BINARY"
  }]
}
```

## バイナリデータをテキストデータに変換する
<a name="api-gateway-payload-encodings-convert-binary-to-string"></a>

バイナリデータを API Gateway 経由で、AWS Lambda または Kinesis への入力の JSON プロパティとして送信するには、以下の操作を実行します。

1. `application/octet-stream` の新しいバイナリメディアタイプを API の `binaryMediaTypes` リストに追加することで、API のバイナリペイロードサポートを有効にします。

   ```
   PATCH /restapis/<restapi_id>
   
   {
     "patchOperations" : [ {
       "op" : "add",
       "path" : "/binaryMediaTypes/application~1octet-stream"
     } 
    ]
   }
   ```

1. `CONVERT_TO_TEXT` リソースの `contentHandling` プロパティで `Integration` を設定し、バイナリデータの Base64 でエンコードされた文字列を JSON プロパティに割り当てるマッピングテンプレートを提供します。次の例では、JSON プロパティが `body` であり、`$input.body` には Base64 でエンコードされた文字列が保持されています。

   ```
   PATCH /restapis/<restapi_id>/resources/<resource_id>/methods/<http_method>/integration
   
   {
     "patchOperations" : [
       {
         "op" : "replace",
         "path" : "/contentHandling",
         "value" : "CONVERT_TO_TEXT"
       },
       {
         "op" : "add",
         "path" : "/requestTemplates/application~1octet-stream",
         "value" : "{\"body\": \"$input.body\"}"
       }
     ]
   }
   ```

## テキストデータをバイナリペイロードに変換する
<a name="api-gateway-payload-encodings-convert-string-to-binary"></a>

Lambda 関数がイメージファイルを base64 でエンコードされた文字列として返すとします。API Gateway を通じてこのバイナリ出力をクライアントに渡すには、以下の操作を実行します。

1. `binaryMediaTypes` のバイナリメディアを追加することで API の `application/octet-stream` リストを更新します (まだリストにない場合)。

   ```
   PATCH /restapis/<restapi_id>
   
   {
     "patchOperations" : [ {
       "op" : "add",
       "path" : "/binaryMediaTypes/application~1octet-stream",
     }]
   }
   ```

1.  `contentHandling` リソースの `Integration` プロパティを `CONVERT_TO_BINARY` に設定します。マッピングテンプレートを定義しないでください。マッピングテンプレートを定義しない場合、API Gateway はパススルーテンプレートを呼び出して、Base64 でデコードされたバイナリ BLOB をイメージファイルとしてクライアントに返します。

   ```
   PATCH /restapis/<restapi_id>/resources/<resource_id>/methods/<http_method>/integration/responses/<status_code>
   
   {
     "patchOperations" : [
       {
         "op" : "replace",
         "path" : "/contentHandling",
         "value" : "CONVERT_TO_BINARY"
       }
     ]
   }
   ```

## バイナリペイロードを渡す
<a name="api-gateway-payload-encodings-pass-binary-as-is"></a>

 API Gateway を使用して Amazon S3 バケットにイメージを保存するには、以下の操作を実行します。

1. `binaryMediaTypes` のバイナリメディアを追加することで API の `application/octet-stream` リストを更新します (まだリストにない場合)。

   ```
   PATCH /restapis/<restapi_id>
   
   {
     "patchOperations" : [ {
       "op" : "add",
       "path" : "/binaryMediaTypes/application~1octet-stream"
     }
    ]
   }
   ```

1. `contentHandling` リソースの `Integration` プロパティで `CONVERT_TO_BINARY` を設定します。マッピングテンプレートを定義せずに、`WHEN_NO_MATCH` を `passthroughBehavior` プロパティとして設定します。これにより、API Gateway はパススルーテンプレートを呼び出すことができます。

   ```
   PATCH /restapis/<restapi_id>/resources/<resource_id>/methods/<http_method>/integration
   
   {
     "patchOperations" : [
       {
         "op" : "replace",
         "path" : "/contentHandling",
         "value" : "CONVERT_TO_BINARY"
       },
       {
         "op" : "replace",
         "path" : "/passthroughBehaviors",
         "value" : "WHEN_NO_MATCH"
       }
     ]
   }
   ```

# API Gateway のコンテンツエンコードのインポートとエクスポート
<a name="api-gateway-payload-encodings-import-and-export"></a>

 [RestApi](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html) の `binaryMediaTypes` リストをインポートするには、API の OpenAPI 定義ファイルへの次の API Gateway 拡張を使用します。この拡張は、API 設定のエクスポートにも使用します。
+ [x-amazon-apigateway-binary-media-types のプロパティ](api-gateway-swagger-extensions-binary-media-types.md)

`contentHandling` または `Integration` リソースで `IntegrationResponse` プロパティ値をインポートおよびエクスポートするには、OpenAPI 定義への次の API Gateway 拡張を使用します。
+ [x-amazon-apigateway-integration オブジェクト](api-gateway-swagger-extensions-integration.md)
+ [x-amazon-apigateway-integration.response オブジェクト](api-gateway-swagger-extensions-integration-response.md)

# API Gateway のLambda プロキシ統合からバイナリメディアを返す
<a name="lambda-proxy-binary-media"></a>

[AWS Lambda プロキシ統合](set-up-lambda-proxy-integrations.md)からバイナリメディアを返すには、Lambda 関数からのレスポンスを base64 でエンコードします。また、[API のバイナリメディアタイプを設定](api-gateway-payload-encodings-configure-with-console.md)する必要があります。API のバイナリメディアタイプを設定すると、API はそのコンテンツタイプをバイナリデータとして扱います。ペイロードサイズの上限は 10 MB です。

**注記**  
この統合例でウェブブラウザを使用して API を呼び出すには、API のバイナリメディアタイプを `*/*` に設定します 。API Gateway は、クライアントからの最初の `Accept` ヘッダーを使用して、レスポンスがバイナリメディアを返すかどうかを判断します。ブラウザからのリクエストなど、`Accept` ヘッダー値の順序を制御できない場合に、バイナリメディアを返すには、API のバイナリメディアタイプを `*/*` (すべてのコンテンツタイプ) に設定します。

以下のサンプルの Lambda 関数は、Amazon S3 からのバイナリイメージまたはテキストをクライアントに返すことができます。関数のレスポンスには、返されるデータのタイプをクライアントに示す `Content-Type` ヘッダーが含まれています。この関数は、返すデータのタイプに応じて、レスポンスで `isBase64Encoded` プロパティを条件付きで設定します。

------
#### [ Node.js ]

```
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"

const client = new S3Client({region: 'us-east-2'});

export const handler = async (event) => {

  var randomint = function(max) {
    return Math.floor(Math.random() * max);
  }
  var number = randomint(2);
  if (number == 1){ 
    const input = {
      "Bucket" : "bucket-name",
      "Key" : "image.png"
      }
    try {
      const command = new GetObjectCommand(input)
      const response = await client.send(command);
      var str = await response.Body.transformToByteArray();
    } catch (err) {
      console.error(err);
    }
    const base64body = Buffer.from(str).toString('base64');
    return {
      'headers': { "Content-Type": "image/png" },
      'statusCode': 200,
      'body': base64body,
      'isBase64Encoded': true
      }
    } else {
        return {
        'headers': { "Content-Type": "text/html" },
        'statusCode': 200,
        'body': "<h1>This is text</h1>",
        }
    }
}
```

------
#### [ Python ]

```
import base64
import boto3
import json
import random

s3 = boto3.client('s3')

def lambda_handler(event, context):
    number = random.randint(0,1)
    if number == 1:
        response = s3.get_object(
            Bucket='bucket-name',
            Key='image.png',
        )
        image = response['Body'].read()
        return {
            'headers': { "Content-Type": "image/png" },
            'statusCode': 200,
            'body': base64.b64encode(image).decode('utf-8'),
            'isBase64Encoded': True
        }
    else:
        return {
            'headers': { "Content-type": "text/html" },
            'statusCode': 200,
            'body': "<h1>This is text</h1>",
        }
```

------

バイナリメディアタイプの詳細については、「[API Gateway での REST API のバイナリメディアタイプ](api-gateway-payload-encodings.md)」を参照してください。

# API Gateway API を介して Amazon S3 のバイナリファイルにアクセスする
<a name="api-gateway-content-encodings-examples-image-s3"></a>

次の例は、Amazon S3 でのイメージのアクセスに使用される OpenAPI ファイル、Amazon S3 からイメージをダウンロードする方法、イメージを Amazon S3 にアップロードする方法を示しています。

**Topics**
+ [

## Amazon S3 でイメージにアクセスするためのサンプル API の OpenAPI ファイル
](#api-gateway-content-encodings-example-image-s3-swagger-file)
+ [

## Amazon S3 からイメージをダウンロードする
](#api-gateway-content-encodings-example-download-image-from-s3)
+ [

## Amazon S3 にイメージをアップロードする
](#api-gateway-content-encodings-example-upload-image-to-s3)

## Amazon S3 でイメージにアクセスするためのサンプル API の OpenAPI ファイル
<a name="api-gateway-content-encodings-example-image-s3-swagger-file"></a>

次の OpenAPI ファイルは、Amazon S3 からのイメージファイルのダウンロードと Amazon S3 へのイメージファイルのアップロードを示すサンプル API を示しています。この API は、指定されたイメージファイルをダウンロードおよびアップロードするための `GET /s3?key={file-name}` メソッドと `PUT /s3?key={file-name}` メソッドを開示します。`GET` メソッドは、200 OK レスポンスにおいて、提供されたマッピングテンプレートに従って、JSON 出力の一部である Base64 でエンコードされた文字列としてイメージファイルを返します。`PUT` メソッドは、入力として raw バイナリ BLOB を受け取り、200 OK レスポンスを空のペイロードで返します。

------
#### [ OpenAPI 3.0 ]

```
{
   "openapi": "3.0.0",
   "info": {
      "version": "2016-10-21T17:26:28Z",
      "title": "ApiName"
   },
   "paths": {
      "/s3": {
         "get": {
            "parameters": [
               {
                  "name": "key",
                  "in": "query",
                  "required": false,
                  "schema": {
                     "type": "string"
                  }
               }
            ],
            "responses": {
               "200": {
                  "description": "200 response",
                  "content": {
                     "application/json": {
                        "schema": {
                           "$ref": "#/components/schemas/Empty"
                        }
                     }
                  }
               },
               "500": {
                  "description": "500 response"
               }
            },
            "x-amazon-apigateway-integration": {
               "credentials": "arn:aws:iam::123456789012:role/binarySupportRole",
               "responses": {
                  "default": {
                     "statusCode": "500"
                  },
                  "2\\d{2}": {
                     "statusCode": "200"
                  }
               },
               "requestParameters": {
                  "integration.request.path.key": "method.request.querystring.key"
               },
               "uri": "arn:aws:apigateway:us-west-2:s3:path/{key}",
               "passthroughBehavior": "when_no_match",
               "httpMethod": "GET",
               "type": "aws"
            }
         },
         "put": {
            "parameters": [
               {
                  "name": "key",
                  "in": "query",
                  "required": false,
                  "schema": {
                     "type": "string"
                  }
               }
            ],
            "responses": {
               "200": {
                  "description": "200 response",
                  "content": {
                     "application/json": {
                        "schema": {
                           "$ref": "#/components/schemas/Empty"
                        }
                     },
                     "application/octet-stream": {
                        "schema": {
                           "$ref": "#/components/schemas/Empty"
                        }
                     }
                  }
               },
               "500": {
                  "description": "500 response"
               }
            },
            "x-amazon-apigateway-integration": {
               "credentials": "arn:aws:iam::123456789012:role/binarySupportRole",
               "responses": {
                  "default": {
                     "statusCode": "500"
                  },
                  "2\\d{2}": {
                     "statusCode": "200"
                  }
               },
               "requestParameters": {
                  "integration.request.path.key": "method.request.querystring.key"
               },
               "uri": "arn:aws:apigateway:us-west-2:s3:path/{key}",
               "passthroughBehavior": "when_no_match",
               "httpMethod": "PUT",
               "type": "aws",
               "contentHandling": "CONVERT_TO_BINARY"
            }
         }
      }
   },
   "x-amazon-apigateway-binary-media-types": [
      "application/octet-stream",
      "image/jpeg"
   ],
   "servers": [
      {
         "url": "https://abcdefghi.execute-api.us-east-1.amazonaws.com/{basePath}",
         "variables": {
            "basePath": {
              "default": "/v1"
            }
         }
      }
   ],
   "components": {
      "schemas": {
         "Empty": {
            "type": "object",
            "title": "Empty Schema"
         }
      }
   }
}
```

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-10-21T17:26:28Z",
    "title": "ApiName"
  },
  "host": "abcdefghi.execute-api.us-east-1.amazonaws.com",
  "basePath": "/v1",
  "schemes": [
    "https"
  ],
  "paths": {
    "/s3": {
      "get": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "key",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          },
          "500": {
            "description": "500 response"
          }
        },
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/binarySupportRole",
          "responses": {
            "default": {
              "statusCode": "500"
            },
            "2\\d{2}": {
              "statusCode": "200"            }
          },
          "requestParameters": {
            "integration.request.path.key": "method.request.querystring.key"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{key}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "GET",
          "type": "aws"
        }
      },
      "put": {
        "produces": [
          "application/json", "application/octet-stream"
        ],
        "parameters": [
          {
            "name": "key",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          },
          "500": {
            "description": "500 response"
          }
        },
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/binarySupportRole",
          "responses": {
            "default": {
              "statusCode": "500"
            },
            "2\\d{2}": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.path.key": "method.request.querystring.key"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{key}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "PUT",
          "type": "aws",
          "contentHandling" : "CONVERT_TO_BINARY"
        }
      }
    }
  },
  "x-amazon-apigateway-binary-media-types" : ["application/octet-stream", "image/jpeg"],
  "definitions": {
    "Empty": {
      "type": "object",
      "title": "Empty Schema"
    }
  }
}
```

------

## Amazon S3 からイメージをダウンロードする
<a name="api-gateway-content-encodings-example-download-image-from-s3"></a>

イメージファイル (`image.jpg`) を Amazon S3 からバイナリ BLOB としてダウンロードするには

```
GET /v1/s3?key=image.jpg HTTP/1.1
Host: abcdefghi.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
Accept: application/octet-stream
```

正常な応答は次のようになります。

```
200 OK HTTP/1.1

[raw bytes]
```

`Accept` ヘッダーが `application/octet-stream` のバイナリメディアタイプとして設定されており、API のバイナリサポートが有効になっているため、raw バイトが返されます。

または、イメージファイル (`image.jpg`) を、Amazon S3 から、(JSON プロパティとしてフォーマットされた) Base64 でエンコードされた文字列としてダウンロードするには、次の太字の OpenAPI 定義ブロックに示されているように、200 の統合レスポンスにレスポンステンプレートを追加します。

```
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/binarySupportRole",
          "responses": {
            "default": {
              "statusCode": "500"
            },
            "2\\d{2}": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "{\n   \"image\": \"$input.body\"\n}"
              }
            }
          },
```

イメージファイルをダウンロードするリクエストは、次のようになります。

```
GET /v1/s3?key=image.jpg HTTP/1.1
Host: abcdefghi.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
Accept: application/json
```

正常なレスポンスは次のようになります。

```
200 OK HTTP/1.1

{
  "image": "W3JhdyBieXRlc10="
}
```

## Amazon S3 にイメージをアップロードする
<a name="api-gateway-content-encodings-example-upload-image-to-s3"></a>

イメージファイル (`image.jpg`) をバイナリ BLOB として Amazon S3 にアップロードするには

```
PUT /v1/s3?key=image.jpg HTTP/1.1
Host: abcdefghi.execute-api.us-east-1.amazonaws.com
Content-Type: application/octet-stream
Accept: application/json

[raw bytes]
```

正常なレスポンスは次のようになります。

```
200 OK HTTP/1.1        
```

イメージファイル (`image.jpg`) を Base64 でエンコードされた文字列として Amazon S3 にアップロードするには

```
PUT /v1/s3?key=image.jpg HTTP/1.1
Host: abcdefghi.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
Accept: application/json

W3JhdyBieXRlc10=
```

`Content-Type` ヘッダー値が `application/json` に設定されているため、入力ペイロードは Base64 でエンコードされた文字列でなければならない点に注意してください。正常なレスポンスは次のようになります。

```
200 OK HTTP/1.1
```

# API Gateway API を使用して Lambda のバイナリファイルにアクセスする
<a name="api-gateway-content-encodings-examples-image-lambda"></a>

次の OpenAPI の例は、API Gateway API を通じて AWS Lambda のバイナリファイルにアクセスする方法を示しています。この API は、指定したイメージファイルをダウンロードおよびアップロードするための `GET /lambda?key={file-name}` メソッドと `PUT /lambda?key={file-name}` メソッドを公開します。`GET` メソッドは、200 OK レスポンスにおいて、提供されたマッピングテンプレートに従って、JSON 出力の一部である Base64 でエンコードされた文字列としてイメージファイルを返します。`PUT` メソッドは、入力として raw バイナリ BLOB を受け取り、200 OK レスポンスを空のペイロードで返します。

API が呼び出す Lambda 関数を作成します。この Lambda 関数は、`application/json` の `Content-Type` ヘッダーを含む文字列を base64 でエンコードして返す必要があります。

**Topics**
+ [

## Lambda でイメージにアクセスするためのサンプル API の OpenAPI ファイル
](#api-gateway-content-encodings-example-image-lambda-swagger-file)
+ [

## Lambda からイメージをダウンロードする
](#api-gateway-content-encodings-example-download-image-from-lambda)
+ [

## Lambda へイメージをアップロードする
](#api-gateway-content-encodings-example-upload-image-to-lambda)

## Lambda でイメージにアクセスするためのサンプル API の OpenAPI ファイル
<a name="api-gateway-content-encodings-example-image-lambda-swagger-file"></a>

次の OpenAPI ファイルは、Lambda からのイメージファイルのダウンロードと Lambda へのイメージファイルのアップロードを示す API 例を示しています。

------
#### [ OpenAPI 3.0 ]

```
{
   "openapi": "3.0.0",
   "info": {
      "version": "2016-10-21T17:26:28Z",
      "title": "ApiName"
   },
   "paths": {
      "/lambda": {
         "get": {
            "parameters": [
               {
                  "name": "key",
                  "in": "query",
                  "required": false,
                  "schema": {
                     "type": "string"
                  }
               }
            ],
            "responses": {
               "200": {
                  "description": "200 response",
                  "content": {
                     "application/json": {
                        "schema": {
                           "$ref": "#/components/schemas/Empty"
                        }
                     }
                  }
               },
               "500": {
                  "description": "500 response"
               }
            },
            "x-amazon-apigateway-integration": {
               "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:image/invocations",
               "type": "AWS",
               "credentials": "arn:aws:iam::123456789012:role/Lambda",
               "httpMethod": "POST",
               "requestTemplates": {
                  "application/json": "{\n   \"imageKey\": \"$input.params('key')\"\n}"
               },
               "responses": {
                  "default": {
                     "statusCode": "500"
                  },
                  "2\\d{2}": {
                     "statusCode": "200",
                     "responseTemplates": {
                        "application/json": "{\n   \"image\": \"$input.body\"\n}"
                     }
                  }
               }
            }
         },
         "put": {
            "parameters": [
               {
                  "name": "key",
                  "in": "query",
                  "required": false,
                  "schema": {
                     "type": "string"
                  }
               }
            ],
            "responses": {
               "200": {
                  "description": "200 response",
                  "content": {
                     "application/json": {
                        "schema": {
                           "$ref": "#/components/schemas/Empty"
                        }
                     },
                     "application/octet-stream": {
                        "schema": {
                           "$ref": "#/components/schemas/Empty"
                        }
                     }
                  }
               },
               "500": {
                  "description": "500 response"
               }
            },
            "x-amazon-apigateway-integration": {
               "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:image/invocations",
               "type": "AWS",
               "credentials": "arn:aws:iam::123456789012:role/Lambda",
               "httpMethod": "POST",
               "contentHandling": "CONVERT_TO_TEXT",
               "requestTemplates": {
                  "application/json": "{\n   \"imageKey\": \"$input.params('key')\", \"image\": \"$input.body\"\n}"
               },
               "responses": {
                  "default": {
                     "statusCode": "500"
                  },
                  "2\\d{2}": {
                     "statusCode": "200"
                  }
               }
            }
         }
      }
   },
   "x-amazon-apigateway-binary-media-types": [
      "application/octet-stream",
      "image/jpeg"
   ],
   "servers": [
      {
         "url": "https://abcdefghi.execute-api.us-east-1.amazonaws.com/{basePath}",
         "variables": {
            "basePath": {
              "default": "/v1"
            }
         }
      }
   ],
   "components": {
      "schemas": {
         "Empty": {
            "type": "object",
            "title": "Empty Schema"
         }
      }
   }
}
```

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-10-21T17:26:28Z",
    "title": "ApiName"
  },
  "host": "abcdefghi.execute-api.us-east-1.amazonaws.com",
  "basePath": "/v1",
  "schemes": [
    "https"
  ],
  "paths": {
    "/lambda": {
      "get": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "key",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          },
          "500": {
            "description": "500 response"
          }
        },
        "x-amazon-apigateway-integration": {
          "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:image/invocations",
          "type": "AWS",
          "credentials": "arn:aws:iam::123456789012:role/Lambda",
          "httpMethod": "POST",
          "requestTemplates": {
            "application/json": "{\n   \"imageKey\": \"$input.params('key')\"\n}"
          },
          "responses": {
            "default": {
              "statusCode": "500"
            },
            "2\\d{2}": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "{\n   \"image\": \"$input.body\"\n}"
              }
            }
          }
        }
      },
      "put": {
        "produces": [
          "application/json", "application/octet-stream"
        ],
        "parameters": [
          {
            "name": "key",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          },
          "500": {
            "description": "500 response"
          }
        },
        "x-amazon-apigateway-integration": {
          "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:image/invocations",
          "type": "AWS",
          "credentials": "arn:aws:iam::123456789012:role/Lambda",
          "httpMethod": "POST",
          "contentHandling" : "CONVERT_TO_TEXT",
          "requestTemplates": {
            "application/json": "{\n   \"imageKey\": \"$input.params('key')\", \"image\": \"$input.body\"\n}"
          },
          "responses": {
            "default": {
              "statusCode": "500"
            },
            "2\\d{2}": {
              "statusCode": "200"
            }
          }
        }
      }
    }
  },
  "x-amazon-apigateway-binary-media-types" : ["application/octet-stream", "image/jpeg"],
  "definitions": {
    "Empty": {
      "type": "object",
      "title": "Empty Schema"
    }
  }
}
```

------

## Lambda からイメージをダウンロードする
<a name="api-gateway-content-encodings-example-download-image-from-lambda"></a>

イメージファイル (`image.jpg`) を Lambda からバイナリ BLOB としてダウンロードするには

```
GET /v1/lambda?key=image.jpg HTTP/1.1
Host: abcdefghi.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
Accept: application/octet-stream
```

正常なレスポンスは次のようになります。

```
200 OK HTTP/1.1

[raw bytes]
```

イメージファイル (`image.jpg`) を、JSON プロパティとしてフォーマットして base64 でエンコードされた文字列として Lambda からダウンロードするには

```
GET /v1/lambda?key=image.jpg HTTP/1.1
Host: abcdefghi.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
Accept: application/json
```

正常なレスポンスは次のようになります。

```
200 OK HTTP/1.1

{
  "image": "W3JhdyBieXRlc10="
}
```

## Lambda へイメージをアップロードする
<a name="api-gateway-content-encodings-example-upload-image-to-lambda"></a>

イメージファイル (`image.jpg`) をバイナリ BLOB として Lambda にアップロードするには

```
PUT /v1/lambda?key=image.jpg HTTP/1.1
Host: abcdefghi.execute-api.us-east-1.amazonaws.com
Content-Type: application/octet-stream
Accept: application/json

[raw bytes]
```

正常なレスポンスは次のようになります。

```
200 OK            
```

イメージファイル (`image.jpg`) を base64 でエンコードされた文字列として Lambda にアップロードするには

```
PUT /v1/lambda?key=image.jpg HTTP/1.1
Host: abcdefghi.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
Accept: application/json

W3JhdyBieXRlc10=
```

正常なレスポンスは次のようになります。

```
200 OK           
```

# API Gateway で REST API を呼び出す
<a name="how-to-call-api"></a>

デプロイされた API を呼び出すには、API 実行の `execute-api` コンポーネントサービス (API Gateway と呼ばれます) の URL にクライアントがリクエストを送信します。

REST API のベース URL の形式は以下のとおりです。

```
https://api-id.execute-api.region.amazonaws.com/stage/
```

*api\$1id* は API ID、*region* は AWS リージョン、*stage* は API デプロイのステージ名です。

**重要**  
API を呼び出す前に、API Gateway でデプロイする必要があります。API をデプロイする手順については、「[API Gateway で REST API をデプロイする](how-to-deploy-api.md)」を参照してください。

**Topics**
+ [

## API の呼び出し URL の取得
](#apigateway-how-to-call-rest-api)
+ [

## API の呼び出し
](#apigateway-call-api)
+ [

# API Gateway コンソールを使用して REST API メソッドをテストする
](how-to-test-method.md)
+ [

# REST API 用に API Gateway で生成された Java SDK を使用する
](how-to-call-apigateway-generated-java-sdk.md)
+ [

# REST API 用に API Gateway で生成された Android SDK を使用する
](how-to-generate-sdk-android.md)
+ [

# REST API 用に API Gateway で生成された JavaScript SDK を使用する
](how-to-generate-sdk-javascript.md)
+ [

# API Gateway によって生成された Ruby SDK を REST API で使用する
](how-to-call-sdk-ruby.md)
+ [

# Objective-C または Swift で REST API 用に API Gateway で生成された iOS SDK を使用する
](how-to-generate-sdk-ios.md)

## API の呼び出し URL の取得
<a name="apigateway-how-to-call-rest-api"></a>

API の呼び出し URL を取得するには、コンソール、AWS CLI、またはエクスポートされた OpenAPI 定義を使用できます。

### コンソールを使用した API の 呼び出し URL の取得
<a name="apigateway-obtain-url-console"></a>

次の手順では、REST API コンソールで API の呼び出し URL を取得する方法を示します。

**REST API コンソールを使用して API の 呼び出し URL を取得するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. デプロイされた API を選択します。

1. メインのナビゲーションペインで、**[ステージ]** を選択します。

1. **[ステージの詳細]** で、コピーアイコンを選択して API の呼び出し URL をコピーします。

   この URL は API のルートリソース用です。  
![\[REST API を作成すると、コンソールに API の呼び出し URL が表示されます。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/getting-started-rest-invoke-url.png)

1. API で別のリソース用の API の呼び出し URL を取得するには、セカンダリナビゲーションペインでステージを展開し、メソッドを選択します。

1. コピーアイコンを選択して API のリソースレベルの呼び出し URL をコピーします。  
![\[REST API のリソースレベルの URL は、ステージのセカンダリナビゲーションペインの下にあります。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/resource-level-invoke-url.png)

#### AWS CLI を使用した API の呼び出し URL の取得
<a name="apigateway-obtain-url-cli"></a>

次の手順では、AWS CLI を使用して API の呼び出し URL を取得する方法を示します。

**AWS CLI を使用した API の 呼び出し URL の取得**

1. `rest-api-id` を取得するには、次のコマンドを使用します。このコマンドは、リージョンのすべての `rest-api-id` 値を返します。詳細については、「[get-rest-apis](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-rest-apis.html)」を参照してください。

   ```
   aws apigateway get-rest-apis
   ```

1. 例の `rest-api-id` を独自の `rest-api-id`、例の *\$1stage-name\$1* を独自の *\$1stage-name\$1*、*\$1region\$1* を独自のリージョンに置き換えます。

   ```
   https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/
   ```

##### API のエクスポートされた OpenAPI 定義ファイルを使用した API の呼び出し URL の取得
<a name="apigateway-obtain-url-openapi"></a>

API のエクスポートされた OpenAPI 定義ファイルの `host` フィールドと `basePath` フィールドを組み合わせてルート URL を構築することもできます。API のエクスポート方法の手順については、「[API Gateway から REST API をエクスポートする](api-gateway-export-api.md)」を参照してください。

## API の呼び出し
<a name="apigateway-call-api"></a>

デプロイした API は、ブラウザ、curl、または他のアプリケーション ([Postman](https://www.postman.com/) など) を使用して呼び出すことができます。

さらに、API Gateway コンソールを使用して API コールをテストすることもできます。テストでは API Gateway の `TestInvoke` 機能を使用します。これにより、API をデプロイする前に API をテストできます。詳細については、「[API Gateway コンソールを使用して REST API メソッドをテストする](how-to-test-method.md)」を参照してください。

**注記**  
呼び出し URL のクエリ文字列パラメーターの値に `%%` を含めることはできません。

### ウェブブラウザを使用した API の呼び出し
<a name="apigateway-call-api-brower"></a>

API が匿名アクセスを許可する場合は、任意のウェブブラウザを使用して `GET` メソッドを呼び出すことができます。ブラウザのアドレスバーに完全な呼び出し URL を入力します。

他のメソッドや認証が必要な呼び出しについては、ペイロードを指定するか、リクエストに署名する必要があります。HTML ページの裏のスクリプトで、または AWS SDK の 1 つを使用して、クライアントのアプリケーションで処理することができます。

#### curl を使用した API の呼び出し
<a name="apigateway-call-api-curl"></a>

ターミナルで [curl](https://curl.se/) などのツールを使用して API を呼び出すことができます。次の curl コマンドの例では、API の `prod` ステージの `getUsers` リソースで GET メソッドを呼び出します。

------
#### [ Linux or Macintosh ]

```
curl -X GET 'https://b123abcde4.execute-api.us-west-2.amazonaws.com/prod/getUsers'
```

------
#### [ Windows ]

```
curl -X GET "https://b123abcde4.execute-api.us-west-2.amazonaws.com/prod/getUsers"
```

------

# API Gateway コンソールを使用して REST API メソッドをテストする
<a name="how-to-test-method"></a>

API Gateway コンソールを使用して REST API メソッドをテストします。

**Topics**
+ [

## 前提条件
](#how-to-test-method-prerequisites)
+ [

## API Gateway コンソールを使用してメソッドをテストする
](#how-to-test-method-console)

## 前提条件
<a name="how-to-test-method-prerequisites"></a>
+ テストするメソッドの設定を指定する必要があります。「[API Gateway の REST API のメソッド](how-to-method-settings.md)」の手順に従います。

## API Gateway コンソールを使用してメソッドをテストする
<a name="how-to-test-method-console"></a>

**重要**  
API Gateway コンソールでメソッドをテストすると、リソースが変更され、元に戻せなくなる場合があります。API Gateway コンソールでメソッドをテストすることは、API Gateway コンソール外でメソッドを呼び出すことと同じです。たとえば、API Gateway コンソールを使用して API リソースを削除するメソッドを呼び出した場合、メソッドの呼び出しが成功すると、API のリソースは削除されます。

**メソッドをテストするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. [**リソース**] ペインで、テストするメソッドを選択します。

1. **[テスト]** タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。  
![\[[テスト] タブを使用して API をテストします。このタブは、[メソッドレスポンス] タブの横にあります。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/api-gateway-test-new-console.png)

    表示されたいずれかのボックスに値を入力します (**[クエリ文字列]**、**[ヘッダー]**、**[リクエスト本文]** など)。コンソールには、メソッドリクエストにこれらの値がデフォルトの application/json 形式で含まれています。

   指定する必要がある追加オプションについては、API 所有者までお問い合わせください。

1. [**Test (テスト)**] を選択します。次の情報が表示されます。
   + [**リクエスト**]: メソッド用に呼び出されたリソースのパスです。
   + [**ステータス**]: 応答の HTTP ステータスコードです。
   + **[レイテンシー (ミリ秒)]**: 発信者からのリクエストを受信してからレスポンスを返すまでの時間です。
   + **[レスポンス本文]** は HTTP レスポンスの本文です。
   + **[レスポンスヘッダー]** は HTTP レスポンスのヘッダーです。
**ヒント**  
マッピングによって、HTTP ステータスコード、応答本文、応答ヘッダーは、Lambda 関数、HTTP プロキシ、または AWS のサービスプロキシから送信されたものと異なる場合があります。
   + [**ログ**] はシミュレートされた Amazon CloudWatch Logs エントリで、このメソッドが API Gateway コンソール外で呼び出された場合は書き込まれています。
**注記**  
CloudWatch Logs エントリはシミュレートされていますが、メソッドの呼び出しの結果は現実のものです。

 API Gateway コンソールの使用に加えて、AWS CLI、または API Gateway 用の AWS SDK を使用してメソッドの呼び出しをテストすることもできます。AWS CLI を使用してこれを行う方法については、「[test-invoke-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/test-invoke-method.html)」を参照してください。

# REST API 用に API Gateway で生成された Java SDK を使用する
<a name="how-to-call-apigateway-generated-java-sdk"></a>

このセクションでは、[単純な電卓](simple-calc-lambda-api-swagger-definition.md)の API を例として使用し、REST API に対して API Gateway で生成された Java SDK を使用するステップを示します。先に進む前に、「[API Gateway で REST API の SDK を生成する](how-to-generate-sdk.md)」のステップを完了する必要があります。

**API Gateway で生成した Java SDK をインストールして使用するには**

1. ダウンロード済みの API Gateway で生成された .zip ファイルのコンテンツを抽出します。

1. [Apache Maven](https://maven.apache.org/) (バージョン 3.5 以降が必要です) をダウンロードしてインストールします。

1. [JDK 8](https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html) をダウンロードしてインストールします。

1. `JAVA_HOME` 環境変数を設定します。

1.  解凍した SDK フォルダ内の pom.xml ファイルに移動します。このフォルダーは、デフォルトでは `generated-code` です。**mvn install** コマンドを実行し、コンパイルされたアーティファクトファイルをローカルの Maven リポジトリにインストールします。これにより、コンパイル済み SDK ライブラリを含む `target` フォルダーが作成されます。

1.  空のディレクトリで次のコマンドを入力し、インストールした SDK ライブラリを使用して API を呼び出すためのクライアントプロジェクトスタブを作成します。

   ```
   mvn -B archetype:generate \
       -DarchetypeGroupdId=org.apache.maven.archetypes \
       -DgroupId=examples.aws.apig.simpleCalc.sdk.app \
       -DartifactId=SimpleCalc-sdkClient
   ```
**注記**  
 上のコマンドで区切り記号の `\` は読みやすくするために使用しています。コマンド全体は区切り記号がない単一の行となります。

    このコマンドでは、アプリケーションスタブを作成します。アプリケーションスタブには、プロジェクトのルートディレクトリ (上のコマンドの `pom.xml`SimpleCalc-sdkClient`src`) の * ファイルと * フォルダが含まれます。当初は、ソースファイルとして `src/main/java/{package-path}/App.java` と `src/test/java/{package-path}/AppTest.java` の 2 つがあります。この例では、*\$1package-path\$1* は `examples/aws/apig/simpleCalc/sdk/app` です。このパッケージパスは `DarchetypeGroupdId` の値から取得されます。`App.java` ファイルは、クライアントアプリケーションのテンプレートとして使用できます。また、必要に応じて同じフォルダーに他のファイルを追加できます。`AppTest.java` ファイルは、アプリケーションのユニットテストテンプレートとして使用できます。また、必要に応じて同じテストフォルダーに他のテストコードファイルを追加できます。

1. 生成された `pom.xml` ファイルのパッケージ依存関係を以下のように更新し、必要に応じてプロジェクトの `groupId`、`artifactId`、`version`、`name` の各プロパティを置き換えます。

   ```
   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>examples.aws.apig.simpleCalc.sdk.app</groupId>
     <artifactId>SimpleCalc-sdkClient</artifactId>
     <packaging>jar</packaging>
     <version>1.0-SNAPSHOT</version>
     <name>SimpleCalc-sdkClient</name>
     <url>http://maven.apache.org</url>
   
      <dependencies>
         <dependency>
             <groupId>com.amazonaws</groupId>
             <artifactId>aws-java-sdk-core</artifactId>
             <version>1.11.94</version>
         </dependency>
         <dependency>
             <groupId>my-apig-api-examples</groupId>
             <artifactId>simple-calc-sdk</artifactId>
             <version>1.0.0</version>
         </dependency>
         
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.12</version>
         <scope>test</scope>
       </dependency>
   
       <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
           <version>2.5</version>
       </dependency>    
     </dependencies>
   
     <build>
       <plugins>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.5.1</version>
           <configuration>
             <source>1.8</source>
             <target>1.8</target>
           </configuration>
         </plugin>
       </plugins>
     </build>
   </project>
   ```
**注記**  
 `aws-java-sdk-core` の依存アーティファクトの新しいバージョンが上記で指定されたバージョン (`1.11.94`) と互換性がない場合は、`<version>` タグを新しいバージョンに更新する必要があります。

1.  次に、SDK の `getABOp(GetABOpRequest req)`、`getApiRoot(GetApiRootRequest req)`、`postApiRoot(PostApiRootRequest req)` の各メソッドを呼び出して、SDK で API を呼び出す方法を示します。これらのメソッドは、`GET /{a}/{b}/{op}`、`GET /?a={x}&b={y}&op={operator}`、`POST /` の各メソッドに対応します。API リクエストのペイロードはそれぞれ `{"a": x, "b": y, "op": "operator"}` です。

    次のように `App.java` ファイルを更新します。

   ```
   package examples.aws.apig.simpleCalc.sdk.app;
   
   import java.io.IOException;
   
   import com.amazonaws.opensdk.config.ConnectionConfiguration;
   import com.amazonaws.opensdk.config.TimeoutConfiguration;
   
   import examples.aws.apig.simpleCalc.sdk.*;
   import examples.aws.apig.simpleCalc.sdk.model.*;
   import examples.aws.apig.simpleCalc.sdk.SimpleCalcSdk.*;
   
   public class App 
   {
       SimpleCalcSdk sdkClient;
   
       public App() {
           initSdk();
       }
   
       // The configuration settings are for illustration purposes and may not be a recommended best practice.
       private void initSdk() {
           sdkClient = SimpleCalcSdk.builder()
                 .connectionConfiguration(
                     new ConnectionConfiguration()
                           .maxConnections(100)
                           .connectionMaxIdleMillis(1000))
                 .timeoutConfiguration(
                     new TimeoutConfiguration()
                           .httpRequestTimeout(3000)
                           .totalExecutionTimeout(10000)
                           .socketTimeout(2000))
           .build();
   
       }
       // Calling shutdown is not necessary unless you want to exert explicit control of this resource.
       public void shutdown() {
           sdkClient.shutdown();
       }
        
       // GetABOpResult getABOp(GetABOpRequest getABOpRequest)
       public Output getResultWithPathParameters(String x, String y, String operator) {
       	operator = operator.equals("+") ? "add" : operator;
       	operator = operator.equals("/") ? "div" : operator; 
   
           GetABOpResult abopResult = sdkClient.getABOp(new GetABOpRequest().a(x).b(y).op(operator));
           return abopResult.getResult().getOutput();
       }
   
       public Output getResultWithQueryParameters(String a, String b, String op) {
           GetApiRootResult rootResult = sdkClient.getApiRoot(new GetApiRootRequest().a(a).b(b).op(op));
           return rootResult.getResult().getOutput();
       }
   
       public Output getResultByPostInputBody(Double x, Double y, String o) {
       	PostApiRootResult postResult = sdkClient.postApiRoot(
       		new PostApiRootRequest().input(new Input().a(x).b(y).op(o)));
       	return postResult.getResult().getOutput();
       }
   
       public static void main( String[] args )
       {
           System.out.println( "Simple calc" );
           // to begin
           App calc = new App();
           
           // call the SimpleCalc API
           Output res = calc.getResultWithPathParameters("1", "2", "-");
           System.out.printf("GET /1/2/-: %s\n", res.getC());
   
           // Use the type query parameter
           res = calc.getResultWithQueryParameters("1", "2", "+");
           System.out.printf("GET /?a=1&b=2&op=+: %s\n", res.getC());
   
           // Call POST with an Input body.
           res = calc.getResultByPostInputBody(1.0, 2.0, "*");
           System.out.printf("PUT /\n\n{\"a\":1, \"b\":2,\"op\":\"*\"}\n %s\n", res.getC());
   
           
       }
   }
   ```

    上の例で、SDK クライアントをインスタンス化するために使用している設定はサンプルであり、必ずしも推奨されるベストプラクティスではありません。また、`sdkClient.shutdown()` の呼び出しはオプションです。リソースを解放するタイミングを正確に制御する場合などに役立ちます。

 Java SDK を使用して API を呼び出すための基本的なパターンを示しました。必要に応じて手順を拡張し、他の API メソッドを呼び出すことができます。

# REST API 用に API Gateway で生成された Android SDK を使用する
<a name="how-to-generate-sdk-android"></a>

このセクションでは、REST API 用に API Gateway で生成された Android SDK を使用するステップを説明します。先に進む前に、「[API Gateway で REST API の SDK を生成する](how-to-generate-sdk.md)」のステップを済ませている必要があります。

**注記**  
 生成された SDK は、Android 4.4 以前とは互換性がありません。詳細については、「[Amazon API Gateway に関する重要な注意点](api-gateway-known-issues.md)」を参照してください。

**API Gateway で生成された Android SDK をインストールして使用するには**

1. ダウンロード済みの API Gateway で生成された .zip ファイルのコンテンツを抽出します。

1. [Apache Maven](https://maven.apache.org/) をダウンロードしてインストールします (バージョン 3.x を推奨)。

1. [JDK 8](https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html) をダウンロードしてインストールします。

1. `JAVA_HOME` 環境変数を設定します。

1. **mvn install** コマンドを実行し、コンパイルされたアーティファクトファイルをローカルの Maven リポジトリにインストールします。これにより、コンパイル済み SDK ライブラリを含む `target` フォルダーが作成されます。

1. `target` フォルダからの SDK ファイル (ファイルの名前は、 `simple-calcsdk-1.0.0.jar`など、SDK の生成時に指定した **Artifact ID** および **Artifact バージョン**に由来するものです) を、`target/lib` フォルダからのその他すべてのライブラリとともに、プロジェクトの `lib` フォルダにコピーします。

   Andriod Studio を使用している場合は、クライアントアプリケーションモジュールで `libs` フォルダを作成し、このフォルダ内に必要な .jar ファイルをコピーします。モジュールの gradle ファイルの依存関係セクションに、以下が含まれていることを確認します。

   ```
       compile fileTree(include: ['*.jar'], dir: 'libs')
       compile fileTree(include: ['*.jar'], dir: 'app/libs')
   ```

   重複した .jar ファイルが宣言されていないことを確認します。

1. `ApiClientFactory` クラスを使用して、API Gateway で生成された SDK を初期化します。例:

   ```
   ApiClientFactory factory = new ApiClientFactory();
   
   // Create an instance of your SDK. Here, 'SimpleCalcClient.java' is the compiled java class for the SDK generated by API Gateway. 
   final SimpleCalcClient client = factory.build(SimpleCalcClient.class);
   
   // Invoke a method: 
   //   For the 'GET /?a=1&b=2&op=+' method exposed by the API, you can invoke it by calling the following SDK method:
   
   Result output = client.rootGet("1", "2", "+");
   
   //     where the Result class of the SDK corresponds to the Result model of the API.
   //
   
   //   For the 'GET /{a}/{b}/{op}'  method exposed by the API, you can call the following SDK method to invoke the request,
   
   Result output = client.aBOpGet(a, b, c);
   
   //     where a, b, c can be "1", "2", "add", respectively.
   
   //   For the following API method:
   //        POST /
   //        host: ...
   //        Content-Type: application/json
   //    
   //        { "a": 1, "b": 2, "op": "+" }
   // you can call invoke it by calling the rootPost method of the SDK as follows:
   Input body = new Input();
   input.a=1;
   input.b=2;
   input.op="+";
   Result output = client.rootPost(body);
   
   //      where the Input class of the SDK corresponds to the Input model of the API.
   
   // Parse the result:
   //     If the 'Result' object is { "a": 1, "b": 2, "op": "add", "c":3"}, you retrieve the result 'c') as 
   
   String result=output.c;
   ```

1. Amazon Cognito 認証情報プロバイダーを使用して API への呼び出しを認可するには、次の例で示すように API Gateway で生成された SDK を使用して `ApiClientFactory` クラスで AWS 認証情報のセットを渡します。

   ```
   // Use CognitoCachingCredentialsProvider to provide AWS credentials
   // for the ApiClientFactory
   AWSCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
           context,          // activity context
           "identityPoolId", // Cognito identity pool id
           Regions.US_EAST_1 // region of Cognito identity pool
   );
   
   ApiClientFactory factory = new ApiClientFactory()
     .credentialsProvider(credentialsProvider);
   ```

1. API Gateway で生成された SDK で API キーを設定するには、次のようなコードを使用します。

   ```
   ApiClientFactory factory = new ApiClientFactory()
     .apiKey("YOUR_API_KEY");
   ```

# REST API 用に API Gateway で生成された JavaScript SDK を使用する
<a name="how-to-generate-sdk-javascript"></a>

次の手順は、API Gateway によって生成された JavaScript SDK を使用する方法を示しています。

**注記**  
これらの手順は、すでに「[API Gateway で REST API の SDK を生成する](how-to-generate-sdk.md)」の手順を完了していることを前提としています。

**重要**  
API に ANY メソッドのみが定義された場合、生成された SDK パッケージに `apigClient.js` ファイルは含まれず、ANY メソッドを自分で定義する必要があります。

**REST API に対して API Gateway で生成された JavaScript SDK をインストールし、開始して呼び出すには**

1. ダウンロード済みの API Gateway で生成された .zip ファイルのコンテンツを抽出します。

1. API Gateway で生成された SDK で呼び出すすべてのメソッドで Cross-Origin Resource Sharing (CORS) を有効にします。手順については、[API Gateway での REST API の CORS](how-to-cors.md) を参照してください。

1. ウェブページで、以下のスクリプトへの参照を含めます。

   ```
   <script type="text/javascript" src="lib/axios/dist/axios.standalone.js"></script>
   <script type="text/javascript" src="lib/CryptoJS/rollups/hmac-sha256.js"></script>
   <script type="text/javascript" src="lib/CryptoJS/rollups/sha256.js"></script>
   <script type="text/javascript" src="lib/CryptoJS/components/hmac.js"></script>
   <script type="text/javascript" src="lib/CryptoJS/components/enc-base64.js"></script>
   <script type="text/javascript" src="lib/url-template/url-template.js"></script>
   <script type="text/javascript" src="lib/apiGatewayCore/sigV4Client.js"></script>
   <script type="text/javascript" src="lib/apiGatewayCore/apiGatewayClient.js"></script>
   <script type="text/javascript" src="lib/apiGatewayCore/simpleHttpClient.js"></script>
   <script type="text/javascript" src="lib/apiGatewayCore/utils.js"></script>
   <script type="text/javascript" src="apigClient.js"></script>
   ```

1. コードで、API Gateway で生成された SDK を初期化します。次のようなコードを使用します。

   ```
   var apigClient = apigClientFactory.newClient();
   ```

   API Gateway で生成された SDK を AWS 認証情報で初期化するには、次のようなコードを使用します。AWS 認証情報を使用すると、API に対するすべてのリクエストに署名が付与されます。

   ```
   var apigClient = apigClientFactory.newClient({
     accessKey: 'ACCESS_KEY',
     secretKey: 'SECRET_KEY',
   });
   ```

   API Gateway で生成された SDK で API キーを使用するには、次のようなコードを使用し、API キーをパラメータとして `Factory` オブジェクトに渡すことができます。API キーを使用する場合は、`x-api-key` ヘッダーの一部として指定され、API に対するすべてのリクエストに署名が付与されます。これは、各リクエストに適切な CORS Accept ヘッダーを設定する必要があることを意味します。

   ```
   var apigClient = apigClientFactory.newClient({
     apiKey: 'API_KEY'
   });
   ```

   

1. 以下のようなコードを使用して API Gateway で API メソッドを呼び出します。各呼び出しから、成功または失敗のコールバックとともに promise が返されます。

   ```
   var params = {
     // This is where any modeled request parameters should be added.
     // The key is the parameter name, as it is defined in the API in API Gateway.
     param0: '',
     param1: ''
   };
   
   var body = {
     // This is where you define the body of the request,
   };
   
   var additionalParams = {
     // If there are any unmodeled query parameters or headers that must be
     //   sent with the request, add them here.
     headers: {
       param0: '',
       param1: ''
     },
     queryParams: {
       param0: '',
       param1: ''
     }
   };
   
   apigClient.methodName(params, body, additionalParams)
       .then(function(result){
         // Add success callback code here.
       }).catch( function(result){
         // Add error callback code here.
       });
   ```

   ここで、*methodName* は、メソッドリクエストのリソースパスと HTTP 動詞から作成されます。SimpleCalc API の場合、次の API メソッドの SDK メソッド 

   ```
   1. GET /?a=...&b=...&op=...
   2. POST /
   
      { "a": ..., "b": ..., "op": ...}
   3. GET /{a}/{b}/{op}
   ```

   対応する SDK メソッドは次のとおりです。

   ```
   1. rootGet(params);      // where params={"a": ..., "b": ..., "op": ...} is resolved to the query parameters
   2. rootPost(null, body); // where body={"a": ..., "b": ..., "op": ...}
   3. aBOpGet(params);      // where params={"a": ..., "b": ..., "op": ...} is resolved to the path parameters
   ```

   

# API Gateway によって生成された Ruby SDK を REST API で使用する
<a name="how-to-call-sdk-ruby"></a>

次の手順は、API Gateway によって生成された Ruby SDK を使用する方法を示しています。

**注記**  
これらの手順は、すでに「[API Gateway で REST API の SDK を生成する](how-to-generate-sdk.md)」の手順を完了していることを前提としています。

**REST API に対して API Gateway で生成された Ruby SDK をインストールし、開始して呼び出すには**

1. ダウンロードした Ruby SDK ファイルを解凍します。生成された SDK ソースは、次のように表示されます。  
![\[ダウンロードした Ruby SDK ファイルを Ruby モジュールに解凍します\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/ruby-gem-of-generated-sdk-for-simplecalc.png)

   

1.  ターミナルウィンドウで次のシェルコマンドを使用して、生成された SDK ソースから Ruby Gem を構築します。

   ```
   # change to /simplecalc-sdk directory
   cd simplecalc-sdk
   
   # build the generated gem
   gem build simplecalc-sdk.gemspec
   ```

   この後、[**simplecalc-sdk-1.0.0.gem**] が利用可能になります。

1.  gem をインストールします。

   ```
   gem install simplecalc-sdk-1.0.0.gem
   ```

1.  クライアントアプリケーションを作成します。アプリで Ruby SDK クライアントをインスタンス化して初期化します。

   ```
   require 'simplecalc-sdk'
   client = SimpleCalc::Client.new(
       http_wire_trace: true,
       retry_limit: 5,
       http_read_timeout: 50
   )
   ```

   API に `AWS_IAM` タイプの認可が設定されている場合、初期化中に `accessKey` と `secretKey` を指定して、発信者の AWS 認証情報を含めることができます。

   ```
   require 'pet-sdk'
   client = Pet::Client.new(
       http_wire_trace: true,
       retry_limit: 5,
       http_read_timeout: 50,
       access_key_id: 'ACCESS_KEY',
       secret_access_key: 'SECRET_KEY'
   )
   ```

1.  アプリで SDK を使用して API 呼び出しを行います。
**ヒント**  
 SDK のメソッド呼び出し規則に精通していない場合は、生成された SDK の `client.rb` フォルダの `lib` ファイルを確認できます。このフォルダには、サポートされている各 API メソッド呼び出しのドキュメントが含まれています。

   サポートされているオペレーションを検出するには:

   ```
   # to show supported operations:
   puts client.operation_names
   ```

   これにより、`GET /?a={.}&b={.}&op={.}`、`GET /{a}/{b}/{op}`、および `POST /` の API メソッドに対応する次のような表示になります。必要に応じて `{a:"…", b:"…", op:"…"}` 形式のペイロードを加えます。

   ```
   [:get_api_root, :get_ab_op, :post_api_root]
   ```

   `GET /?a=1&b=2&op=+`API メソッドを呼び出すには、以下の Ruby SDK メソッドを呼び出します。

   ```
   resp = client.get_api_root({a:"1", b:"2", op:"+"})
   ```

   `POST /` を使用して、`{a: "1", b: "2", "op": "+"}` API メソッドを呼び出すには、以下の Ruby SDK メソッドを呼び出します。

   ```
   resp = client.post_api_root(input: {a:"1", b:"2", op:"+"})
   ```

   `GET /1/2/+`API メソッドを呼び出すには、以下の Ruby SDK メソッドを呼び出します。

   ```
   resp = client.get_ab_op({a:"1", b:"2", op:"+"})
   ```

   SDK メソッド呼び出しが正常に終了すると次のレスポンスを返します。

   ```
   resp : {
       result: {
           input: {
               a: 1,
               b: 2,
               op: "+"
           },
           output: {
               c: 3
           }
       }
   }
   ```

# Objective-C または Swift で REST API 用に API Gateway で生成された iOS SDK を使用する
<a name="how-to-generate-sdk-ios"></a>

このチュートリアルでは、Objective-C または Swift アプリケーションにおいて、REST API の API Gateway で生成された iOS SDK を使用して基盤となる API を呼び出す方法について説明します。以下のトピックでは、[SimpleCalc API](simple-calc-lambda-api.md) を例として使います。
+ AWS Mobile SDK の必要なコンポーネントを Xcode プロジェクト内にインストールする方法
+ API のメソッドを呼び出す前に API クライアントオブジェクトを作成する方法
+ API クライアントオブジェクトで対応する SDK メソッドを介して API のメソッドを呼び出す方法
+ SDK の対応するモデルクラスを使用してメソッドの入力を準備し、その結果を解析する方法

**Topics**
+ [

## 生成された iOS SDK (Objective-C) を使用して API を呼び出す
](#how-to-use-sdk-ios-objc)
+ [

## 生成された iOS SDK (Swift) を使用して API を呼び出す
](#how-to-generate-sdk-ios-swift)

## 生成された iOS SDK (Objective-C) を使用して API を呼び出す
<a name="how-to-use-sdk-ios-objc"></a>

次の手順を開始する前に、Objective-C で iOS 用の「[API Gateway で REST API の SDK を生成する](how-to-generate-sdk.md)」のステップを実行し、生成された SDK の .zip ファイルをダウンロードする必要があります。

### API Gateway で生成された AWS Mobile SDK と iOS SDK を Objective-C プロジェクトでインストールする
<a name="use-sdk-ios-objc-install-sdk"></a>

次の手順では、SDK をインストールする方法を説明します。

**API Gateway で生成された iOS SDK を Objective-C でインストールして使用するには**

1. ダウンロード済みの API Gateway で生成された .zip ファイルのコンテンツを抽出します。[SimpleCalc API](simple-calc-lambda-api.md) を使用して、解凍した SDK フォルダの名前を **sdk\$1objc\$1simple\$1calc** などに変更することもできます。この SDK フォルダーには、`README.md` ファイルと `Podfile` ファイルが含まれています。`README.md` ファイルには、SDK をインストールして使用するための手順が記載されています。このチュートリアルでは、この手順について詳しく説明します。インストールでは、[CocoaPods](https://cocoapods.org) を使用して必要な API Gateway ライブラリとその他の依存する AWS Mobile SDK コンポーネントをインポートします。SDK をアプリケーションの XCode プロジェクト内にインポートするには、`Podfile` を更新する必要があります。解凍した SDK フォルダー内には、API の生成された SDK のソースコードを含む `generated-src` フォルダーもあります。

1. Xcode を起動し、新しい iOS Objective-C プロジェクトを作成します。プロジェクトのターゲットを書き留めておきます。それを `Podfile` に設定する必要があります。

      
![\[Xcode でターゲットを検索します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-find-target.png)

1. CocoaPods を使用して AWS Mobile SDK for iOS を Xcode プロジェクト内にインポートするには、以下の操作を行います。

   1. ターミナルウィンドウで次のコマンドを実行して、CocoaPods をインストールします。

      ```
      sudo gem install cocoapods
      pod setup
      ```

   1. 抽出した SDK フォルダー内にある `Podfile` ファイルを、Xcode プロジェクトファイルがある同じディレクトリ内にコピーします。次のブロックのターゲット名を

      ```
      target '<YourXcodeTarget>' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      次のようにプロジェクトのターゲット名に置き換えます。

      ```
      target 'app_objc_simple_calc' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      Xcode プロジェクトに `Podfile` という名前のファイルが既に含まれている場合は、次のコード行を追加します。

      ```
      pod 'AWSAPIGateway', '~> 2.4.7'
      ```

   1. ターミナルウィンドウを開いて、次のコマンドを実行します。

      ```
      pod install
      ```

      これにより、API Gateway コンポーネント とその他の依存する AWS Mobile SDK コンポーネントがインストールされます。

   1. Xcode プロジェクトを閉じて `.xcworkspace` ファイルを開き、Xcode を再起動します。

   1. 抽出した SDK の `.h` ディレクトリから、すべての `.m` ファイルと `generated-src` ファイルを Xcode プロジェクト内に追加します。

         
![\[.h ファイルと .m ファイルは generated-src にあります\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-add-sdk-src.png)

   AWS Mobile SDK for iOS Objective-C をプロジェクト内にインポートするために、明示的に AWS Mobile SDK をダウンロードするか、[Carthage](https://github.com/Carthage/Carthage#installing-carthage) を使用する場合は、*README.md* ファイルの手順に従ってください。この 2 つのオプションのうち、必ず 1 つのみを使用して AWS Mobile SDK をインポートしてください。

### API Gateway で生成された iOS SDK を使用して Objective-C オブジェクトで API メソッドを呼び出す
<a name="use-sdk-ios-objc-call-sdk"></a>

SDK の生成時に、メソッドの入力 (`Input`) と出力 (`Result`) を 2 つのモデルとする [SimpleCalc](simple-calc-lambda-api.md) API のプレフィックスとして `SIMPLE_CALC` を使用すると、結果の API クライアントクラスは `SIMPLE_CALCSimpleCalcClient` となり、対応するデータクラスはそれぞれ `SIMPLE_CALCInput` と `SIMPLE_CALCResult` になります。API のリクエストとレスポンスは、次のように SDK メソッドにマッピングされます。
+ 次の API リクエストは

  ```
  GET /?a=...&b=...&op=...
  ```

  次のような SDK メソッドになります。

  ```
  (AWSTask *)rootGet:(NSString *)op a:(NSString *)a b:(NSString *)b
  ```

  `AWSTask.result` モデルをメソッドのレスポンスに追加した場合、`SIMPLE_CALCResult` プロパティのタイプは `Result` です。それ以外の場合、プロパティは `NSDictionary` タイプになります。
+ 次の API リクエストは

  ```
  POST /
      
  {
     "a": "Number",
     "b": "Number",
     "op": "String"
  }
  ```

  次のような SDK メソッドになります。

  ```
  (AWSTask *)rootPost:(SIMPLE_CALCInput *)body
  ```
+ 次の API リクエストは

  ```
  GET /{a}/{b}/{op}
  ```

  次のような SDK メソッドになります。

  ```
  (AWSTask *)aBOpGet:(NSString *)a b:(NSString *)b op:(NSString *)op
  ```

次の手順では、Objective-C アプリケーションのソースコードで API メソッドを呼び出す方法を説明します。たとえば、`viewDidLoad` ファイルで `ViewController.m` デリゲートの一部として呼び出します。

**API Gateway で生成された iOS SDK を介して API を呼び出すには**

1. API クライアントクラスのヘッダーファイルをインポートして、API クライアントクラスをアプリケーションで呼び出せるようにします。

   ```
   #import "SIMPLE_CALCSimpleCalc.h"
   ```

   `#import` ステートメントにより、2 つのモデルクラスとして `SIMPLE_CALCInput.h` と `SIMPLE_CALCResult.h` もインポートされます。

1. API クライアントクラスをインスタンス化します。

   ```
   SIMPLE_CALCSimpleCalcClient *apiInstance = [SIMPLE_CALCSimpleCalcClient defaultClient];
   ```

   API で Amazon Cognito を使用するには、`defaultClient` メソッドを呼び出して API クライアントオブジェクトを作成する (前の例を参照) 前に、次に示すようにデフォルトの `AWSServiceManager` オブジェクトで `defaultServiceConfiguration` プロパティを設定します。

   ```
   AWSCognitoCredentialsProvider *creds = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:your_cognito_pool_id];
   AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:creds];
   AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
   ```

1. `GET /?a=1&b=2&op=+` メソッドを呼び出して、`1+2` を実行します。

   ```
   [[apiInstance rootGet: @"+" a:@"1" b:@"2"] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
       _textField1.text = [self handleApiResponse:task];
       return nil;
   }];
   ```

   ヘルパー関数の `handleApiResponse:task` は、結果を文字列としてフォーマットし、テキストフィールド (`_textField1`) に表示します。

   ```
   - (NSString *)handleApiResponse:(AWSTask *)task {
       if (task.error != nil) {
           return [NSString stringWithFormat: @"Error: %@", task.error.description];
       } else if (task.result != nil && [task.result isKindOfClass:[SIMPLE_CALCResult class]]) {
           return [NSString stringWithFormat:@"%@ %@ %@ = %@\n",task.result.input.a, task.result.input.op, task.result.input.b, task.result.output.c];
       }
       return nil;
   }
   ```

   結果として `1 + 2 = 3` と表示されます。

1. ペイロードを渡す `POST /` を呼び出して、`1-2` を実行します。

   ```
   SIMPLE_CALCInput *input = [[SIMPLE_CALCInput alloc] init];
       input.a = [NSNumber numberWithInt:1];
       input.b = [NSNumber numberWithInt:2];
       input.op = @"-";
       [[apiInstance rootPost:input] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
           _textField2.text = [self handleApiResponse:task];
           return nil;
       }];
   ```

   結果として `1 - 2 = -1` と表示されます。

1. `GET /{a}/{b}/{op}` を呼び出して、`1/2` を実行します。

   ```
   [[apiInstance aBOpGet:@"1" b:@"2" op:@"div"] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) {
       _textField3.text = [self handleApiResponse:task];
       return nil;
   }];
   ```

   結果として `1 div 2 = 0.5` と表示されます。ここで `div` が `/` の代わりに使用されているのは、バックエンドの[シンプルな Lambda 関数](simple-calc-nodejs-lambda-function.md)では URL エンコードされたパス変数が処理されないためです。

## 生成された iOS SDK (Swift) を使用して API を呼び出す
<a name="how-to-generate-sdk-ios-swift"></a>

次の手順を開始する前に、Swift で iOS 用の「[API Gateway で REST API の SDK を生成する](how-to-generate-sdk.md)」のステップを実行し、生成された SDK の .zip ファイルをダウンロードする必要があります。

**Topics**
+ [

### AWS Mobile SDK と API Gateway で生成された SDK を Swift プロジェクトでインストールする
](#use-sdk-ios-swift-install-sdk)
+ [

### API Gateway で生成された iOS SDK を介して Swift プロジェクトで API メソッドを呼び出す
](#use-sdk-ios-swift-call-api)

### AWS Mobile SDK と API Gateway で生成された SDK を Swift プロジェクトでインストールする
<a name="use-sdk-ios-swift-install-sdk"></a>

次の手順では、SDK をインストールする方法を説明します。

**API Gateway で生成された iOS SDK を Swift にインストールして使用するには**

1. ダウンロード済みの API Gateway で生成された .zip ファイルのコンテンツを抽出します。[SimpleCalc API](simple-calc-lambda-api.md) を使用して、解凍した SDK フォルダの名前を **sdk\$1swift\$1simple\$1calc** などに変更することもできます。この SDK フォルダーには、`README.md` ファイルと `Podfile` ファイルが含まれています。`README.md` ファイルには、SDK をインストールして使用するための手順が記載されています。このチュートリアルでは、この手順について詳しく説明します。インストールでは、[CocoaPods](https://cocoapods.org) を使用して AWS Mobile SDK の必要なコンポーネントをインポートします。SDK を Swift アプリケーションの XCode プロジェクト内にインポートするには、`Podfile` を更新する必要があります。解凍した SDK フォルダー内には、API の生成された SDK のソースコードを含む `generated-src` フォルダーもあります。

1. Xcode を起動し、新しい iOS Swift プロジェクトを作成します。プロジェクトのターゲットを書き留めておきます。それを `Podfile` に設定する必要があります。

      
![\[Xcode でターゲットを検索します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-find-target.png)

1. CocoaPods を使用して AWS Mobile SDK の必要なコンポーネントを Xcode プロジェクト内にインポートするには、以下の操作を実行します。

   1. ターミナルウィンドウで次のコマンドを実行して CocoaPods をインストールします (まだインストールしていない場合)。

      ```
      sudo gem install cocoapods
      pod setup
      ```

   1. 抽出した SDK フォルダー内にある `Podfile` ファイルを、Xcode プロジェクトファイルがある同じディレクトリ内にコピーします。次のブロックのターゲット名を

      ```
      target '<YourXcodeTarget>' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      次のようにプロジェクトのターゲット名に置き換えます。

      ```
      target 'app_swift_simple_calc' do
          pod 'AWSAPIGateway', '~> 2.4.7'
      end
      ```

      Xcode プロジェクト内の `Podfile` に正しいターゲットが既に設定されている場合は、次のコード行を `do ... end` ループに追加するだけで済みます。

      ```
      pod 'AWSAPIGateway', '~> 2.4.7'
      ```

   1. ターミナルウィンドウを開き、アプリケーションのディレクトリで次のコマンドを実行します。

      ```
      pod install
      ```

      これにより、API Gateway コンポーネント とその他の依存する AWS Mobile SDK コンポーネントがアプリケーションのプロジェクト内にインストールされます。

   1. Xcode プロジェクトを閉じて `*.xcworkspace` ファイルを開き、Xcode を再起動します。

   1. 抽出した `.h` ディレクトリから、SDK のヘッダーファイル (`.swift`) と Swift ソースコードファイル (`generated-src`) のすべてを Xcode プロジェクトに追加します。

         
![\[.h ファイルと .swift ファイルは generated-src にあります。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-add-sdk-src.png)

   1. Swift コードプロジェクトから AWS Mobile SDK の Objective-C ライブラリを呼び出せるようにするには、Xcode プロジェクト設定の [`Bridging_Header.h`Swift Compiler - General**] オプションの [**Objective-C Bridging Header**] プロパティで ** ファイルのパスを設定します。

         
![\[[Swift Compiler - General] で Bridging_Header.h ファイルパスを設定します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-bridging-header.png)
**ヒント**  
Xcode の検索ボックスに「**bridging**」と入力し、[**Objective-C Bridging Header**] プロパティを見つけます。

   1. Xcode プロジェクトを構築し、それが適切に設定されていることを確認してから先に進みます。Xcode で使用している Swift のバージョンが AWS Mobile SDK でサポートされているものより新しい場合は、Swift コンパイラエラーが発生します。この場合は、[**Swift Compiler - Version (Swift コンパイラ - バージョン)**] 設定の [**Use Legacy Swift Language Version**] プロパティを [**Yes**] に設定します。

         
![\[[Legacy Swift Language Version] プロパティを [Yes] に設定します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-legacy-swift-version.png)

   Swift で の AWS Mobile SDK for iOS をプロジェクト内にインポートするために、明示的に AWS Mobile SDK をダウンロードするか、[Carthage](https://github.com/Carthage/Carthage#installing-carthage) を使用する場合は、SDK パッケージに含まれている `README.md` ファイルに記載されている手順に従います。この 2 つのオプションのうち、必ず 1 つのみを使用して AWS Mobile SDK をインポートしてください。

### API Gateway で生成された iOS SDK を介して Swift プロジェクトで API メソッドを呼び出す
<a name="use-sdk-ios-swift-call-api"></a>

SDK の生成時に、API のリクエストとレスポンスの入力 (`Input`) と出力 (`Result`) を記述する 2 つのモデルがあるこの [SimpleCalc API](simple-calc-lambda-api.md) のプレフィックスとして `SIMPLE_CALC` を使用すると、結果の API クライアントクラスは `SIMPLE_CALCSimpleCalcClient` となり、対応するデータクラスはそれぞれ `SIMPLE_CALCInput` と `SIMPLE_CALCResult` になります。API のリクエストとレスポンスは、次のように SDK メソッドにマッピングされます。
+ 次の API リクエストは

  ```
  GET /?a=...&b=...&op=...
  ```

  次のような SDK メソッドになります。

  ```
  public func rootGet(op: String?, a: String?, b: String?) -> AWSTask
  ```

  `AWSTask.result` モデルをメソッドのレスポンスに追加した場合、`SIMPLE_CALCResult` プロパティのタイプは `Result` です。それ以外の場合は、`NSDictionary` タイプになります。
+ 次の API リクエストは

  ```
  POST /
      
  {
     "a": "Number",
     "b": "Number",
     "op": "String"
  }
  ```

  次のような SDK メソッドになります。

  ```
  public func rootPost(body: SIMPLE_CALCInput) -> AWSTask
  ```
+ 次の API リクエストは

  ```
  GET /{a}/{b}/{op}
  ```

  次のような SDK メソッドになります。

  ```
  public func aBOpGet(a: String, b: String, op: String) -> AWSTask
  ```

次の手順では、Swift アプリケーションのソースコードで API メソッドを呼び出す方法を示します。たとえば、`viewDidLoad()` ファイルで `ViewController.m` デリゲートの一部として呼び出します。

**API Gateway で生成された iOS SDK を介して API を呼び出すには**

1. API クライアントクラスをインスタンス化します。

   ```
   let client = SIMPLE_CALCSimpleCalcClient.default()
   ```

   API で Amazon Cognito を使用するには、`default` メソッド (前出) を取得する前にデフォルトの AWS のサービス設定 (後出) を設定します。

   ```
   let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "my_pool_id")        
   let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)        
   AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
   ```

1. `GET /?a=1&b=2&op=+` メソッドを呼び出して、`1+2` を実行します。

   ```
   client.rootGet("+", a: "1", b:"2").continueWithBlock {(task: AWSTask) -> AnyObject? in
       self.showResult(task)
       return nil
   }
   ```

   上のヘルパー関数 `self.showResult(task)` は結果またはエラーをコンソールに表示します。次に例を示します。

   ```
   func showResult(task: AWSTask) {
       if let error = task.error {
           print("Error: \(error)")
       } else if let result = task.result {
           if result is SIMPLE_CALCResult {
               let res = result as! SIMPLE_CALCResult
               print(String(format:"%@ %@ %@ = %@", res.input!.a!, res.input!.op!, res.input!.b!, res.output!.c!))
           } else if result is NSDictionary {
               let res = result as! NSDictionary
               print("NSDictionary: \(res)")
           }
       }
   }
   ```

   本稼働アプリケーションでは、結果またはエラーをテキストフィールドに表示できます。結果として `1 + 2 = 3` と表示されます。

1. ペイロードを渡す `POST /` を呼び出して、`1-2` を実行します。

   ```
   let body = SIMPLE_CALCInput()
   body.a=1
   body.b=2
   body.op="-"
   client.rootPost(body).continueWithBlock {(task: AWSTask) -> AnyObject? in
       self.showResult(task)
       return nil
   }
   ```

   結果として `1 - 2 = -1` と表示されます。

1. `GET /{a}/{b}/{op}` を呼び出して、`1/2` を実行します。

   ```
   client.aBOpGet("1", b:"2", op:"div").continueWithBlock {(task: AWSTask) -> AnyObject? in
       self.showResult(task)
       return nil
   }
   ```

   結果として `1 div 2 = 0.5` と表示されます。ここで `div` が `/` の代わりに使用されているのは、バックエンドの[シンプルな Lambda 関数](simple-calc-nodejs-lambda-function.md)では URL エンコードされたパス変数が処理されないためです。

# API Gateway で OpenAPI を使用して REST API を開発する
<a name="api-gateway-import-api"></a>

API Gateway を使用して、REST API を外部定義ファイルから API Gateway にインポートできます。現在、API Gateway は [OpenAPI v2.0](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md) および [OpenAPI v3.0](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.1.md) 定義ファイルをサポートしています。この例外が「[Amazon API Gateway の REST API に関する重要な注意点](api-gateway-known-issues.md#api-gateway-known-issues-rest-apis)」に記載されています。新しい定義で上書きして API を更新したり、既存の API と定義をマージしたりできます。リクエスト URL で `mode` クエリパラメータを使用して、オプションを指定します。

API Gateway コンソールからサンプル API 機能を使用するチュートリアルについては、「[チュートリアル: サンプルをインポートして REST API を作成する](api-gateway-create-api-from-example.md)」を参照してください。

**Topics**
+ [

# エッジ最適化 API を API Gateway にインポートする
](import-edge-optimized-api.md)
+ [

# リージョン API を API Gateway にインポートする
](import-export-api-endpoints.md)
+ [

# OpenAPI ファイルをインポートして既存の API 定義を更新する
](api-gateway-import-api-update.md)
+ [

# OpenAPI`basePath` プロパティを設定
](api-gateway-import-api-basePath.md)
+ [

# OpenAPI インポート用の AWS 変数
](import-api-aws-variables.md)
+ [

# API Gateway への API のインポートによるエラーと警告
](api-gateway-import-api-errors-warnings.md)
+ [

# API Gateway から REST API をエクスポートする
](api-gateway-export-api.md)

# エッジ最適化 API を API Gateway にインポートする
<a name="import-edge-optimized-api"></a>

API OpenAPI 定義ファイルをインポートして、新しいエッジ最適化 API を作成できます。そのためには、OpenAPI ファイルに加えて `EDGE` エンドポイントタイプをインポートオペレーションへの入力として指定します。これは、API Gateway コンソール、AWS CLI、または AWS SDK を使用して行うこともできます。

API Gateway コンソールからサンプル API 機能を使用するチュートリアルについては、「[チュートリアル: サンプルをインポートして REST API を作成する](api-gateway-create-api-from-example.md)」を参照してください。

**Topics**
+ [

## API Gateway コンソールを使用してエッジ最適化 API をインポートする
](#import-edge-optimized-api-with-console)
+ [

## AWS CLI を使用してエッジ最適化 API をインポートする
](#import-edge-optimized-api-with-awscli)

## API Gateway コンソールを使用してエッジ最適化 API をインポートする
<a name="import-edge-optimized-api-with-console"></a>

API Gateway コンソールを使用してエッジ最適化 API をインポートするには、次の操作を行います。

1. API Gateway コンソール ([https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)) にサインインします。

1. [**API の作成**] を選択します。

1. [**REST API**] で、[**インポート**] を選択します。

1.  API OpenAPI 定義をコピーしてコードエディタに貼り付けるか、**[ファイルの選択]** を選択してローカルドライブから OpenAPI ファイルを読み込みます。

1.  **[エンドポイントタイプ]** で、**[エッジ最適化]** を選択します。

1.  **[API の作成]** を選択して OpenAPI 定義のインポートを開始します。

## AWS CLI を使用してエッジ最適化 API をインポートする
<a name="import-edge-optimized-api-with-awscli"></a>

次の [import-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/import-rest-api.html) コマンドは、OpenAPI 定義ファイルから API をインポートして、新しいエッジ最適化 API を作成します。

```
aws apigateway import-rest-api \
    --fail-on-warnings \
    --body 'file://path/to/API_OpenAPI_template.json'
```

または、`endpointConfigurationTypes` クエリ文字列パラメータを `EDGE` に明示的に指定します。

```
aws apigateway import-rest-api \
    --parameters endpointConfigurationTypes=EDGE \
    --fail-on-warnings \
    --body 'file://path/to/API_OpenAPI_template.json'
```



# リージョン API を API Gateway にインポートする
<a name="import-export-api-endpoints"></a>

API のインポート時、API のリージョンのエンドポイント設定を選択できます。API Gateway コンソール、AWS CLI、または AWS SDK を使用できます。

API のエクスポート時、エクスポートされた API 定義に API エンドポイント設定は含まれません。

API Gateway コンソールからサンプル API 機能を使用するチュートリアルについては、「[チュートリアル: サンプルをインポートして REST API を作成する](api-gateway-create-api-from-example.md)」を参照してください。

**Topics**
+ [

## API Gateway コンソールを使用してリージョン API をインポートする
](#import-regional-api-with-console)
+ [

## AWS CLI を使用してリージョン API をインポートする
](#import-regional-api-with-awscli)

## API Gateway コンソールを使用してリージョン API をインポートする
<a name="import-regional-api-with-console"></a>

API Gateway コンソールを使用してリージョンのエンドポイントの API をインポートするには、以下の手順を実行します。

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. [**API の作成**] を選択します。

1. [**REST API**] で、[**インポート**] を選択します。

1.  API OpenAPI 定義をコピーしてコードエディタに貼り付けるか、**[ファイルの選択]** を選択してローカルドライブから OpenAPI ファイルを読み込みます。

1. **[API エンドポイントタイプ]** で、**[リージョン別]** を選択します。

1.  **[API の作成]** を選択して OpenAPI 定義のインポートを開始します。

## AWS CLI を使用してリージョン API をインポートする
<a name="import-regional-api-with-awscli"></a>

次の [import-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/import-rest-api.html) コマンドは、OpenAPI 定義ファイルをインポートし、エンドポイントタイプをリージョン別に設定します。

```
aws apigateway import-rest-api \
    --parameters endpointConfigurationTypes=REGIONAL \
    --fail-on-warnings \
    --body 'file://path/to/API_OpenAPI_template.json'
```

# OpenAPI ファイルをインポートして既存の API 定義を更新する
<a name="api-gateway-import-api-update"></a>

 API 定義をインポートできるのは、エンドポイント設定、ステージおよびステージ変数、または API キーへの参照を変更せずに既存の API を更新する場合のみです。

 インポートから更新への操作は、マージまたは上書きという 2 つのモードで行うことができます。

API (`A`) が別の API (`B`) にマージされると、作成された API では、2 つの API で矛盾する定義が共有されていない限り、`A` と `B` の両方の定義が保持されます。矛盾が発生した場合、マージする API (`A`) のメソッド定義によってマージ先の API (`B`) の対応するメソッド定義がオーバーライドされます。たとえば、`B` が `200` および `206` レスポンスを返す次のメソッドを宣言しているとします。

```
GET /a
POST /a
```

`A` は `200` および `400` レスポンスを返す次のメソッドを宣言しています。

```
GET /a
```

`A` が `B` にマージされると、作成される API は次のメソッドを生成します。

```
GET /a
```

`200` レスポンスと `400` レスポンスを返すメソッド。

```
POST /a
```

`200` レスポンスと `206` レスポンスを返すメソッド。

API のマージは、外部の API 定義を複数の小さな部分に分解し、それらの部分の変更を一度に 1 つのみ適用する場合に役立ちます。たとえば、複数のチームが API のさまざまな部分を担当し、異なるレートで変更を可能にする場合です。このモードでは、インポートされた定義で明確に定義されていない既存の API の項目はそのまま残されます。

API (`A`) によって別の API (`B`) がオーバーライドされ、作成される API には API (`A`) の定義が採用されます。API の上書きは、外部の API 定義に、API の完全な定義が含まれているときに役立ちます。このモードでは、インポートされた定義で明確に定義されていない既存の API の項目は削除されます。

 API をマージするには、`PUT` リクエストを `https://apigateway.<region>.amazonaws.com/restapis/<restapi_id>?mode=merge` に送信します。`restapi_id` パスのパラメータ値は、指定された API 定義のマージ先となる API を示します。

 次のコードスニペットは、指定された API がすでに API Gateway にあり、JSON の OpenAPI API 定義をペイロードとしてマージする `PUT` リクエストの例を示しています。

```
PUT /restapis/<restapi_id>?mode=merge
Host:apigateway.<region>.amazonaws.com
Content-Type: application/json
Content-Length: ...

An OpenAPI API definition in JSON
```

 更新オペレーションのマージでは、2 つの完全な API 定義を使用し、それらをマージします。小さい増分変更の場合は、[リソースの更新](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateResource.html)オペレーションを使用できます。

 API をオーバーライドするには、`PUT` リクエストを `https://apigateway.<region>.amazonaws.com/restapis/<restapi_id>?mode=overwrite` に送信します。`restapi_id` パスパラメータは、指定された API 定義で上書きされる API を示します。

 次のコードスニペットは、JSON 形式の OpenAPI 定義のペイロードでリクエストを上書きする例を示しています。

```
PUT /restapis/<restapi_id>?mode=overwrite
Host:apigateway.<region>.amazonaws.com
Content-Type: application/json
Content-Length: ...

An OpenAPI API definition in JSON
```

 `mode` クエリパラメータを指定しないと、マージが想定されます。

**注記**  
 `PUT` オペレーションはべき等ですが、アトミックではありません。つまり、処理中にシステムエラーが発生した場合、API は不正な状態になる可能性があります。ただし、オペレーションを正常に繰り返すと、API は最初のオペレーションが成功した場合と同じ最終状態になります。

# OpenAPI`basePath` プロパティを設定
<a name="api-gateway-import-api-basePath"></a>

[OpenAPI 2.0](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/2.0.md) では、`basePath` プロパティを使用して、`paths` プロパティに定義された各パスに先行する 1 つ以上のパス部分を提供できます。API Gateway にはリソースのパスを表現する複数の方法があるため、API のインポート機能には、インポート中に `basePath` プロパティを解釈するための次のオプションが用意されています。ignore、prepend、および split です。

「[https://swagger.io/docs/specification/api-host-and-base-path/](https://swagger.io/docs/specification/api-host-and-base-path/)」では、`basePath` は、最上位のプロパティではありません。代わりに、API Gateway は規則として[サーバー変数](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md#serverVariableObject)を使用します。API のインポート機能には、インポート中に基本パスを解釈するための同じオプションが用意されています。基本パスは次のように識別されます。
+ API に `basePath` 変数が含まれていない場合、API のインポート機能は `server.url` 文字列を確認して、`"/"` 以外のパスが含まれているかどうかを確認します。含まれている場合は、そのパスが基本パスとして使用されます。
+ API に含まれる `basePath` 変数が 1 つだけの場合、API のインポート機能は `server.url` で参照されていなくても、それを基本パスとして使用します。
+ API に複数の `basePath` 変数が含まれている場合、API のインポート機能は最初の変数のみを基本パスとして使用します。

## Ignore (無視)
<a name="api-gateway-import-api-basePath-ignore"></a>

OpenAPI ファイルの `basePath` の値が `/a/b/c` で、`paths` プロパティに `/e` および `/f` が含まれる場合に、次の `POST` または `PUT` リクエストがあるとします。

```
POST /restapis?mode=import&basepath=ignore
```



```
PUT /restapis/api_id?basepath=ignore
```

 この場合、API で次のリソースが発生します。
+ `/`
+ `/e`
+ `/f`

 その効果として、`basePath` を、これが存在しなかったかのように扱い、宣言された API のすべてのリソースは、ホストに対して相対的に提供されます。これを使用できるのは、たとえば、*基本パス*を含まない API マッピングや、本番ステージを参照する*ステージ*値を持つカスタムドメイン名がある場合です。

**注記**  
 API Gateway は、定義ファイルに明示的に宣言されていない場合でも、自動的にルートリソースを作成します。

 指定しない場合、`basePath` はデフォルトで `ignore` を受け取ります。

## Prepend
<a name="api-gateway-import-api-basePath-prepend"></a>

 OpenAPI ファイルの `basePath` の値が `/a/b/c` で、`paths` プロパティに `/e` および `/f` が含まれる場合に、次の `POST` または `PUT` リクエストがあるとします。

```
POST /restapis?mode=import&basepath=prepend
```



```
PUT /restapis/api_id?basepath=prepend
```

 この場合、API で次のリソースが発生します。
+ `/`
+ `/a`
+ `/a/b`
+ `/a/b/c`
+ `/a/b/c/e`
+ `/a/b/c/f`

 その効果として、(メソッドなしで) 追加のリソースとして `basePath` を処理し、宣言されたリソースセットに追加します。これを使用できるのは、たとえば、さまざまなチームが API パートの異なる部分を担当し、`basePath` が各チームの API 部分のパスの場所を参照できる場合です。

**注記**  
 API Gateway は、定義に明示的に宣言されていない場合でも、自動的に中間リソースを作成します。

## Split
<a name="api-gateway-import-api-basePath-split"></a>

 OpenAPI ファイルの `basePath` の値が `/a/b/c` で、`paths` プロパティに `/e` および `/f` が含まれる場合に、次の `POST` または `PUT` リクエストがあるとします。

```
POST /restapis?mode=import&basepath=split
```



```
PUT /restapis/api_id?basepath=split
```

 この場合、API で次のリソースが発生します。
+ `/`
+ `/b`
+ `/b/c`
+ `/b/c/e`
+ `/b/c/f`

 その効果として、最上位のパス部分 `/a` を、各リソースのパスの先頭として扱い、API 内で (メソッドなしで) 追加のリソースを作成します。これを使用できるのは、たとえば、`a` が、API の一部として公開するステージ名である場合です。

# OpenAPI インポート用の AWS 変数
<a name="import-api-aws-variables"></a>

OpenAPI 定義では、次の AWS 変数を使用できます。API Gateway は、API のインポート時に変数を解決します。変数を指定するには、`${variable-name}` を使用します。次の表は、使用可能な AWS 変数について説明しています。


| 変数名 | 説明 | 
| --- | --- | 
| AWS::AccountId | API をインポートする AWS アカウント ID。例: 123456789012。 | 
| AWS::Partition | API のインポート先の AWS パーティション。標準の AWS リージョンの場合、パーティションは aws です。 | 
| AWS::Region | API のインポート先の AWS リージョン。例: us-east-2。 | 

## AWS 変数の例
<a name="import-api-aws-variables-example"></a>

次の例では、AWS 変数を使用して統合用の AWS Lambda 関数を指定します。

------
#### [ OpenAPI 3.0 ]

```
openapi: "3.0.1"
info:
  title: "tasks-api"
  version: "v1.0"
paths:
  /:
    get:
      summary: List tasks
      description: Returns a list of tasks
      responses:
        200:
          description: "OK"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Task"
        500:
          description: "Internal Server Error"
          content: {}
      x-amazon-apigateway-integration:
        uri:
          arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:${AWS::Partition}:lambda:${AWS::Region}:${AWS::AccountId}:function:LambdaFunctionName/invocations
        responses:
          default:
            statusCode: "200"
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        contentHandling: "CONVERT_TO_TEXT"
        type: "aws_proxy"
components:
  schemas:
    Task:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
```

------

# API Gateway への API のインポートによるエラーと警告
<a name="api-gateway-import-api-errors-warnings"></a>

外部定義ファイルを API Gateway にインポートすると、API Gateway で警告やエラーが発生することがあります。以下のセクションでは、インポート中に発生する可能性のあるエラーと警告について説明します。

## インポート中のエラー
<a name="api-gateway-import-api-errors"></a>

 インポート中に、無効な OpenAPI ドキュメントなど、大きな問題に対してエラーが生成される場合があります。エラーは、失敗のレスポンスの例外 (例: `BadRequestException`) として返されます。エラーが発生した場合、新しい API 定義は破棄され、既存の API は変更されません。

## インポート中の警告
<a name="api-gateway-import-api-warnings"></a>

 インポート中に、モデル参照の不足など、小規模な問題に対して警告が生成される場合があります。警告が発生した場合、リクエスト URL に `failonwarnings=false` クエリ式が追加されている場合、オペレーションは続行します。それ以外の場合、更新はロールバックされます。デフォルトで、`failonwarnings` は `false` に設定されています。このような場合、警告は [RestApi](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html) リソースのフィールドとして返されます。それ以外の場合、警告は例外のメッセージとして返されます。

# API Gateway から REST API をエクスポートする
<a name="api-gateway-export-api"></a>

 API Gateway で REST API を作成および設定したら、API Gateway コンソールなどから API Gateway Export API (Amazon API Gateway Control Service の一部です) を使用して、API を OpenAPI ファイルにエクスポートできます。API Gateway Export API を使用するには、API リクエストに署名する必要があります。リクエストの署名の詳細については、「IAM ユーザーガイド」の「[AWS API リクエストの署名](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-signing.html)」を参照してください。**エクスポートされた OpenAPI 定義ファイルに、API Gateway 統合の拡張機能と、[Postman](https://www.postman.com) 拡張機能を含めるオプションがあります。

**注記**  
AWS CLI を使用して API をエクスポートする場合、次の例に示すように extensions パラメータを必ず含めて、`x-amazon-apigateway-request-validator` 拡張子が含まれるようにします。  

```
aws apigateway get-export --parameters extensions='apigateway' --rest-api-id abcdefg123 --stage-name dev --export-type swagger latestswagger2.json
```

 ペイロードが `application/json` 型でない場合、API をエクスポートすることはできません。エクスポートを試みると、JSON 本文モデルが見つからないことを示すエラーレスポンスが返されます。

## REST API をエクスポートするリクエスト
<a name="api-gateway-export-api-request"></a>

 Export API を使用すると、GET リクエストを送信し、URL パスの一部としてエクスポートされる API を指定することにより、既存の REST API をエクスポートします。リクエストの URL は次の形式です。

------
#### [ OpenAPI 3.0 ]

```
 https://<host>/restapis/<restapi_id>/stages/<stage_name>/exports/oas30
```

------
#### [ OpenAPI 2.0 ]

```
 https://<host>/restapis/<restapi_id>/stages/<stage_name>/exports/swagger
```

------

 `extensions` クエリ文字列を追加して、(値 `integration` を使用) API Gateway 拡張を含めるか、(値 `postman` を使用) Postman 拡張を含めるかを指定できます。

 さらに、`Accept` ヘッダーを `application/json` または `application/yaml` に設定して、それぞれ JSON 形式または YAML 形式で API 定義の出力を受け取ることができます。

 API Gateway Export API を使用して GET リクエストを送信する詳細については、「[GetExport](https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html)」を参照してください。

**注記**  
 API でモデルを定義する場合、モデルをエクスポートする API Gateway の "application/json" のコンテンツタイプである必要があります。それ以外の場合、API Gateway は「Only found non-JSON body models for ...」というエラーメッセージとともに例外をスローします。  
 モデルはプロパティを含むか、特定の JSONSchema 型として定義される必要があります。

## REST API OpenAPI 定義を JSON でダウンロードする
<a name="api-gateway-export-api-download-swagger-json"></a>

OpenAPI 定義を JSON 形式にして REST API をエクスポートおよびダウンロードするには、以下のようにします。

------
#### [ OpenAPI 3.0 ]

```
GET /restapis/<restapi_id>/stages/<stage_name>/exports/oas30
Host: apigateway.<region>.amazonaws.com
Accept: application/json
```

------
#### [ OpenAPI 2.0 ]

```
GET /restapis/<restapi_id>/stages/<stage_name>/exports/swagger
Host: apigateway.<region>.amazonaws.com
Accept: application/json
```

------

 ここで、`<region>` はたとえば `us-east-1` にできます。API Gateway を利用できるすべてのリージョンについては、「[リージョンとエンドポイント](https://docs.aws.amazon.com/general/latest/gr/rande.html#apigateway_region)」を参照してください。

## REST API OpenAPI 定義を YAML でダウンロードする
<a name="api-gateway-export-api-download-swagger-yaml"></a>

OpenAPI 定義を YAML 形式にして REST API をエクスポートおよびダウンロードするには、以下のようにします。

------
#### [ OpenAPI 3.0 ]

```
GET /restapis/<restapi_id>/stages/<stage_name>/exports/oas30
Host: apigateway.<region>.amazonaws.com
Accept: application/yaml
```

------
#### [ OpenAPI 2.0 ]

```
GET /restapis/<restapi_id>/stages/<stage_name>/exports/swagger
Host: apigateway.<region>.amazonaws.com
Accept: application/yaml
```

------

## Postman 拡張機能を使用して REST API OpenAPI 定義を JSON でダウンロードする
<a name="api-gateway-export-api-download-swagger-json-with-postman"></a>

Postman を使用して OpenAPI 定義を JSON 形式にして REST API をエクスポートおよびダウンロードするには、以下のようにします。

------
#### [ OpenAPI 3.0 ]

```
GET /restapis/<restapi_id>/stages/<stage_name>/exports/oas30?extensions=postman
Host: apigateway.<region>.amazonaws.com
Accept: application/json
```

------
#### [ OpenAPI 2.0 ]

```
GET /restapis/<restapi_id>/stages/<stage_name>/exports/swagger?extensions=postman
Host: apigateway.<region>.amazonaws.com
Accept: application/json
```

------

## API Gateway 統合を使用して REST API OpenAPI 定義ファイルを YAML でダウンロードする
<a name="api-gateway-export-api-download-swagger-yaml-with-apig"></a>

OpenAPI 定義を YAML 形式にして API Gateway 統合を使用して REST API をエクスポートおよびダウンロードするには、以下のようにします。

------
#### [ OpenAPI 3.0 ]

```
GET /restapis/<restapi_id>/stages/<stage_name>/exports/oas30?extensions=integrations
Host: apigateway.<region>.amazonaws.com
Accept: application/yaml
```

------
#### [ OpenAPI 2.0 ]

```
GET /restapis/<restapi_id>/stages/<stage_name>/exports/swagger?extensions=integrations
Host: apigateway.<region>.amazonaws.com
Accept: application/yaml
```

------

## API Gateway コンソールを使用して REST API をエクスポートする
<a name="api-gateway-export-api-from-console"></a>

[REST API をステージにデプロイ](set-up-deployments.md#create-deployment)したら、次に API Gateway コンソールを使用してステージ内の API を OpenAPI ファイルにエクスポートすることができます。

 API Gateway コンソールの **[ステージ]** ペインで、**[ステージアクション]**、**[エクスポート]** を選択します。

![\[API Gateway コンソールを使用して REST API をエクスポートする\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/export-new-console.png)


**[API 仕様タイプ]**、**[フォーマット]**、**[拡張機能]** を指定して API の OpenAPI 定義をダウンロードします。