

# Configuración de una solicitud de integración de API de WebSocket en API Gateway
<a name="apigateway-websocket-api-integration-requests"></a>

La configuración de una solicitud de integración implica lo siguiente:
+ Elegir una clave de ruta para integrarla en el backend.
+ Especificación del punto de conexión de backend que se va a invocar. Las API de WebSocket admiten los siguientes tipos de integración:
  + `AWS_PROXY`
  + `AWS`
  + `HTTP_PROXY`
  + `HTTP`
  + `MOCK`

  Para obtener más información sobre los tipos de integración, consulte [IntegrationType](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-integrations-integrationid.html#apis-apiid-integrations-integrationid-prop-integration-integrationtype) en la API de REST de API Gateway V2.
+ Configurar cómo transformar los datos de la solicitud de ruta, si fuera necesario, en datos de solicitud de integración mediante la especificación de una o varias plantillas de solicitud.

## Configuración de una solicitud de integración de la API de WebSocket mediante la consola de API Gateway
<a name="apigateway-websocket-api-integration-request-using-console"></a>

**Para agregar una solicitud de integración a una ruta en una API de WebSocket mediante la consola de API Gateway**

1. Inicie sesión en la consola de API Gateway, elija la API y, a continuación, elija **Routes (Rutas)**.

1. En **Routes (Rutas)**, elija la ruta.

1. Elija la pestaña **Solicitud de integración** y, a continuación, en la sección **Configuración de solicitud de integración**, elija **Editar**.

1. En **Tipo de integración**, seleccione una de las siguientes opciones:
   + Elija **Función de Lambda** solo si la API se va a integrar con una función de AWS Lambda que ya ha creado en esta cuenta o en otra.

     Para crear una nueva función de Lambda en AWS Lambda, establecer un permiso a nivel de recursos en la función de Lambda o realizar cualquier otra acción de servicio Lambda, elija **Servicio de AWS** en su lugar.
   + Elija **HTTP** si la API se va a integrar con un punto de conexión HTTP existente. Para obtener más información, consulte [Integraciones de HTTP para las API de REST en API Gateway](setup-http-integrations.md).
   + Elija **Mock (Simulación)** si desea generar respuestas de la API directamente a partir de API Gateway, sin necesidad de un backend de integración. Para obtener más información, consulte [Simulación de integraciones para las API de REST en API Gateway](how-to-mock-integration.md).
   + Elija **Servicio de AWS** si la API se va a integrar directamente con un servicio de AWS.
   + Elija **Enlace de VPC** si la API va a utilizar un `VpcLink` como un punto de conexión de integración privada. Para obtener más información, consulte [Configuración de una integración privada](set-up-private-integration.md).

1. Si elige **Función de Lambda**, proceda de la forma siguiente:

   1. En **Usar la integración de proxy Lambda**, elija la casilla si piensa usar la [Integración de proxy Lambda](set-up-lambda-proxy-integrations.md#api-gateway-create-api-as-simple-proxy) o la [Integración de proxy Lambda entre cuentas](apigateway-cross-account-lambda-integrations.md).

   1. En **Función de Lambda**, especifique la función de una de las siguientes formas:
      + Si la función de Lambda está en la misma cuenta, ingrese el nombre de la función y, a continuación, seleccione la función de la lista desplegable.
**nota**  
Si lo desea, el nombre de la función puede incluir su alias o especificación de versión, como en `HelloWorld`, `HelloWorld:1` o `HelloWorld:alpha`.
      + Si la función se encuentra en una cuenta diferente, escriba el ARN de la función.

   1. Si desea utilizar el valor predeterminado del tiempo de espera, que es de 29 segundos, mantenga activado el **Tiempo de espera predeterminado**. Para establecer un tiempo de espera personalizado, elija **Tiempo de espera predeterminado** e ingrese un valor de tiempo de espera comprendido entre `50` y `29000` milisegundos.

1. Si ha elegido **HTTP**, siga las instrucciones del paso 4 que figuran en [Configuración de una solicitud de integración de la API mediante la consola de API Gateway](how-to-method-settings-console.md).

1. Si ha elegido **Mock (Simulación)**, continúe con el paso **Request Templates (Plantillas de solicitud)**.

1. Si elige **Servicio de AWS**, siga las instrucciones del paso 6 que figuran en [Configuración de una solicitud de integración de la API mediante la consola de API Gateway](how-to-method-settings-console.md).

1. Si elige **Enlace de VPC**, haga lo siguiente:

   1. En **Integración de proxy VPC**, elija la casilla si desea que sus solicitudes se transfieran por proxy al punto de conexión del `VPCLink`.

   1. En **HTTP method (Método HTTP)**, elija el tipo de método HTTP que más se parezca al método del backend HTTP.

   1. En la lista desplegable **Enlace de VPC**, seleccione un enlace de VPC. Puede seleccionar `[Use Stage Variables]` e ingresar **\$1\$1stageVariables.vpcLinkId\$1** en el cuadro de texto situado debajo de la lista.

      Puede definir la variable de etapa `vpcLinkId` después de implementar la API en una etapa y establecer su valor en el ID del `VpcLink`.

   1. En **URL del punto de conexión**, escriba la dirección URL del backend HTTP que desea que utilice esta integración.

   1. Si desea utilizar el valor predeterminado del tiempo de espera, que es de 29 segundos, mantenga activado el **Tiempo de espera predeterminado**. Para establecer un tiempo de espera personalizado, elija **Tiempo de espera predeterminado** e ingrese un valor de tiempo de espera comprendido entre `50` y `29000` milisegundos.

1. Seleccione **Save changes (Guardar cambios)**.

1. En **Plantillas de solicitud**, haga lo siguiente:

   1. Para ingresar una **Expresión de selección de plantillas**, en **Plantillas de solicitud**, elija **Editar**.

   1. Ingrese una **Expresión de selección de plantillas**. Use una expresión que API Gateway busque en la carga del mensaje. Si la encuentra, se evalúa y el resultado es un valor de clave de plantilla que se utiliza para seleccionar la plantilla de asignación de datos que debe aplicarse a los datos de la carga del mensaje. En el siguiente paso se crea la plantilla de mapeo de datos. Elija **Editar** para guardar los cambios.

   1. Elija **Crear plantilla** para crear la plantilla de mapeo de datos. En **Clave de plantilla**, ingrese el valor de clave de plantilla que se utiliza para seleccionar la plantilla de mapeo de datos que debe aplicarse a los datos de la carga del mensaje. A continuación, ingrese una plantilla de mapeo. Seleccione **Crear plantilla**.

      Para obtener información sobre las expresiones de selección de plantillas, consulte [Expresiones de selección de plantilla](websocket-api-data-transformations.md#apigateway-websocket-api-template-selection-expressions).

## Configurar una solicitud de integración mediante la AWS CLI
<a name="apigateway-websocket-api-integration-request-using-awscli"></a>

Puede utilizar la AWS CLI para configurar una solicitud de integración para una ruta en una API de WebSocket tal y como se muestra en el siguiente ejemplo, que crea una integración simulada:

1. Cree un archivo denominado `integration-params.json` con el siguiente contenido:

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

1. El siguiente comando [create-integration](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-integration.html) permite crear la integración simulada.

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

   El resultado será similar al siguiente:

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

También puede configurar una solicitud de integración para una integración de proxy mediante la AWS CLI.

1. Cree una función de Lambda en la consola de Lambda y asígnela un rol de ejecución de funciones Lambda básico.

1. Use el siguiente comando [create-integration](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-integration.html) para crear la integración.

   ```
   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
   ```

El resultado será similar al siguiente:

```
{
    "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"
}
```

## Formato de entrada de una función de Lambda para la integración de proxy para API de WebSocket
<a name="api-gateway-simple-proxy-for-lambda-input-format-websocket"></a>

Con la integración de proxy de Lambda, API Gateway asigna toda la solicitud de cliente al parámetro de entrada `event` de la función de Lambda del backend. En el siguiente ejemplo se muestra la estructura del evento de entrada de la ruta `$connect` y el evento de entrada de la ruta `$disconnect` que API Gateway envía a una integración de proxy de Lambda.

------
#### [ 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
  }
```

------