In che modo posso integrare una REST API di Gateway API con Amazon SQS e risolvere gli errori più comuni?

6 minuti di lettura
0

Desidero integrare una REST API di Gateway Amazon API con Servizio di coda semplice Amazon (Amazon SQS). Vorrei anche risolvere gli errori di integrazione.

Risoluzione

È possibile configurare le REST API di Gateway API in modo da lavorare con Amazon SQS per creare una soluzione integrata.

Configurazione della REST API e integrazione con Amazon SQS

Per integrare una REST API di Gateway API con Amazon SQS, completa le seguenti operazioni:

1.    Crea una coda SQS.

2.    Crea un ruolo AWS Identity and Access Management (IAM), quindi allega una policy Amazon SQS con un'autorizzazione SendMessage. Questa policy consente di pubblicare i messaggi dall'API ad Amazon SQS. Nella policy, sostituisci example-region con la tua regione AWS, example-account-id con l'ID del tuo account AWS e example-sqs-queue-name con il nome della coda 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.    Crea una REST API in Gateway API.

4.    Nella console Gateway API, crea un'integrazione Amazon SQS per la tua REST API appena creata.

  • Facoltativamente, crea una risorsa REST API o un metodo REST API.
  • Crea un metodo POST.
    Per Integration type (Tipo di integrazione), scegli AWS Service (Servizio AWS).
    Per AWS Region (Regione AWS), scegli la tua regione AWS.
    Per AWS Service (Servizio AWS), scegli Simple Queue Service (SQS).
    (Facoltativo) Per il AWS Subdomain (Sottodominio AWS), inserisci il sottodominio utilizzato dal servizio AWS. Consulta la documentazione del servizio AWS per avere conferma della disponibilità di un sottodominio. Per la configurazione di esempio di Amazon SQS, lascia vuoto questo campo.
    Per HTTP method (Metodo HTTP), scegli POST.
    Per Action Type (Tipo di operazione), scegli Use path override (Usa sovrascrittura del percorso).
    Per Path override (optional) [Sovrascrittura del percorso (opzionale)], inserisci l'ID dell'account e il nome della coda SQS nel seguente formato: example-account-id/example-sqs-queue-name. Ad esempio, 1234567890/MySQSStandardQueue.
    Per Execution role (Ruolo di esecuzione), inserisci l'ARN del ruolo IAM creato nel passaggio 2.
    Per Content Handling (Gestione dei contenuti), scegli l'opzione più adatta alla tua configurazione.
    Deseleziona o seleziona Default Timeout (Timeout predefinito). Scegli l'opzione più adatta alla tua configurazione.
    Salva il nuovo metodo POST.
  • Continua a inserire le informazioni di integrazione della tua REST API.
    Scegli Integration Request (Richiesta di integrazione) per il metodo POST.
    Espandi HTTP Headers (Intestazioni HTTP).
    Scegli Add header (Aggiungi intestazione).
    Per Name (Nome), inserisci Content-Type.
    Per Mapped from (Mappato da), inserisci 'application/x-www-form-urlencoded', quindi scegli Create (Crea).
    Espandi Mapping Templates (Modelli di mappatura).
    Per Request body passthrough (Passthrough corpo richiesta), seleziona l'opzione più adatta alle tue esigenze.
    Scegli Add mapping template (Aggiungi modello di mappatura).
    Per Content-Type, inserisci application/json e scegli Create (Crea).
    Per il modello, inserisci Action=SendMessage&MessageBody=$input.body

4.    Implementa la REST API configurata.

5.    Prova la configurazione inviando la seguente richiesta a Gateway API. Sostituisci example-api-id con il tuo ID API, example-region con la tua regione AWS, example-stage con il nome della fase di test e example-resource con il nome della tua risorsa.

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"
  }'

Se l'integrazione ha esito positivo, la risposta sarà simile alla seguente:

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

Risoluzione degli errori più comuni

Errore UnknownOperationException

Un errore UnknownOperationException si verifica quando un utente non riesce a configurare il Content-Type come "application/x-www-form-urlencoded" nell'intestazione HTTP della richiesta di integrazione. L'errore UnknownOperationException si verifica anche quando l'operazione SendMessage non viene aggiunta al modello di mappatura della richiesta di integrazione.

Errore AccessDenied

Di seguito è riportato un esempio di errore 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"
}

Un errore AccessDenied si verifica quando il ruolo di esecuzione dell'integrazione API non ha l'autorizzazione sqs:SendMessage impostata per inviare messaggi alla coda SQS. L'errore AccessDenied può verificarsi anche quando caratteri speciali come "&" e "%" vengono trasmessi nel payload del corpo della richiesta. Per essere trasmessi, i caratteri speciali devono essere codificati. Aggiungi la funzione $util.urlEncode() nel modello di mappatura per convertire il corpo della richiesta da una stringa a un formato codificato. Di seguito è riportato un esempio di modello di mappatura:

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

L'esempio seguente include le autorizzazioni necessarie per inviare messaggi alla coda SQS. Sostituisci example-region con la tua regione AWS, example-account-id con l'ID del tuo account AWS e example-sqs-queue-name con il nome della coda SQS.

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

Errore KMS.AccessDeniedException

Di seguito sono riportati due esempi di errori 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"
}

Un errore KMS.AccessDeniedException si verifica quando il ruolo di esecuzione dell'integrazione API non può eseguire operazioni tramite il Servizio di gestione delle chiavi AWS (AWS KMS). L'autorizzazione deve essere configurata per eseguire operazioni sulle chiavi AWS KMS collegate alla coda crittografata lato server Amazon SQS.

L'esempio seguente include le autorizzazioni necessarie per eseguire operazioni sulle chiavi KMS collegate alla coda SQS. Sostituisci example-account-id con l'ID del tuo account AWS e example-api-gw-integration-execution-role con il nome del tuo ruolo di esecuzione.

{
  "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": "*"
}