¿Cómo puedo integrar una API de REST de API Gateway con Amazon SQS y solucionar los errores más comunes?

Última actualización: 23/11/2022

Quiero integrar una API de REST de Amazon API Gateway con Amazon Simple Queue Service (Amazon SQS). También quiero solucionar los errores de integración. ¿Qué medidas debo tomar?

Resolución

Los usuarios configuran las API de REST de API Gateway para que funcionen con Amazon SQS con el fin de crear una solución integrada. Este artículo describe los pasos para integrar API Gateway con Amazon SQS y proporciona información para solucionar los errores de configuración más comunes.

Configurar la API de REST y una integración de Amazon SQS

Para integrar una API de REST de API Gateway con Amazon SQS, siga estos pasos:

1.    Cree una cola de SQS.

2.    Cree una función de AWS Identity and Access Management (IAM) y, a continuación, adjunte una política de Amazon SQS con un permiso SendMessage. Esta política permite que los mensajes de la API se publiquen en Amazon SQS. En la política, sustituya example-region por su región de AWS, example-account-id por su ID de cuenta de AWS y example-sqs-queue-name por su nombre de cola de SQS.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Resource": [
        "arn:aws:sqs:example-region:example-account-id:example-sqs-queue-name"
      ],
      "Action": [
        "sqs:SendMessage"
      ]
    }
  ]
}

3.    Cree una API de REST en API Gateway.

4.    En la consola de API Gateway, cree una integración de Amazon SQS para su nueva API de REST.

  • Si lo desea, puede crear un recurso de la API de REST o un método de la API de REST.
  • Cree un método POST.
    En Integration type (Tipo de integración), elija AWS Service (Servicio de AWS).
    En AWS Region (Región de AWS), elija su región.
    En AWS Service (Servicio de AWS), elija Simple Queue Service (SQS).
    En AWS Subdomain (Subdominio de AWS), ingrese Opcional.
    En HTTP method (Método HTTP), elija POST.
    En Action Type (Tipo de acción), elija Use path override (Usar invalidación de ruta).
    En Path override (optional) (Invalidación de ruta [opcional]), ingrese example-account-id/example-sqs-queue-name y reemplace example-account-id por el ID de la cuenta de AWS y example-sqs-queue-name por el nombre de la cola de SQS. Por ejemplo, 1234567890/MySQSStandardQueue.
    En Execution role (Rol de ejecución), ingrese el ARN del rol de IAM creado en el paso 2.
    En Content Handling (Gestión de contenido), elija la opción que se ajuste a su configuración.
    Elimine o seleccione Default Timeout (Tiempo de espera predeterminado). Elija la opción que se adapte a su configuración.
    Guarde el nuevo método POST.
  • A continuación, ingrese la información de integración de la API de REST.
    Elija el método POST Integration Request (Solicitud de integración).
    Expanda HTTP Headers (Encabezados HTTP).
    Seleccione Add header (Agregar encabezado).
    En Name (Nombre), ingrese Content-Type (Tipo de contenido).
    En Mapped from (Asignado desde), ingrese «application/x-www-form-urlencoded» y elija Create (Crear).
    Expanda Mapping Templates (Plantillas de mapeo).
    En Request body passthrough (Paso directo del cuerpo de la solicitud), seleccione la opción que se ajuste a sus necesidades.
    Elija Add mapping template (Agregar plantilla de mapeo).
    En Content-Type (Tipo de contenido), ingrese application/json y elija Create (Crear).
    En la plantilla, ingrese Action=SendMessage&MessageBody=$input.body

4.    Implemente la API de REST configurada.

5.    Pruebe la configuración enviando la siguiente solicitud a la API Gateway. Sustituya example-api-id por su ID de API, example-region por su región de AWS, example-stage por el nombre de su etapa de pruebas y example-resource por el nombre de su recurso.

curl --location --request POST 'https://example-api-id.execute-api.example-region.amazonaws.com/example-stage/example-resource' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "message": "Hello World"
    }'

Cuando su integración se realiza correctamente, la respuesta es similar a la siguiente:

{
    "SendMessageResponse": {
        "ResponseMetadata": {
            "RequestId": "f879fb11-e736-52c0-bd29-a0f2d09ad90d"
        },
        "SendMessageResult": {
            "MD5OfMessageAttributes": null,
            "MD5OfMessageBody": "3fc759ac1733366f98ec4270c788fcd1",
            "MD5OfMessageSystemAttributes": null,
            "MessageId": "4c360c3c-08f4-4392-bc14-8b0c88e314a2",
            "SequenceNumber": null
        }
    }
}

Resolución de errores comunes

Error UnknownOperationException

Se produce un error UnknownOperationException cuando un usuario no configura Content-Type (Tipo de contenido) como «application/x-www-form-urlencoded» en el encabezado HTTP de la solicitud de integración. El error UnknownOperationException también se produce cuando la acción SendMessage no se agrega a la plantilla de mapeo de solicitudes de integración.

Error AccessDenied

A continuación se muestra un ejemplo de error AccessDenied:

{
  "Error": {
    "Code": "AccessDenied",
    "Message": "Access to the resource https://sqs.example-region.amazonaws.com/example-account-id/example-sqs-queue-name is denied.",
    "Type": "Sender"
  },
  "RequestId": "92aea8b7-47f1-5bd4-b3c4-f3d0688d3809"
}

Se produce un error AccessDenied cuando el rol de ejecución de la integración de la API no tiene el permiso sqs:SendMessage establecido para enviar mensajes a la cola de SQS. El error AccessDenied también puede ocurrir cuando se incluyen caracteres especiales como «&» y «%» en la carga útil del cuerpo de la solicitud. Los caracteres especiales deben estar codificados para poder utilizarlos. Agregue la función $util.urlEncode() en la plantilla de mapeo para convertir el cuerpo de la solicitud de una cadena a un formato codificado. A continuación se muestra un ejemplo de plantilla de mapeo:

Action=SendMessage&MessageBody=$util.urlEncode($input.body)

El siguiente ejemplo incluye los permisos necesarios para enviar mensajes a la cola de SQS. Sustituya example-region por su región de AWS, example-account-id por su ID de cuenta de AWS y example-sqs-queue-name por su nombre de cola de SQS.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Resource": [
        "arn:aws:sqs:example-region:example-account-id:example-sqs-queue-name"
      ],
      "Action": [
        "sqs:SendMessage"
      ]
    }
  ]
}

Error KMS.AccessDeniedException

Los siguientes son dos ejemplos de errores KMS.AccessDeniedException:

{
  "Error": {
    "Code": "KMS.AccessDeniedException",
    "Message": "User: arn:aws:sts::example-account-number:assumed-role/example-sqs-queue-name/BackplaneAssumeRoleSession is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:example-region:example-account-number:key/example-keyId because no identity-based policy allows the kms:GenerateDataKey action (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: c58f1eec-6b18-4029-826b-d05d6a715716; Proxy: null)",
    "Type": "Sender"
  },
  "RequestId": "99976a6a-3311-57e9-86e9-310d0654ff80"
}
{
  "Error": {
    "Code": "KMS.AccessDeniedException",
    "Message": "The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access. (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: a8adea02-c246-49d9-8b3d-ff6b6a43b40f; Proxy: null)",
    "Type": "Sender"
  },
  "RequestId": "9565c451-742c-55f3-a1eb-9f3641fd30aa"
}

Se produce un error KMS.AccessDeniedException cuando el rol de ejecución de integración de la API no puede realizar operaciones a través de AWS Key Management Service (AWS KMS). Para realizar operaciones en las claves de AWS KMS que se adjuntan a la cola cifrada del lado del servidor de Amazon SQS es necesario configurar el permiso.

El siguiente ejemplo incluye los permisos necesarios para realizar operaciones en las claves KMS adjuntas a la cola SQS. Sustituya example-account-id por el ID de su cuenta de AWS y example-api-gw-integration-execution-role por el nombre de su rol de ejecución.

{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::example-account-id:role/example-api-gw-integration-execution-role"
  },
  "Action": [
    "kms:Encrypt",
    "kms:GenerateDataKey*",
    "kms:Decrypt"
  ],
  "Resource": "*"
}

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?