Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Wie integriere ich eine API Gateway REST-API in Amazon SQS und behebe häufig auftretende Fehler?
Ich möchte eine Amazon API Gateway REST-API in Amazon Simple Queue Service (Amazon SQS) integrieren und Integrationsfehler beheben.
Lösung
Wähle eine der folgenden Methoden, um eine API Gateway-REST-API in Amazon SQS zu integrieren:
- Verwendung des AWS-Abfrageprotokolls
- Verwendung des AWS-JSON-Protokolls
Verwendung des AWS-Abfrageprotokolls
Du kannst das AWS-Abfrageprotokoll verwenden, um eine API Gateway-REST-API in Amazon SQS zu integrieren. Gehe dazu wie folgt vor:
- Erstelle eine SQS-Warteschlange.
- Erstelle eine AWS Identity and Access Management (IAM)-Rolle und hänge dann eine Amazon-SQS-Richtlinie mit einer SendMessage-Berechtigung an. Die Richtlinie ermöglicht es dir, Nachrichten von der API in Amazon SQS zu veröffentlichen:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": [ "arn:aws:sqs:example-region:example-account-id:example-sqs-queue-name" ], "Action": [ "sqs:SendMessage" ] } ] }
Hinweis: Ersetze example-region durch deine AWS-Region, example-account-id durch deine AWS-Konto-ID und example-sqs-queue-name durch deinen SQS-Warteschlangennamen.
- Erstelle eine REST-API in API Gateway.
- Erstelle in der API-Gateway-Konsole eine Amazon-SQS-Integration für die REST-API.
- Erstelle eine REST-API-Ressource oder eine REST-API-Methode:
Wähle auf dem Bildschirm Ressourcen die Option Methode erstellen.
Wähle als Methodentyp POST aus.
Wähle für Integrationstyp AWS Service aus.
Wähle für AWS-Region deine Region aus.
Wähle für AWS Service Simple Queue Service (SQS).
(Optional) Gib für AWS Subdomain die vom AWS Service verwendete Subdomain ein. Überprüfe die Verfügbarkeit einer Subdomain in der AWS-Service-Dokumentation. Lasse dieses Feld für das Amazon-SQS-Beispiel-Setup leer.
Wähle als HTTP-Methode POST.
Wähle als Aktionstyp die Option Pfadüberschreibung verwenden aus.
Gib für Pfadüberschreibung (optional) deine Konto-ID und den SQS-Warteschlangennamen im folgenden Format ein: example-account-id/example-sqs-queue-name. Zum Beispiel: 1234567890/MySQSStandardQueue.
Gib für die Ausführungsrolle den ARN der IAM-Rolle ein.
Wähle für Standard-Timeout eine Option für dein Setup.
Gib weiterhin deine REST-API-Integrationsinformationen ein.
Wähle die POST-Methode Integration Request.
Wähle Bearbeiten aus.
Wähle für Request Body Passthrough die Option aus, die deinen Anforderungen entspricht.
Erweitere die Parameter für URL-Anforderungsheader.
Wähle Request Header Parameter hinzufügen.
Gib als Name Content-Type ein.
Gib für ** Mapped from** „application/x-www-form-urlencoded“ ein.
Erweitere dann Mapping-Vorlagen.
Wähle Mapping-Vorlage hinzufügen.
Gib als Content-Type application/json ein.
Gib für die Vorlage **Action=SendMessage&MessageBody=$input.body ** ein, und wähle dann Speichern. - Stelle die REST-API bereit.
- Um das Setup zu testen, sende die folgende Anfrage an API Gateway:
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" }'
Hinweis: Ersetze example-api-id durch deine API-ID, example-region durch deine Region, example-stage durch den Namen deiner Testphase und example-resource durch den Namen deiner Ressource.
Wenn die Integration erfolgreich ist, sieht die Antwort 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 } } }
Verwendung des AWS-JSON-Protokolls
Du kannst das AWS-JSON-Protokoll verwenden, um eine API Gateway-REST-API in Amazon SQS zu integrieren. Gehe dazu wie folgt vor:
- Erstelle eine SQS-Warteschlange.
- Erstelle eine AWS-IAM-Rolle und füge dann eine Amazon SQS-Richtlinie mit einer SendMessage-Berechtigung an. Die Richtlinie ermöglicht es dir, Nachrichten von der API in Amazon SQS zu veröffentlichen:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": [ "arn:aws:sqs:example-region:example-account-id:example-sqs-queue-name" ], "Action": [ "sqs:SendMessage" ] } ] }
Hinweis: Ersetze example-region durch deine AWS-Region, example-account-id durch deine AWS-Konto-ID und example-sqs-queue-name durch deinen SQS-Warteschlangennamen.
- Erstelle eine REST-API in API Gateway.
- Erstelle in der API-Gateway-Konsole eine Amazon-SQS-Integration für die REST-API.
- Erstelle eine REST-API-Ressource oder eine REST-API-Methode:
Wähle auf dem Bildschirm Ressourcen die Option Methode erstellen.
Wähle als Methodentyp POST aus.
Wähle für Integrationstyp AWS Service aus.
Wähle für AWS-Region deine Region aus.
Wähle für AWS Service Simple Queue Service (SQS).
Lasse AWS-Subdomain leer. Dies ist ein optionaler Parameter, in den du die Subdomain eingibst, die ein AWS-Service verwendet. Überprüfe die Verfügbarkeit einer Subdomain in der AWS-Service-Dokumentation.
Wähle als HTTP-Methode POST.
Wähle als Aktionstyp die Option Pfadüberschreibung verwenden aus.
Gib für Pfadüberschreibung das Zeichen / ein.
Gib für die Ausführungsrolle den ARN der IAM-Rolle ein.
Wähle für Standard-Timeout eine Option für dein Setup.
Erweitere HTTP-Anforderungsheader.
Wähle Header hinzufügen.
Gib als Name Content-Type ein.
Wähle Header hinzufügen.
Gib als Name X-Amz-Target ein.
Wähle Methode erstellen aus.
Wähle die POST-Methode Integration Request.
Wähle Bearbeiten aus.
Belasse für Pass-Through des Anforderungstexts die Standardoption Wenn keine Vorlage dem Header des Anforderungsinhaltstyps entspricht.
Erweitere die Parameter für URL-Anforderungsheader.
Wähle Request Header Parameter hinzufügen.
Gib als Name Content-Type ein.
Gib für Zugewiesen von method.request.header.Content-Type ein.
Wähle Request Header Parameter hinzufügen.
Gib als Name X-Amz-Target ein.
Gib für Zugewiesen von method.request.header.X-Amz-Target ein.
Wähle Speichern. - Stelle die REST-API bereit.
- Um das Setup zu testen, sende die folgende Anfrage an API Gateway:
curl --location --request POST 'https://example-api-id.execute-api.example-region.amazonaws.com/example-stage/example-resource' \ --header 'Content-Type:application/x-amz-json-1.0' \ --header 'X-Amz-Target:AmazonSQS.SendMessage' \ --data-raw '{ "QueueUrl": "https://sqs.<region>.<domain>/<awsAccountId>/<queueName>/", "MessageBody": "This is a test message" }'
Hinweis: Ersetze example-api-id durch deine API-ID, example-region durch deine Region, example-stage durch den Namen deiner Testphase und example-resource durch den Namen deiner Ressource. Überprüfe die Amazon SQS-Warteschlangendetails, um den QueueUrl-Wert zu ermitteln.
Wenn die Integration erfolgreich ist, sieht die Antwort etwa wie folgt aus:
{"MD5OfMessageBody":"fafb00f5732ab283681e124bf8747ed1","MessageId":"b5aef1f3-af31-49f2-9973-6f802f7753e6"}
Hinweis: Die erwartete Antwort des AWS-JSON-Protokolls unterscheidet sich vom AWS-Abfrageprotokoll, selbst für denselben API-Aufruf. In der SQS-API-Referenz findest du beispielsweise Antworten aus den einzelnen Protokollen.
Häufig auftretende Fehler beheben
UnknownOperationException-Fehler
Du kannst sowohl vom AWS-Abfrageprotokoll als auch vom AWS-JSON-Protokoll einen UnknownOperationException-Fehler erhalten.
Wenn du das AWS-Abfrageprotokoll verwendest, erhältst du eine UnknownOperationException, wenn du den Inhaltstyp nicht als „application/x-www-form-urlencoded“ im HTTP-Header der Integrationsanforderung konfigurierst. Dieser Fehler wird auch angezeigt, wenn du die SendMessage-Aktion nicht zur Zuweisungsvorlage der Integrationsanforderung hinzufügst. Um diesen Fehler zu beheben, stelle sicher, dass der Inhaltstyp korrekt formatiert ist, und nimm die SendMessage-Aktion in die Zuweisungsvorlage auf.
Wenn du das AWS-JSON-Protokoll verwendest, erhältst du einen UnknownOperationException-Fehler, wenn du die Header Inhaltstyp und X-Amz-Target nicht sendest oder nicht richtig konfigurierst. Um diesen Fehler zu beheben, konfiguriere den Inhaltstyp-Header als „application/x-amz-json-1.0“ und den X-Amz-Target-Header als AmazonSQS.{SQS-Action} und nimm beide Header in die Anforderung auf.
AccessDenied-Fehler
Du kannst sowohl vom AWS-Abfrageprotokoll als auch vom AWS-JSON-Protokoll einen AccessDenied-Fehler erhalten.
Du erhältst einen AccessDenied-Fehler, wenn für die Ausführungsrolle der API-Integration nicht die sqs:SendMessage-Berechtigung zum Senden von Nachrichten an die SQS-Warteschlange festgelegt ist.
Du erhältst diesen Fehler auch, wenn du das AWS-Abfrageprotokoll verwendest und nicht unterstützte Sonderzeichen in der Nutzdatenzeichenfolge des Anforderungstexts übergibst. Du musst Sonderzeichen codieren, um diesen Fehler zu vermeiden. Füge der Zuweisungsvorlage die Funktion $util.urlEncode() hinzu, um den Anforderungstext von einer Zeichenfolge in ein codiertes Format zu konvertieren. Im Folgenden findest du ein Beispiel für eine Zuordnungsvorlage:
Action=SendMessage&MessageBody=$util.urlEncode($input.body)
Das folgende Beispiel enthält die erforderlichen Berechtigungen zum Senden von Nachrichten an die 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" ] } ] }
Hinweis: Ersetze example-region durch deine Region, example-account-id durch deine Konto-ID und example-sqs-queue-name durch deinen SQS-Warteschlangennamen.
KMS.AccessDeniedException-Fehler
Du kannst sowohl vom AWS-Abfrageprotokoll als auch vom AWS-JSON-Protokoll einen KMS.AccessDeniedException-Fehler erhalten.
Du erhältst einen KMS.AccessDeniedException-Fehler, wenn die Ausführungsrolle der API-Integration keine Operationen über den AWS Key Management Service (AWS KMS) ausführen kann. Konfiguriere Berechtigungen für die Ausführung von Operationen mit den AWS-KMS-Schlüsseln, die an die serverseitige verschlüsselte Amazon SQS-Warteschlange angefűgt sind, um diesen Fehler zu beheben.
Das folgende Beispiel enthält die erforderlichen Berechtigungen zum Ausführen von Operationen mit den KMS-Schlüsseln, die an die SQS-Warteschlange angefügt sind:
{ "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": "*" }
Hinweis: Ersetze example-account-id durch deine Konto-ID und example-api-gw-integration-execution-role durch den Namen deiner Ausführungsrolle.
SignatureDoesNotMatch-Fehler
Du kannst einen SignatureDoesNotMatch-Fehler erhalten, wenn du das AWS-Abfrageprotokoll verwendest.
Du erhältst einen SignatureDoesNotMatch-Fehler, wenn die HTTP-Methode der Integrationsanfrage auf GET statt auf POST gesetzt ist. Setze die HTTP-Methode auf POST, um diesen Fehler zu beheben.
InvalidAddress-Fehler
Du kannst einen InvalidAddress-Fehler erhalten, wenn du das AWS-JSON-Protokoll verwendest.
Du erhältst einen InvalidAddress-Fehler, wenn die SQS-Warteschlangen-URL in den Textnutzdaten falsch ist. Um diesen Fehler zu beheben, überprüfe die Warteschlangen-URL der SQS-Warteschlange, auf die der API-Aufruf abzielt.
SerializationException-Fehler
Du kannst einen SerializationException-Fehler erhalten, wenn du das AWS-JSON-Protokoll verwendest.
Du erhältst einen SerializationException-Fehler, wenn die Textnutzdaten eine ungültige JSON sind. Beispielsweise könnte deine JSON ein fehlendes oder zusätzliches Komma oder eine fehlende oder zusätzliche geschweifte Klammer enthalten. Um diesen Fehler zu beheben, verwende ein JSON-Formatierungstool, um Syntaxfehler in der JSON zu finden.
MissingRequiredParameterException-Fehler
Du kannst einen MissingRequiredParameterException-Fehler erhalten, wenn du das AWS-JSON-Protokoll verwendest.
Du erhältst einen MissingRequiredParameterException-Fehler, wenn du einen oder mehrere der erforderlichen Parameter nicht in die Textnutzdaten aufnimmst. Die erforderlichen Parameter hängen vom API-Aufruf ab. Beispielsweise erhältst du diesen Fehler bei einem SendMessage-API-Aufruf, wenn der Parameter MessageBody fehlt. Die erforderlichen Parameter und Syntax findest du in der SQS-API-Referenz.
Ähnliche Informationen
Integrieren des Amazon API Gateway mit Amazon SQS, um asynchrone REST-APIs zu verarbeiten
Wie verwende ich API Gateway als Proxy für einen anderen AWS-Service?
Ähnliche Videos

