

# チュートリアル: REST API を Amazon Kinesis のプロキシとして作成する
<a name="integrating-api-with-aws-services-kinesis"></a>

ここでは、`AWS` との統合のタイプで REST API を作成および設定して、Kinesis にアクセスする方法について説明します。

**注記**  
 API Gateway の API を Kinesis と統合するには、API Gateway と Kinesis の両方のサービスが利用できるリージョンを選択する必要があります。利用できるリージョンについては、「[サービスエンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)」を参照してください。

 この図では、サンプル API を作成して、クライアントが次の操作を行うことができるようにします。

1. ユーザーが Kinesis にあるストリームを一覧表示する 

1. 指定されたストリームを作成、説明、または削除する

1. 指定されたストリームからデータレコードを読み取る、または書き込む

 前述のタスクを完了するため、API はさまざまなリソースでメソッドを公開し、それぞれ次のものを呼び出します。

1. Kinesis の `ListStreams` アクション 

1. `CreateStream`、`DescribeStream`、または `DeleteStream` アクション

1. Kinesis の `GetRecords` または `PutRecords` (`PutRecord` を含む) アクション

 具体的には、次のように API を作成します。
+  API の `/streams` リソースに対する HTTP GET メソッドを公開し、そのメソッドを Kinesis の [ListStreams](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListStreams.html) アクションと統合して、呼び出し元のアカウントでストリームを一覧表示します。
+  API の `/streams/{stream-name}` リソースに対する HTTP POST メソッドを公開し、そのメソッドを Kinesis の [CreateStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_CreateStream.html) アクションと統合して、呼び出し元のアカウントで指定したストリームを作成します。
+  API の `/streams/{stream-name}` リソースに対する HTTP GET メソッドを公開し、そのメソッドを Kinesis の [DescribeStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DescribeStream.html) アクションと統合して、呼び出し元のアカウントで指定したストリームを表示します。
+  API の `/streams/{stream-name}` リソースに対する HTTP DELETE メソッドを公開し、そのメソッドを Kinesis の [DeleteStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DeleteStream.html) アクションと統合して、呼び出し元のアカウントでストリームを削除します。
+  API の `/streams/{stream-name}/record` リソースに対する HTTP PUT メソッドを公開し、そのメソッドを Kinesis の [PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html) アクションと統合します。これにより、クライアントは名前付きストリームに 1 つのデータレコードを追加できます。
+  API の `/streams/{stream-name}/records` リソースに対する HTTP PUT メソッドを公開し、そのメソッドを Kinesis の [PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html) アクションと統合します。これにより、クライアントは名前付きストリームにデータレコードのリストを追加できます。
+  API の `/streams/{stream-name}/records` リソースに対する HTTP GET メソッドを公開し、そのメソッドを Kinesis の [GetRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html) アクションと統合します。これにより、クライアントは名前付きストリームで指定されたシャードイテレーターとともにデータレコードを一覧表示できます。シャードイテレーターは、データレコードの逐次読み取りを開始する、シャードの位置を指定します。
+  API の `/streams/{stream-name}/sharditerator` リソースに対する HTTP GET メソッドを公開し、そのメソッドを Kinesis の [GetShardIterator](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetShardIterator.html) アクションと統合します。このヘルパーメソッドは、Kinesis の `ListStreams` アクションに提供する必要があります。

 ここに示す手順は、Kinesis の他のアクションにも適用できます。Kinesis のアクションの一覧については、[Amazon Kinesis API Reference](https://docs.aws.amazon.com/kinesis/latest/APIReference/Welcome.html) を参照してください。

 API Gateway コンソールを使用してサンプルの API を作成する代わりに、API Gateway の[インポート API](https://docs.aws.amazon.com/apigateway/latest/api/API_ImportRestApi.html) を使用してサンプルの API を API Gateway にインポートできます。API のインポート機能の使用方法の詳細については、「[API Gateway で OpenAPI を使用して REST API を開発する](api-gateway-import-api.md)」を参照してください。

## API が Kinesis にアクセスするための IAM ロールと IAM ポリシーを作成する
<a name="integrate-with-kinesis-create-iam-role-and-policy"></a>

 Kinesis のアクションを呼び出すことを API に許可するには、IAM ロールに適切な IAM ポリシーをアタッチする必要があります。このステップでは、新しい IAM ロールを作成します。

**AWS のサービスプロキシの実行ロールを作成するには**

1. AWS マネジメントコンソール にサインインして、IAM コンソール [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開きます。

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

1. [**ロールの作成**] を選択してください。

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

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

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

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

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

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

1. 検索バーに「**AmazonKinesisFullAccess**」と入力し、**[アクセス許可を追加]** を選択します。
**注記**  
このチュートリアルでは、わかりやすくするために管理ポリシーを使用しますが、独自の IAM ポリシーを作成して、必要な最小限のアクセス許可を付与するのがベストプラクティスです。

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

## API を Kinesis のプロキシとして作成する
<a name="api-gateway-create-api-as-kinesis-proxy"></a>

以下の手順に従って、API Gateway コンソールで API を作成します。

**API を Kinesis の AWS サービスプロキシとして作成するには**

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

1. API Gateway を初めて使用する場合は、サービスの特徴を紹介するページが表示されます。[**REST API**] で、[**構築**] を選択します。[**Create Example API (サンプル API の作成)**] がポップアップ表示されたら、[**OK**] を選択します。

   API Gateway を使用するのが初めてではない場合、[**Create API**] (API を作成)を選択します。[**REST API**] で、[**構築**] を選択します。

1. [**新しい API**] を選択します。

1. [**API name (API 名)**] に「**KinesisProxy**」と入力します。他のすべてのフィールドでは、デフォルト値をそのまま使用します。

1. (オプション) **[説明]** に説明を入力します。

1. **[IP アドレスの種類]** には **[IPv4]** を選択します。

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

 API が作成されると、API Gateway コンソールに API のルート (`/`) リソースのみを含む [**Resources (リソース)**] ページが表示されます。

## Kinesis のストリームを一覧表示する
<a name="api-gateway-list-kinesis-streams"></a>

 Kinesis では、次の REST API コールによる `ListStreams` アクションがサポートされています。

```
POST /?Action=ListStreams HTTP/1.1
Host: kinesis.<region>.<domain>
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.1
Authorization: <AuthParams>
X-Amz-Date: <Date>
        
{
   ...
}
```

上記の REST API リクエストでは、このアクションは、`Action` クエリパラメータで指定されます。または、代わりに、`X-Amz-Target` ヘッダーでこのアクションを指定することもできます。

```
POST / HTTP/1.1
Host: kinesis.<region>.<domain>
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.1
Authorization: <AuthParams>
X-Amz-Date: <Date>
X-Amz-Target: Kinesis_20131202.ListStreams        
{
   ...
}
```

このチュートリアルでは、クエリパラメータを使用してアクションを指定します。

API で Kinesis のアクションを公開するには、API のルートに `/streams` リソースを追加します。次に、そのリソースに対する `GET` メソッドを設定し、そのメソッドを Kinesis の `ListStreams` アクションと統合します。

以下の手順では、API Gateway コンソールを使用して Kinesis のストリームを一覧表示する方法について説明します。

**API Gateway コンソールを使用して Kinesis のストリームを一覧表示するには**

1. `/` リソースを選択し、**[リソースを作成]** を選択します。

1. **[リソース名]** に「**streams**」と入力します。

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

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

1.  `/streams` リソースを選択し、**[メソッドを作成]** を選択して、次の操作を行います。

   1. **[メソッドタイプ]** には、**GET** を選択します。
**注記**  
クライアントによって呼び出されるメソッドの HTTP 動詞は、バックエンド統合が必要な場合の HTTP 動詞とは異なる場合があります。ストリームの一覧表示は、直感的に、読み取りオペレーションであるため、ここでは `GET` を選択します。

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

   1. **[AWS リージョン]** で、Kinesis ストリームを作成した AWS リージョンを選択します。

   1. **[AWS のサービス]** で、**[Kinesis]** を選択します。

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

   1. [**HTTP メソッド**] で、[**POST**] を選択します。
**注記**  
ここで `POST` を選択したのは、Kinesis では POST を使用して `ListStreams` アクションを実行する必要があるためです。

   1. **[アクションタイプ]** で、**[アクション名を使用]** を選択します。

   1. **[アクション名]** に「**ListStreams**」と入力します。

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

   1. **[コンテンツの処理]** の **[パススルー]** はデフォルトのままにします。

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

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

1. **[リクエスト本文のパススルー]** で、**[テンプレートが定義されていない場合 (推奨)]** を選択します。

1.  **[URL リクエストヘッダーのパラメータ]** を選択し、次の操作を行います。

   1. **[リクエストヘッダーのパラメータを追加]** を選択します。

   1. [**名前**] に**Content-Type**と入力してください。

   1. **[マッピング元]** として「**'application/x-amz-json-1.1'**」と入力します。

    リクエストパラメータマッピングを使用して `Content-Type` ヘッダーを静的な値の `'application/x-amz-json-1.1'` に設定することで、入力が特定のバージョンの JSON であることを Kinesis に知らせます。

1. **[マッピングテンプレート]**、**[マッピングテンプレートの追加]** の順に選択し、次の操作を行います。

   1. **[コンテンツタイプ]** に「**application/json**」と入力します。

   1. **[テンプレート本文]** に「**\$1\$1**」と入力します。

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

    [ListStreams](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListStreams.html#API_ListStreams_RequestSyntax) のリクエストのペイロードは、次の形式の JSON です。

   ```
   {
       "ExclusiveStartStreamName": "string",
       "Limit": number
   }
   ```

   ただし、プロパティはオプションです。デフォルト値を使用するため、ここでは空の JSON ペイロードを選択しました。

1. Kinesis で `ListStreams` アクションを呼び出す GET メソッドを **/streams** リソースでテストします。

   **[テスト]** タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

   **[テスト]** を選択してメソッドをテストします。

    既に Kinesis で「myStream」と「yourStream」という 2 つのストリームが作成されている場合、テストが成功すると次のペイロードが含まれる 200 OK レスポンスが返されます。

   ```
   {
        "HasMoreStreams": false,
        "StreamNames": [
            "myStream",
            "yourStream"
        ]
   }
   ```

## Kinesis でストリームを作成、表示、削除する
<a name="api-gateway-create-describe-delete-stream"></a>

 Kinesis でストリームを作成、表示、削除するには、それぞれ次の Kinesis の REST API へのリクエストを作成する必要があります。

```
POST /?Action=CreateStream HTTP/1.1
Host: kinesis.region.domain
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "ShardCount": number,
    "StreamName": "string"
}
```

```
POST /?Action=DescribeStream HTTP/1.1
Host: kinesis.region.domain
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "StreamName": "string"
}
```

```
POST /?Action=DeleteStream HTTP/1.1
Host: kinesis.region.domain
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "StreamName":"string"
}
```

 API を作成して、必要な入力をメソッドリクエストの JSON ペイロードとして受け取り、ペイロードを統合リクエストに渡すことができます。ただし、メソッドリクエストと統合リクエスト、およびメソッドレスポンスと統合レスポンスの間のデータマッピングの例を詳細に示すため、API は少し異なる方法で作成します。

 これから名前を付ける `GET` リソースの HTTP メソッド (`POST`、`Delete`、`Stream`) を公開します。`{stream-name}` パス変数をこのストリームリソースのプレースホルダーとして使用して、これらの API のメソッドを Kinesis の `DescribeStream`、`CreateStream`、`DeleteStream` アクションとそれぞれ統合します。クライアントは、他の入力データをメソッドリクエストのヘッダー、クエリパラメータ、またはペイロードとして渡す必要があります。必要な統合リクエストペイロードにデータを変換するためのマッピングテンプレートが用意されています。

**\$1stream-name\$1 リソースを作成するには**

1. **[/streams]** リソースを選択し、**[リソースを作成]** を選択します。

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

1. **[リソースパス]** で、[`/streams`] を選択します。

1. **[リソース名]** に「**\$1stream-name\$1**」と入力します。

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

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

**ストリームリソースで GET メソッドを設定し、テストするには**

1. **[/\$1stream-name\$1]** リソースを選択し、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** には、**GET** を選択します。

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

1. **[AWS リージョン]** で、Kinesis ストリームを作成した AWS リージョンを選択します。

1. **[AWS のサービス]** で、**[Kinesis]** を選択します。

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

1. **[HTTP メソッド]** で、**[POST]** を選択します。

1. **[アクションタイプ]** で、**[アクション名を使用]** を選択します。

1. **[アクション名]** に「**DescribeStream**」と入力します。

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

1. **[コンテンツの処理]** の **[パススルー]** はデフォルトのままにします。

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

1. **[統合リクエスト]** セクションで、以下の **URL リクエストヘッダーのパラメータ**を追加します。

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   このタスクでは、同じ手順を使用して `GET /streams` メソッドのリクエストパラメータマッピングを設定します。

1. 次の本文マッピングテンプレートを追加して、`GET /streams/{stream-name}` メソッドリクエストから `POST /?Action=DescribeStream` 統合リクエストにデータをマッピングします。

   ```
   {
       "StreamName": "$input.params('stream-name')"
   }
   ```

   このマッピングテンプレートでは、Kinesis の `DescribeStream` アクションに必要な統合リクエストのペイロードをメソッドリクエストの `stream-name` パスパラメータ値から生成します。

1. Kinesis で `DescribeStream` アクションを呼び出す `GET /stream/{stream-name}` メソッドをテストするには、**[テスト]** タブを選択します。

1. **[パス]** の **[stream-name]** に、既存の Kinesis ストリームの名前を入力します。

1. **[テスト]** を選択します。テストに成功すると、200 OK レスポンスが、次のようなペイロードとともに返されます。

   ```
   {
     "StreamDescription": {
       "HasMoreShards": false,
       "RetentionPeriodHours": 24,
       "Shards": [
         {
           "HashKeyRange": {
             "EndingHashKey": "68056473384187692692674921486353642290",
             "StartingHashKey": "0"
           },
           "SequenceNumberRange": {
             "StartingSequenceNumber": "49559266461454070523309915164834022007924120923395850242"
           },
           "ShardId": "shardId-000000000000"
         },
         ...
         {
           "HashKeyRange": {
             "EndingHashKey": "340282366920938463463374607431768211455",
             "StartingHashKey": "272225893536750770770699685945414569164"
           },
           "SequenceNumberRange": {
             "StartingSequenceNumber": "49559266461543273504104037657400164881014714369419771970"
           },
           "ShardId": "shardId-000000000004"
         }
       ],
       "StreamARN": "arn:aws:kinesis:us-east-1:12345678901:stream/myStream",
       "StreamName": "myStream",
       "StreamStatus": "ACTIVE"
     }
   }
   ```

    API をデプロイした後は、この API メソッドに対して REST リクエストを行うことができます。

   ```
   GET https://your-api-id.execute-api.region.amazonaws.com/stage/streams/myStream HTTP/1.1
   Host: your-api-id.execute-api.region.amazonaws.com
   Content-Type: application/json
   Authorization: ...
   X-Amz-Date: 20160323T194451Z
   ```

**ストリームリソースで POST メソッドを設定し、テストするには**

1. **[/\$1stream-name\$1]** リソースを選択し、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** では、**POST** を選択します。

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

1. **[AWS リージョン]** で、Kinesis ストリームを作成した AWS リージョンを選択します。

1. **[AWS のサービス]** で、**[Kinesis]** を選択します。

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

1. **[HTTP メソッド]** で、**[POST]** を選択します。

1. **[アクションタイプ]** で、**[アクション名を使用]** を選択します。

1. **[アクション名]** に「**CreateStream**」と入力します。

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

1. **[コンテンツの処理]** の **[パススルー]** はデフォルトのままにします。

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

1. **[統合リクエスト]** セクションで、以下の **URL リクエストヘッダーのパラメータ**を追加します。

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   このタスクでは、同じ手順を使用して `GET /streams` メソッドのリクエストパラメータマッピングを設定します。

1.  次の本文マッピングテンプレートを追加して、`POST /streams/{stream-name}` メソッドリクエストから `POST /?Action=CreateStream` 統合リクエストにデータをマッピングします。

   ```
   {
       "ShardCount": #if($input.path('$.ShardCount') == '') 5 #else $input.path('$.ShardCount') #end,
       "StreamName": "$input.params('stream-name')"
   }
   ```

    前述のマッピングテンプレートで、クライアントがメソッドリクエストペイロードで値を指定しなかった場合は、`ShardCount` を固定値 5 に設定します。

1. Kinesis で `CreateStream` アクションを呼び出す `POST /stream/{stream-name}` メソッドをテストするには、**[テスト]**] タブを選択します。

1. **[パス]** の **[stream-name]** に、新しい Kinesis ストリームの名前を入力します。

1. **[テスト]** を選択します。テストが完了すると、データなしで 200 OK レスポンスが返されます。

    API をデプロイしたら、ストリームリソースの POST メソッドに対する REST API リクエストを行って、Kinesis で `CreateStream` アクションを呼び出すこともできます。

   ```
   POST https://your-api-id.execute-api.region.amazonaws.com/stage/streams/yourStream HTTP/1.1
   Host: your-api-id.execute-api.region.amazonaws.com
   Content-Type: application/json
   Authorization: ...
   X-Amz-Date: 20160323T194451Z
   
   { 
       "ShardCount": 5
   }
   ```

**ストリームリソースで DELETE メソッドを設定し、テストする**

1. **[/\$1stream-name\$1]** リソースを選択し、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** で、**[DELETE]** を選択します。

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

1. **[AWS リージョン]** で、Kinesis ストリームを作成した AWS リージョンを選択します。

1. **[AWS のサービス]** で、**[Kinesis]** を選択します。

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

1. **[HTTP メソッド]** で、**[POST]** を選択します。

1. **[アクションタイプ]** で、**[アクション名を使用]** を選択します。

1. **[アクション名]** に「**DeleteStream**」と入力します。

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

1. **[コンテンツの処理]** の **[パススルー]** はデフォルトのままにします。

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

1. **[統合リクエスト]** セクションで、以下の **URL リクエストヘッダーのパラメータ**を追加します。

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   このタスクでは、同じ手順を使用して `GET /streams` メソッドのリクエストパラメータマッピングを設定します。

1.  次の本文マッピングテンプレートを追加して、`DELETE /streams/{stream-name}` メソッドリクエストから `POST /?Action=DeleteStream` の該当する統合リクエストにデータをマッピングします。

   ```
   {
       "StreamName": "$input.params('stream-name')"
   }
   ```

    このマッピングテンプレートでは、`DELETE /streams/{stream-name}` のクライアントが指定した URL パス名値から `stream-name` アクションに必要な入力が生成されます。

1. Kinesis で `DeleteStream` アクションを呼び出す `DELETE /stream/{stream-name}` メソッドをテストするには、**[テスト]**] タブを選択します。

1. **[パス]** の **[stream-name]** に、既存の Kinesis ストリームの名前を入力します。

1. **[テスト]** を選択します。テストが完了すると、データなしで 200 OK レスポンスが返されます。

    API をデプロイしたら、ストリームリソースの DELETE メソッドに対する以下の REST API リクエストを行って、Kinesis で `DeleteStream` アクションを呼び出すこともできます。

   ```
   DELETE https://your-api-id.execute-api.region.amazonaws.com/stage/streams/yourStream HTTP/1.1
   Host: your-api-id.execute-api.region.amazonaws.com
   Content-Type: application/json
   Authorization: ...
   X-Amz-Date: 20160323T194451Z
   
   {}
   ```

## Kinesis のストリームに対してレコードの取得や追加を行う
<a name="api-gateway-get-and-add-records-to-stream"></a>

 Kinesis でストリームを作成すると、ストリームにデータレコードを追加したり、ストリームからデータを読み取ったりすることができます。データレコードを追加するには、Kinesis で [PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html#API_PutRecords_Examples) アクションまたは [PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html#API_PutRecord_Examples) アクションを呼び出す必要があります。前者は複数のレコードを追加し、後者は 1 つのレコードをストリームに追加します。

```
POST /?Action=PutRecords HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "Records": [
        {
            "Data": blob,
            "ExplicitHashKey": "string",
            "PartitionKey": "string"
        }
    ],
    "StreamName": "string"
}
```

または

```
POST /?Action=PutRecord HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "Data": blob,
    "ExplicitHashKey": "string",
    "PartitionKey": "string",
    "SequenceNumberForOrdering": "string",
    "StreamName": "string"
}
```

 ここで、`StreamName` はレコードを追加するターゲットストリームを識別します。`StreamName`、`Data`、および `PartitionKey` は必須の入力データです。この例では、すべてのオプション入力データにデフォルト値を使用し、メソッドリクエストへの入力ではそれらの値を明示的に指定しません。

 Kinesis のデータを読み取るには、[GetRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html#API_GetRecords_Examples) アクションを呼び出します。

```
POST /?Action=GetRecords HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "ShardIterator": "string",
    "Limit": number
}
```

レコードを取得するソースのストリームは、必須の `ShardIterator` の値で指定します。シャードイテレーターは、次の Kinesis のアクションで取得します。

```
POST /?Action=GetShardIterator HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes
                
{
    "ShardId": "string",
    "ShardIteratorType": "string",
    "StartingSequenceNumber": "string",
    "StreamName": "string"
}
```

 `GetRecords` および `PutRecords` アクションでは、それぞれ `GET` および `PUT` メソッドを、名前付きストリームリソース (`/records`) に追加される `/{stream-name}` リソースで公開します。同様に、`PutRecord` アクションは `PUT` リソースで `/record` メソッドとして公開します。

 `GetRecords` アクションは、`ShardIterator` ヘルパーアクションを呼び出して取得される `GetShardIterator` 値を入力として受け取るため、`GET` リソース (`ShardIterator`) で `/sharditerator` ヘルパーメソッドを公開します。

**/record、/records、および /sharditerator リソースを作成するには**

1. **[/\$1stream-name\$1]** リソースを選択し、**[リソースを作成]** を選択します。

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

1. **[リソースパス]** で、[`/{stream-name}`] を選択します。

1. **[リソース名]** に「**record**」と入力します。

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

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

1. 前の手順を繰り返して **/records** リソースと **/sharditerator** リソースを作成します。最終的な API は次のようになります。

      
![\[レコードの作成: API の GET|PUT|PUT|GET メソッド\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/api-gateway-kinesis-proxy-setup-streams-stream-record-method-new-console.png)

 次の 4 つの手順では、各メソッドの設定方法、メソッドリクエストから統合リクエストにデータをマッピングする方法、およびメソッドをテストする方法について説明します。

**Kinesis で `PutRecord` を呼び出すように `PUT /streams/{stream-name}/record` メソッドを設定してテストするには**

1. **[/record]** を選択し、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** で、**[PUT]** を選択します。

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

1. **[AWS リージョン]** で、Kinesis ストリームを作成した AWS リージョンを選択します。

1. **[AWS のサービス]** で、**[Kinesis]** を選択します。

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

1. **[HTTP メソッド]** で、**[POST]** を選択します。

1. **[アクションタイプ]** で、**[アクション名を使用]** を選択します。

1. **[アクション名]** に「**PutRecord**」と入力します。

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

1. **[コンテンツの処理]** の **[パススルー]** はデフォルトのままにします。

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

1. **[統合リクエスト]** セクションで、以下の **URL リクエストヘッダーのパラメータ**を追加します。

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   このタスクでは、同じ手順を使用して `GET /streams` メソッドのリクエストパラメータマッピングを設定します。

1.  次の本文マッピングテンプレートを追加して、`PUT /streams/{stream-name}/record` メソッドリクエストから `POST /?Action=PutRecord` の該当する統合リクエストにデータをマッピングします。

   ```
   {
       "StreamName": "$input.params('stream-name')",
       "Data": "$util.base64Encode($input.json('$.Data'))",
       "PartitionKey": "$input.path('$.PartitionKey')"
   }
   ```

    このマッピングテンプレートでは、メソッドリクエストのペイロードが次の形式であることを想定しています。

   ```
   {
      "Data": "some data",
      "PartitionKey": "some key"
   }
   ```

   このデータは、次の JSON スキーマでモデル化することができます。

   ```
   {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "title": "PutRecord proxy single-record payload",
     "type": "object",
     "properties": {
         "Data": { "type": "string" },
         "PartitionKey": { "type": "string" }
     }
   }
   ```

    モデルを作成してこのスキーマを含め、このモデルを使用してマッピングテンプレートを生成を容易にすることができます。ただし、モデルを使用せずにマッピングテンプレートを生成することができます。

1.  `PUT /streams/{stream-name}/record` メソッドをテストするには、`stream-name` パス変数を既存のストリームの名前に設定し、必要な形式のペイロードを指定して、メソッドリクエストを送信します。成功した場合の結果は `200 OK ` レスポンスと、次の形式のペイロードとなります。

   ```
   {
     "SequenceNumber": "49559409944537880850133345460169886593573102115167928386",
     "ShardId": "shardId-000000000004"
   }
   ```

**Kinesis で `PUT /streams/{stream-name}/records` を呼び出すように `PutRecords` メソッドを設定してテストするには**

1. **[/records]** リソースを選択し、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** で、**[PUT]** を選択します。

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

1. **[AWS リージョン]** で、Kinesis ストリームを作成した AWS リージョンを選択します。

1. **[AWS のサービス]** で、**[Kinesis]** を選択します。

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

1. **[HTTP メソッド]** で、**[POST]** を選択します。

1. **[アクションタイプ]** で、**[アクション名を使用]** を選択します。

1. **[アクション名]** に「**PutRecords**」と入力します。

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

1. **[コンテンツの処理]** の **[パススルー]** はデフォルトのままにします。

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

1. **[統合リクエスト]** セクションで、以下の **URL リクエストヘッダーのパラメータ**を追加します。

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   このタスクでは、同じ手順を使用して `GET /streams` メソッドのリクエストパラメータマッピングを設定します。

1.  次の本文マッピングテンプレートを追加して、`PUT /streams/{stream-name}/records` メソッドリクエストから、`POST /?Action=PutRecords` の対応する統合リクエストにデータをマッピングします。

   ```
   {
       "StreamName": "$input.params('stream-name')",
       "Records": [
          #foreach($elem in $input.path('$.records'))
             {
               "Data": "$util.base64Encode($elem.data)",
               "PartitionKey": "$elem.partition-key"
             }#if($foreach.hasNext),#end
           #end
       ]
   }
   ```

   このマッピングテンプレートでは、メソッドリクエストのペイロードが次の JSON スキーマでモデル化できることを想定しています。

   ```
   {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "title": "PutRecords proxy payload data",
     "type": "object",
     "properties": {
       "records": {
         "type": "array",
         "items": {
           "type": "object",
           "properties": {
             "data": { "type": "string" },
             "partition-key": { "type": "string" }
           }
         }
       }
     }
   }
   ```

    モデルを作成してこのスキーマを含め、このモデルを使用してマッピングテンプレートを生成を容易にすることができます。ただし、モデルを使用せずにマッピングテンプレートを生成することができます。

   このチュートリアルでは、API デベロッパーがバックエンドデータ形式をクライアントに開示するか、クライアントから見えないようにするかを選択できることを示すため、わずかに異なる 2 つのペイロード形式を使用しました。1 つは `PUT /streams/{stream-name}/records` メソッド (上記) 用の形式、もう 1 つは `PUT /streams/{stream-name}/record` メソッド (前の手順) 用の形式です。実稼働環境では、両方の形式の一貫性を保ってください。

1. 

    `PUT /streams/{stream-name}/records` メソッドをテストするには、`stream-name` パス変数を既存のストリームに設定し、前に示したように次のペイロードを指定して、メソッドリクエストを送信します。

   ```
   {
       "records": [
           {
               "data": "some data",
               "partition-key": "some key"
           },
           {
               "data": "some other data",
               "partition-key": "some key"
           }
       ]
   }
   ```

   成功した場合の結果は 200 OK レスポンスと、以下の出力例のようになります。

   ```
   {
     "FailedRecordCount": 0,
     "Records": [
       {
         "SequenceNumber": "49559409944537880850133345460167468741933742152373764162",
         "ShardId": "shardId-000000000004"
       },
       {
         "SequenceNumber": "49559409944537880850133345460168677667753356781548470338",
         "ShardId": "shardId-000000000004"
       }
     ]
   }
   ```

**Kinesis で `GET /streams/{stream-name}/sharditerator` を呼び出すように `GetShardIterator` メソッドを設定してテストするには**

`GET /streams/{stream-name}/sharditerator` メソッドは、`GET /streams/{stream-name}/records` メソッドを呼び出す前に必須のシャードイテレーターを取得するためのヘルパーメソッドです。

1. **[/sharditerator]** リソースを選択し、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** には、**GET** を選択します。

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

1. **[AWS リージョン]** で、Kinesis ストリームを作成した AWS リージョンを選択します。

1. **[AWS のサービス]** で、**[Kinesis]** を選択します。

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

1. **[HTTP メソッド]** で、**[POST]** を選択します。

1. **[アクションタイプ]** で、**[アクション名を使用]** を選択します。

1. **[アクション名]** に「**GetShardIterator**」と入力します。

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

1. **[コンテンツの処理]** の **[パススルー]** はデフォルトのままにします。

1. **[URL クエリ文字列パラメータ]** を選択します。

   `GetShardIterator` アクションでは、ShardId 値を入力する必要があります。クライアントが指定した `ShardId` 値を渡すには、次のステップに示すように、`shard-id` クエリパラメータをメソッドリクエストに追加します。

1. [**クエリ文字列の追加**] を選択します。

1. [**名前**] に**shard-id**と入力してください。

1. **[必須]** と **[キャッシュ]** はオフのままにしておきます。

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

1. **[統合リクエスト]** セクションで、次のマッピングテンプレートを追加して、メソッドリクエストの `shard-id` パラメータと `stream-name` パラメータの `GetShardIterator` アクションに必要な入力 (`ShardId` および `StreamName`) を生成します。また、マッピングテンプレートでも、`ShardIteratorType` は、デフォルトとして `TRIM_HORIZON` に設定されます。

   ```
   {
       "ShardId": "$input.params('shard-id')",
       "ShardIteratorType": "TRIM_HORIZON",
       "StreamName": "$input.params('stream-name')"
   }
   ```

1.  API Gateway コンソールの [**Test (テスト)**] オプションを使用して、既存のストリームの名前を `stream-name` の [**Path (パス)**] 変数値に入力し、`shard-id` の [**Query string (クエリ文字列)**] を既存の `ShardId` 値 (例: `shard-000000000004`) に設定して、[**Test (テスト)**] を選択します。

    成功のレスポンスペイロードは以下の出力例のようになります。

   ```
   {
     "ShardIterator": "AAAAAAAAAAFYVN3VlFy..."
   }
   ```

   `ShardIterator` の値をメモしておきます。これは、ストリームからレコードを取得するために必要です。

**Kinesis で `GET /streams/{stream-name}/records` アクションを呼び出すように `GetRecords` メソッドを設定してテストするには**

1. **[/records]** リソースを選択し、**[メソッドを作成]** を選択します。

1. **[メソッドタイプ]** には、**GET** を選択します。

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

1. **[AWS リージョン]** で、Kinesis ストリームを作成した AWS リージョンを選択します。

1. **[AWS のサービス]** で、**[Kinesis]** を選択します。

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

1. **[HTTP メソッド]** で、**[POST]** を選択します。

1. **[アクションタイプ]** で、**[アクション名を使用]** を選択します。

1. **[アクション名]** に「**GetRecords**」と入力します。

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

1. **[コンテンツの処理]** の **[パススルー]** はデフォルトのままにします。

1. **[HTTP リクエストヘッダー]** を選択します。

    `GetRecords` オペレーションでは、`ShardIterator` の値の入力が必要です。クライアントが指定した `ShardIterator` 値を渡すには、`Shard-Iterator` ヘッダーパラメータをメソッドリクエストに追加します。

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

1. [**名前**] に**Shard-Iterator**と入力してください。

1. **[必須]** と **[キャッシュ]** はオフのままにしておきます。

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

1.  **[統合リクエスト]** セクションで、次の本文マッピングテンプレートを追加して、`Shard-Iterator` ヘッダーパラメータ値を Kinesis の `GetRecords` アクションの JSON ペイロードの `ShardIterator` プロパティ値にマッピングします。

   ```
   {
       "ShardIterator": "$input.params('Shard-Iterator')"
   }
   ```

1.  API Gateway コンソールの **[テスト]** オプションを使用して、既存のストリームの名前を `stream-name` の **[パス]** 変数値として入力し、`Shard-Iterator` の **[ヘッダー]** を `GET /streams/{stream-name}/sharditerator` メソッド (上記) のテスト実行で取得した `ShardIterator` 値に設定して、**[テスト]** を選択します。

    成功のレスポンスペイロードは以下の出力例のようになります。

   ```
   {
     "MillisBehindLatest": 0,
     "NextShardIterator": "AAAAAAAAAAF...",
     "Records": [ ... ]
   }
   ```

# Kinesis のプロキシとしてのサンプル API の OpenAPI 定義
<a name="api-as-kinesis-proxy-export-swagger-with-extensions"></a>

以下の OpenAPI 定義は、このチュートリアルで使用されている Kinesis のプロキシとしてのサンプル API のものです。

------
#### [ OpenAPI 3.0 ]

```
{
  "openapi": "3.0.0",
  "info": {
    "title": "KinesisProxy",
    "version": "2016-03-31T18:25:32Z"
  },
  "paths": {
    "/streams/{stream-name}/sharditerator": {
      "get": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "shard-id",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetShardIterator",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardId\": \"$input.params('shard-id')\",\n    \"ShardIteratorType\": \"TRIM_HORIZON\",\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/records": {
      "get": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Shard-Iterator",
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardIterator\": \"$input.params('Shard-Iterator')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "put": {
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PutRecordsMethodRequestPayload"
              }
            },
            "application/x-amz-json-1.1": {
              "schema": {
                "$ref": "#/components/schemas/PutRecordsMethodRequestPayload"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Records\": [\n          {\n            \"Data\": \"$util.base64Encode($elem.data)\",\n            \"PartitionKey\": \"$elem.partition-key\"\n          }#if($foreach.hasNext),#end\n    ]\n}",
            "application/x-amz-json-1.1": "{\n  \"StreamName\": \"$input.params('stream-name')\",\n  \"records\" : [\n    {\n        \"Data\" : \"$elem.data\",\n        \"PartitionKey\" : \"$elem.partition-key\"\n    }#if($foreach.hasNext),#end\n  ]\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}": {
      "get": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DescribeStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "post": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/CreateStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardCount\": 5,\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "delete": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          },
          "400": {
            "description": "400 response",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {}
          },
          "500": {
            "description": "500 response",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {}
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DeleteStream",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}": {
              "statusCode": "500",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/record": {
      "put": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecord",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Data\": \"$util.base64Encode($input.json('$.Data'))\",\n    \"PartitionKey\": \"$input.path('$.PartitionKey')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams": {
      "get": {
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/ListStreams",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Empty": {
        "type": "object"
      },
      "PutRecordsMethodRequestPayload": {
        "type": "object",
        "properties": {
          "records": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "data": {
                  "type": "string"
                },
                "partition-key": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}
```

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-03-31T18:25:32Z",
    "title": "KinesisProxy"
  },
  "basePath": "/test",
  "schemes": [
    "https"
  ],
  "paths": {
    "/streams": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/ListStreams",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DescribeStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "post": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/CreateStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardCount\": 5,\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "delete": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response",
            "headers": {
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "500": {
            "description": "500 response",
            "headers": {
              "Content-Type": {
                "type": "string"
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DeleteStream",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}": {
              "statusCode": "500",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/record": {
      "put": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecord",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Data\": \"$util.base64Encode($input.json('$.Data'))\",\n    \"PartitionKey\": \"$input.path('$.PartitionKey')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/records": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "Shard-Iterator",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardIterator\": \"$input.params('Shard-Iterator')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "put": {
        "consumes": [
          "application/json",
          "application/x-amz-json-1.1"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "PutRecordsMethodRequestPayload",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PutRecordsMethodRequestPayload"
            }
          },
          {
            "in": "body",
            "name": "PutRecordsMethodRequestPayload",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PutRecordsMethodRequestPayload"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Records\": [\n          {\n            \"Data\": \"$util.base64Encode($elem.data)\",\n            \"PartitionKey\": \"$elem.partition-key\"\n          }#if($foreach.hasNext),#end\n    ]\n}",
            "application/x-amz-json-1.1": "{\n  \"StreamName\": \"$input.params('stream-name')\",\n  \"records\" : [\n    {\n        \"Data\" : \"$elem.data\",\n        \"PartitionKey\" : \"$elem.partition-key\"\n    }#if($foreach.hasNext),#end\n  ]\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/sharditerator": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "shard-id",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetShardIterator",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardId\": \"$input.params('shard-id')\",\n    \"ShardIteratorType\": \"TRIM_HORIZON\",\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    }
  },
  "definitions": {
    "Empty": {
      "type": "object"
    },
    "PutRecordsMethodRequestPayload": {
      "type": "object",
      "properties": {
        "records": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "data": {
                "type": "string"
              },
              "partition-key": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}
```

------