Wie integriere ich eine API-Gateway-REST-API in Amazon SQS und behebe häufig auftretende Fehler?

Lesedauer: 5 Minute
0

Ich möchte eine REST-API von Amazon API Gateway in Amazon Simple Queue Service (Amazon SQS) integrieren. Außerdem möchte ich Integrationsfehler beheben.

Auflösung

Sie können API-Gateway-REST-APIs so konfigurieren, dass sie mit Amazon SQS funktionieren, um eine integrierte Lösung zu erstellen.

REST-API und eine Amazon-SQS-Integration einrichten

Gehen Sie wie folgt vor, um eine API-Gateway-REST-API in Amazon SQS zu integrieren:

1.    Erstellen Sie eine SQS-Warteschlange.

2.    Erstellen Sie eine Rolle für AWS Identity and Access Management (IAM) und fügen Sie dann eine Amazon-SQS-Richtlinie mit einer SendMessage-Berechtigung zu. Diese Richtlinie ermöglicht es Ihnen, Nachrichten von der API an Amazon SQS zu übermitteln. Ersetzen Sie in der Richtlinie example-region durch Ihre AWS-Region, example-account-id durch Ihre AWS-Konto-ID und example-sqs-queue-name durch den Namen Ihrer SQS-Warteschlange.

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

3.    Erstellen Sie eine REST-API in API Gateway.

4.    Erstellen Sie in der API-Gateway-Konsole eine Amazon-SQS-Integration für Ihre neu erstellte REST-API.

  • Erstellen Sie optional eine REST-API-Ressource oder eine REST-API-Methode.
  • Erstellen Sie eine POST-Methode.
    Wählen Sie als Integrationstyp die Option AWS-Service aus.
    Wählen Sie als AWS-Region Ihre AWS-Region aus.
    Wählen Sie als AWS-Service Simple Queue Service (SQS) aus.
    (Optional) Geben Sie für AWS-Subdomain die Subdomäne ein, die der AWS Service verwendet. Überprüfen Sie die AWS-Servicedokumentation, um die Verfügbarkeit einer Subdomäne zu überprüfen. Lassen Sie dieses Feld für die Amazon-SQS-Beispiel-Einrichtung leer.
    Wählen Sie als HTTP-Methode die Option POST aus.
    Wählen Sie für Aktionstyp die Option Pfadüberschreibung verwenden.
    Geben Sie für Pfadüberschreibung (optional) Ihre Konto-ID und den SQS-Warteschlangennamen im folgenden Format ein: example-account-id/example-sqs-queue-name. Zum Beispiel 1234567890/MySQSStandardQueue.
    Geben Sie als Execution role (Ausführungsrolle) den ARN der IAM-Rolle ein, die Sie in Schritt 2 erstellt haben.
    Wählen Sie für Content Handling (Inhaltsverarbeitung) die zu Ihrer Konfiguration passende Option.
    Löschen oder wählen Sie Default Timeout (Standard Timeout). Wählen Sie die zu Ihrer Konfiguration passende Option.
    Speichern Sie die neue POST-Methode.
  • Geben Sie alle weiteren Informationen zu Ihrer REST-API-Integration ein.
    Wählen Sie die POST-Methode Integration Request (Integrationsanforderung) aus.
    Erweitern Sie die HTTP-Header.
    Wählen Sie Add header (Header hinzufügen) aus.
    Geben Sie als Name Content-Type (Inhaltstyp) ein.
    Geben Sie für Mapped from (Zugeordnet aus) 'application/x-www-form-urlencoded' ein und wählen Sie dann Create (Erstellen) aus.
    Erweitern Sie Mapping-Vorlagen.
    Wählen Sie für Request body passthrough (Anforderungstext-Durchleitung) die Option aus, die Ihren Anforderungen entspricht.
    Wählen Sie Zuordnungsvorlage hinzufügen aus.
    Geben Sie für Content-Type (Inhaltstyp) application/json ein und wählen Sie dann Create (Erstellen) aus.
    Geben Sie für die Vorlage Action=SendMessage&MessageBody=$input.body ein

4.    Stellen Sie die konfigurierte REST-API bereit.

5.    Testen Sie die Konfiguration, indem Sie die folgende Anfrage an API Gateway senden. Ersetzen Sie example-api-id durch Ihre API-ID, example-region durch Ihre AWS-Region, example-stage durch den Namen Ihrer Testphase und example-resource durch Ihren Ressourcennamen.

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

Wenn Ihre Integration erfolgreich ist, sieht Ihre Antwort in etwa wie folgt aus:

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

Häufige Fehler beheben

UnknownOperationException-Fehler

Ein UnknownOperationException-Fehler tritt auf, wenn ein Benutzer den Inhaltstyp im HTTP-Header der Integrationsanfrage nicht als „application/x-www-form-urlencoded“ konfiguriert. Der UnknownOperationException-Fehler tritt auch auf, wenn Sie die SendMessage-Aktion nicht zur Zuordnungsvorlage der Integrationsanfrage hinzufügen.

AccessDenied-Fehler

Nachfolgend sehen Sie ein Beispiel für einen AccessDenied-Fehler:

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

Ein AccessDenied-Fehler tritt auf, wenn für die Ausführungsrolle der API-Integration nicht die sqs:SendMessage-Berechtigung zum Senden von Nachrichten an die SQS-Warteschlange festgelegt ist. Der AccessDenied-Fehler kann auch auftreten, wenn Sie Sonderzeichen wie „&“ und „%“ in der Nutzlast des Anforderungstextes übermitteln. Sie müssen die Sonderzeichen kodieren, um sie zu übermitteln. Fügen Sie der Zuordnungsvorlage die Funktion $util.urlEncode() hinzu, um den Anforderungstext von einer Zeichenfolge in ein kodiertes Format zu übertragen. Im Folgenden finden Sie ein Beispiel für eine Zuordnungsvorlage:

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

Das folgende Beispiel enthält die Berechtigungen, die Sie zum Senden von Nachrichten an die SQS-Warteschlange benötigen. Ersetzen Sie example-region durch Ihre AWS-Region, example-account-id durch Ihre AWS-Konto-ID und example-sqs-queue-name durch den Namen Ihrer SQS-Warteschlange.

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

KMS.AccessDeniedException-Fehler

Im Folgenden sind zwei Beispiele für KMS.AccessDeniedException-Fehler aufgeführt:

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

Ein KMS.AccessDeniedException-Fehler tritt auf, wenn die Ausführungsrolle der API-Integration keine Operationen über den AWS Key Management Service (AWS KMS) ausführen kann. Sie müssen die Berechtigungen so konfigurieren, dass Operationen mit den AWS-KMS-Schlüsseln ausgeführt werden können, die mit der serverseitigen verschlüsselten Amazon-SQS-Warteschlange verbunden sind.

Das folgende Beispiel enthält die Berechtigungen, die Sie benötigen, um Operationen mit den an die SQS-Warteschlange angefügten KMS-Schlüsseln durchzuführen. Ersetzen Sie example-account-id durch Ihre AWS-Konto-ID und example-api-gw-integration-execution-role durch den Namen Ihrer Ausführungsrolle.

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

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr