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

6 minutos de lectura
0

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.

Resolución

Puede configurar las API de REST de API Gateway para que funcionen con Amazon SQS con el fin de crear una solución integrada.

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 le permite publicar mensajes de la API 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).
    (Opcional) En AWS Subdomain (Subdominio de AWS), ingrese el subdominio que utiliza el servicio de AWS. Consulte la documentación del servicio de AWS para confirmar la disponibilidad de un subdominio. En el ejemplo de configuración de Amazon SQS, deje el campo en blanco.
    En HTTP method (Método HTTP), elija POST.
    En Action Type (Tipo de acción), elija Use path override (Usar sustitución de ruta).
    En Path override (optional) (Sustitución de ruta [opcional]), ingrese su ID de cuenta y el nombre de la cola de SQS con el siguiente formato: ejemplo-de-id-de-cuenta/ejemplo-de-nombre-de-cola-de-sqs. Por ejemplo, 1234567890/MySQSStandardQueue.
    En Execution role (Rol de ejecución), ingrese el ARN del rol de IAM que creó en el paso 2.
    En Content Handling (Tratamiento 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 asignación).
    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 asignación).
    En Content-Type (Tipo de contenido), ingrese application/json y, a continuación, 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 no agrega la acción SendMessage a la plantilla de asignación 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 incluye caracteres especiales como “&” y “%” en la carga útil del cuerpo de la solicitud. Debe codificar los caracteres especiales que incluya. Agregue la función $util.urlEncode() en la plantilla de asignación para convertir el cuerpo de la solicitud de una cadena a un formato codificado. A continuación se muestra un ejemplo de plantilla de asignación:

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

El siguiente ejemplo incluye los permisos que necesita 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 llevar a cabo operaciones a través de AWS Key Management Service (AWS KMS). Debe configurar los permisos para llevar a cabo operaciones en las claves de AWS KMS que se adjuntan a la cola cifrada del servidor de Amazon SQS.

El siguiente ejemplo incluye los permisos que necesita para llevar a cabo operaciones en las claves de KMS que se adjuntan a la cola de 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": "*"
}

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año