

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 API Gateway 中設定一個 WebSocket API 整合請求
<a name="apigateway-websocket-api-integration-requests"></a>

設定整合請求包含下列事項：
+ 選擇路由金鑰來整合後端。
+ 指定要調用的後端端點。WebSocket API 支援下列整合類型：
  + `AWS_PROXY`
  + `AWS`
  + `HTTP_PROXY`
  + `HTTP`
  + `MOCK`

  如需整合類型的詳細資訊，請參閱《API Gateway V2 REST API》中的 [IntegrationType](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-integrations-integrationid.html#apis-apiid-integrations-integrationid-prop-integration-integrationtype)。
+ 視需要指定一個或多個請求範本，設定路由請求資料轉換為整合請求資料的方式。

## 使用 API Gateway 主控台設定 WebSocket API 整合請求
<a name="apigateway-websocket-api-integration-request-using-console"></a>

**使用 API Gateway 主控台在 WebSocket API 內的路由新增整合請求**

1. 登入 API Gateway 主控台、選擇 API，然後選擇 **Routes (路由)**。

1. 在 **Routes (路由)** 底下選擇路由。

1. 選擇**整合請求**索引標籤，然後在**整合請求設定**區段中，選擇**編輯**。

1. 針對**整合類型**，選擇下列其中一項：
   + 只有當您的 API 將與您在此帳戶或其他帳戶中建立的 函數整合時，才選擇 **Lambda** AWS Lambda 函數。

     若要在 中建立新的 Lambda 函數 AWS Lambda、設定 Lambda 函數的資源許可，或執行任何其他 Lambda 服務動作，請改為選擇**AWS 服務**。
   + 若您的 API 將整合現有 HTTP 端點，請選擇 **HTTP (HTTP)**。如需詳細資訊，請參閱 [API Gateway 中 REST API 的 HTTP 整合](setup-http-integrations.md)。
   + 若您希望直接從 API Gateway 產生 API 回應，不使用整合後端，請選擇 **Mock (模擬)**。如需詳細資訊，請參閱[API Gateway 中 REST API 的模擬整合](how-to-mock-integration.md)。
   + 如果您的 API 將與 **AWS 服務**整合，請選擇 AWS 服務。
   + 如果您的 API 將使用 `VpcLink` 做為私有整合端點，請選擇 **VPC 連結**。如需詳細資訊，請參閱 [設定私有整合](set-up-private-integration.md)。

1. 如果您選擇 **Lambda 函數**，請執行下列動作：

   1. 若您希望使用 [Lambda 代理整合](set-up-lambda-proxy-integrations.md#api-gateway-create-api-as-simple-proxy)或[跨帳戶 Lambda 代理整合](apigateway-cross-account-lambda-integrations.md)，請勾選**使用 Lambda 代理整合**核取方塊。

   1. 針對 **Lambda 函數**，以下列方式之一指定函數：
      + 若您的 Lambda 函數位於同一個帳戶，請輸入函數名稱，然後從下拉式清單中選取函數。
**注意**  
函數名稱可選擇納入其別名或版本規格，如 `HelloWorld`、`HelloWorld:1` 或 `HelloWorld:alpha`。
      + 若函數位於不同帳戶，請輸入該函數的 ARN。

   1. 若要使用 29 秒的預設逾時值，請將**預設逾時**保持開啟。若要設定自訂逾時，請選擇**預設逾時**，然後輸入介於 `50` 和 `29000` 毫秒之間的逾時值。

1. 若您選擇 **HTTP (HTTP)**，請依照 [使用 API Gateway 主控台設定 API 整合請求](how-to-method-settings-console.md) 步驟 4 的指示。

1. 若您選擇 **Mock (模擬)**，請前往 **Request Templates (請求範本)** 步驟。

1. 若您選擇 **AWS 服務**，請依照 [使用 API Gateway 主控台設定 API 整合請求](how-to-method-settings-console.md) 的步驟 6 的指示進行。

1. 若您選擇 **VPC 連結**，請執行下列動作：

   1. 若您希望將請求代理到 `VPCLink` 端點，請勾選 **VPC 代理整合**核取方塊。

   1. 針對 **HTTP method (HTTP 方法)**，選擇最符合 HTTP 後端中方法的 HTTP 方法類型。

   1. 從 **VPC 連結**下拉式清單中，選取 VPC 連結。您可以在清單下方的文字方塊中選取 `[Use Stage Variables]` 並輸入 **\$1\$1stageVariables.vpcLinkId\$1**。

      將 API 部署到階段後，您就可以定義 `vpcLinkId` 階段變數，並將其值設定為 `VpcLink` 的 ID。

   1. 針對 **Endpoint URL (端點 URL)**，請輸入您希望此整合使用之 HTTP 後端的 URL。

   1. 若要使用 29 秒的預設逾時值，請將**預設逾時**保持開啟。若要設定自訂逾時，請選擇**預設逾時**，然後輸入介於 `50` 和 `29000` 毫秒之間的逾時值。

1. 選擇**儲存變更**。

1. 在**請求範本**下，執行下列動作：

   1. 在**請求範本**下選擇**編輯**，以輸入**範本選擇表達式**。

   1. 輸入**範本選擇表達式**。使用 API Gateway 在訊息承載中尋找的表達式。若找到將對其評估，而結果範本金鑰值將用於選取在訊息承載內套用至資料的資料映射範本。您會在下一個步驟中建立資料映射範本。選擇**編輯**，儲存您的變更。

   1. 選擇**建立範本**，以建立資料映射範本。針對**範本金鑰**輸入範本金鑰值，該值將用來選取要對訊息承載中的資料套用的資料映射範本。接著，輸入映射範本。選擇**建立範本**。

      如需範本選擇表達式的相關資訊，請參閱 [範本選擇表達式](websocket-api-data-transformations.md#apigateway-websocket-api-template-selection-expressions)。

## 使用 設定整合請求 AWS CLI
<a name="apigateway-websocket-api-integration-request-using-awscli"></a>

您可使用 AWS CLI 設定 WebSocket API 內路由的整合請求，建立模擬整合，如下列範例所示：

1. 建立名為 `integration-params.json` 的檔案，其中內容如下：

   ```
   {"PassthroughBehavior": "WHEN_NO_MATCH", "TimeoutInMillis": 29000, "ConnectionType": "INTERNET", "RequestTemplates": {"application/json": "{\"statusCode\":200}"}, "IntegrationType": "MOCK"}
   ```

1. 使用下列 [create-integration](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-integration.html) 命令來建立模擬整合。

   ```
   aws apigatewayv2 --region us-east-1 create-integration --api-id aabbccddee --cli-input-json file://integration-params.json
   ```

   輸出將如下所示：

   ```
   {
       "PassthroughBehavior": "WHEN_NO_MATCH",
       "TimeoutInMillis": 29000,
       "ConnectionType": "INTERNET",
       "IntegrationResponseSelectionExpression": "${response.statuscode}",
       "RequestTemplates": {
           "application/json": "{\"statusCode\":200}"
       },
       "IntegrationId": "0abcdef",
       "IntegrationType": "MOCK"
   }
   ```

或者，您可以使用 設定代理整合的整合請求 AWS CLI。

1. 在 Lambda 主控台中建立 Lambda 函數，並賦予基本的 Lambda 執行角色。

1. 使用下列 [create-integration](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-integration.html) 命令來建立整合。

   ```
   aws apigatewayv2 create-integration --api-id aabbccddee --integration-type AWS_PROXY --integration-method POST --integration-uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:simpleproxy-echo-e2e/invocations
   ```

輸出將如下所示：

```
{
    "PassthroughBehavior": "WHEN_NO_MATCH",
    "IntegrationMethod": "POST",
    "TimeoutInMillis": 29000,
    "ConnectionType": "INTERNET",
    "IntegrationUri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:simpleproxy-echo-e2e/invocations",
    "IntegrationId": "abcdefg",
    "IntegrationType": "AWS_PROXY"
}
```

## WebSocket API 之代理整合的 Lambda 函數的輸入格式
<a name="api-gateway-simple-proxy-for-lambda-input-format-websocket"></a>

在 Lambda 代理整合中，API Gateway 會將整個用戶端請求映射至後端 Lambda 函數的輸入 `event` 參數。下列範例顯示來自 `$connect` 路由的輸入事件結構，以及來自 API Gateway 傳送至 Lambda 代理整合之 `$disconnect` 路由的輸入事件結構。

------
#### [ Input from the \$1connect route ]

```
{
    headers: {
      Host: 'abcd123.execute-api.us-east-1.amazonaws.com',
      'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
      'Sec-WebSocket-Key': '...',
      'Sec-WebSocket-Version': '13',
      'X-Amzn-Trace-Id': '...',
      'X-Forwarded-For': '192.0.2.1',
      'X-Forwarded-Port': '443',
      'X-Forwarded-Proto': 'https'
    },
    multiValueHeaders: {
      Host: [ 'abcd123.execute-api.us-east-1.amazonaws.com' ],
      'Sec-WebSocket-Extensions': [ 'permessage-deflate; client_max_window_bits' ],
      'Sec-WebSocket-Key': [ '...' ],
      'Sec-WebSocket-Version': [ '13' ],
      'X-Amzn-Trace-Id': [ '...' ],
      'X-Forwarded-For': [ '192.0.2.1' ],
      'X-Forwarded-Port': [ '443' ],
      'X-Forwarded-Proto': [ 'https' ]
    },
    requestContext: {
      routeKey: '$connect',
      eventType: 'CONNECT',
      extendedRequestId: 'ABCD1234=',
      requestTime: '09/Feb/2024:18:11:43 +0000',
      messageDirection: 'IN',
      stage: 'prod',
      connectedAt: 1707502303419,
      requestTimeEpoch: 1707502303420,
      identity: { sourceIp: '192.0.2.1' },
      requestId: 'ABCD1234=',
      domainName: 'abcd1234.execute-api.us-east-1.amazonaws.com',
      connectionId: 'AAAA1234=',
      apiId: 'abcd1234'
    },
    isBase64Encoded: false
  }
```

------
#### [ Input from the \$1disconnect route ]

```
{
    headers: {
      Host: 'abcd1234.execute-api.us-east-1.amazonaws.com',
      'x-api-key': '',
      'X-Forwarded-For': '',
      'x-restapi': ''
    },
    multiValueHeaders: {
      Host: [ 'abcd1234.execute-api.us-east-1.amazonaws.com' ],
      'x-api-key': [ '' ],
      'X-Forwarded-For': [ '' ],
      'x-restapi': [ '' ]
    },
    requestContext: {
      routeKey: '$disconnect',
      disconnectStatusCode: 1005,
      eventType: 'DISCONNECT',
      extendedRequestId: 'ABCD1234=',
      requestTime: '09/Feb/2024:18:23:28 +0000',
      messageDirection: 'IN',
      disconnectReason: 'Client-side close frame status not set',
      stage: 'prod',
      connectedAt: 1707503007396,
      requestTimeEpoch: 1707503008941,
      identity: { sourceIp: '192.0.2.1' },
      requestId: 'ABCD1234=',
      domainName: 'abcd1234.execute-api.us-east-1.amazonaws.com',
      connectionId: 'AAAA1234=',
      apiId: 'abcd1234'
    },
    isBase64Encoded: false
  }
```

------