Blog

Ereignisbehandlung in AWS mit Terraform

Bart den Hollander

Aktualisiert Oktober 21, 2025
5 Minuten

Event Messaging ist ein leistungsfähiges Konzept zum Senden von Benachrichtigungen zwischen entkoppelten Services in Ihrem Backend. In einem früheren Blog-Beitrag hat mein Kollege bereits viel über dieses Thema unter Verwendung von Amazons SNS und SQS erklärt. In diesem Blog-Beitrag werde ich mich darauf konzentrieren, wie Sie Event Messaging in AWS unter Verwendung von SNS und SQS einrichten können, aber mit dem praktischen Einsatz von Terraform.

terraform

Terraform

Ohne den Einsatz von Lösungen wie Terraform muss die Erstellung der Infrastruktur für Ihren Cloud-Anbieter über die Website oder die Befehlszeilenschnittstelle erfolgen. Das kann mühsam und fehleranfällig werden, vor allem, wenn Sie dieselben Dienste mehr als einmal erstellen müssen. Terraform ermöglicht es, Infrastructure as Code zu erstellen, so dass wir die Infrastruktur auf automatisierte Weise schreiben können.

Nutzen Sie Infrastructure as Code, um jede Cloud, Infrastruktur oder jeden Service bereitzustellen und zu verwalten.

Neben Terraform gibt es auch CloudFormation, die AWS-eigene Lösung für Infrastructure as Code. Ein großer Unterschied zwischen diesen beiden Lösungen ist, dass Terraform Open Source und Cloud-agnostisch ist. Das bedeutet, dass Terraform mit Hunderten von Anbietern zusammenarbeiten kann, während CloudFormation eng mit AWS integriert ist.

In diesem Blog werde ich Terraform verwenden, um eine Infrastruktur für AWS für die Dienste SNS und SQS zu erstellen. Ich verwende CloudFormation nicht, weil ich die Möglichkeit beibehalten möchte, andere Cloud-Anbieter über meine Skripte zu betreiben.

Lassen Sie uns ein paar Event-Botschaften machen!

E-Mail zur Bestellbestätigung senden

Nehmen wir an, eine Kundin namens Lucy hat eine Bestellung auf einer E-Commerce-Website aufgegeben und möchte eine E-Mail zur Bestätigung ihrer Bestellung erhalten.

Lucy möchte eine Bestellbestätigung per E-Mail erhalten

Um dies zu erreichen, müssen wir eine Ereignismeldung von unserem OrderMicroservice an den EmailMicroservice senden.

Ereignis vom OrderMicroservice an den EmailMicroservice senden

 

Der Grund für die Verwendung eines separaten EmailMicroservice liegt darin, dass wir die E-Mail-Verarbeitung zentralisieren möchten und eine Trennung der einzelnen Bereiche wünschen. Der OrderMicroservice ist für die Bearbeitung von Bestellungen zuständig und der EmailMicroservice für die Verarbeitung der E-Mail und das Hinzufügen eines Anhangs.

Erstellen eines Simple Notification Service (SNS) Themas

Um eine SNS-Benachrichtigung zu erstellen, müssen wir zunächst ein Nachrichtenthema erstellen. Damit wird Ihre SNS-Benachrichtigung eindeutig und kann von anderen Diensten abonniert werden. Im folgenden Beispiel veröffentlichen wir das SNS-Thema order_placed_topic vom OrderMicroservice. Das bedeutet, dass die SNS-Ereignismeldung veröffentlicht wird, wenn eine Bestellung aufgegeben wurde.

Veröffentlichung des SNS-Themas

 

Im folgenden Beispiel sehen Sie das Terraform-Skript für die Erstellung eines aws_sns_topic, einschließlich zusätzlicher Einstellungen für die Festlegung der standardmäßigenHealthyRetryPolicy. Diese wird für den Fall benötigt, dass die Zustellung der Nachricht fehlschlägt und setzt die Wiederholungsrichtlinie auf 5 Wiederholungen. Die exponentielle Backoff-Funktion sorgt dafür, dass die Wartezeit bei jedem Wiederholungsversuch exponentiell ansteigt.

Ressource "aws_sns_topic" "order_placed_topic" {
  name = "bestellung_platziert_thema"
  delivery_policy =  <<JSON
{
  "http": {
  "defaultHealthyRetryPolicy": {
  "minDelayTarget" : 20,
  "maxDelayTarget" : 600,
  "numRetries" : 5,
  "backoffFunction" : "exponentiell"
  },
  "disableSubscriptionOverrides": false
  }
}
JSON
}

Kombination von SNS mit einer Warteschlange (SQS)

Neben der Veröffentlichung von Ereignismeldungen mit SNS benötigen wir auch eine Warteschlange für den Ereignisstrom. Diese Warteschlange sorgt dafür, dass Ereignismeldungen in eine Warteschlange gestellt werden und vom empfangenden EmailMicroservice abgerufen werden können. Daher werden wir den Code für die Erstellung des SNS-Dienstes auf den OrderMicroservice legen, während die Skripte für die Erstellung des SQS-Dienstes auf den EmailMicroservice gelegt werden.

Außerdem können wir der SQS-Hauptwarteschlange eine Dead-Letter-Warteschlange hinzufügen. Dies ist praktisch, wenn wir Ereignismeldungen debuggen möchten, falls eine Nachricht nicht verarbeitet werden kann.

Nachdem wir diese letzte Phase abgeschlossen haben, werden wir das folgende Setup erstellen.

Einrichtung für den Versand von Ereignismeldungen über SNS und SQS

 

Um SQS bei unserem SNS-Thema zu abonnieren, müssen wir die folgenden 3 Schritte ausführen.

  1. Abonnieren Sie SQS für die SNS-Ereignisnachricht
  2. Erstellen Sie eine SQS-Warteschlange und eine SQS-Warteschlange für tote Briefe
  3. Erstellen Sie eine SQS-Warteschlangen-Richtlinie

Also, auf geht's!

Abonnieren Sie SQS für die SNS-Ereignisnachricht

Um SQS mit Terraform für die SNS-Ereignisnachricht zu abonnieren, benötigen wir das folgende Skript, das die Terraform-Ressource aws_sns_topic_subscription verwendet.

Ressource "aws_sns_topic_subscription" "order_placed_subscription" {
  topic_arn = "auftrag_platziert_topic"
  Protokoll = "sqs"
  endpoint = "${aws_sqs_queue.order_placed_queue.arn}"
}

Sie können sehen, dass der Endpunkt mit der order_placed_queue verknüpft werden muss, die wir zuvor erstellt haben. ARN steht für Amazon Resource Name.

Erstellen Sie eine SQS-Warteschlange

Als nächstes müssen wir die eigentliche SQS-Warteschlange mit dem folgenden Terraform-Skript erstellen...

Ressource "aws_sqs_queue" "order_placed_queue" {
  name = "ordermicroservice_order_placed_queue"
  redrive_policy = "{"deadLetterTargetArn":"${aws_sqs_queue.order_placed_dlq.arn}", "maxReceiveCount":5}"
  sichtbarkeit_timeout_sekunden = 300
}

...einschließlich der folgenden Warteschlange mit toten Buchstaben.

Ressource "aws_sqs_queue" "order_placed_dlq" {
  name = "bestellung_platziert_dlq"
}

Erstellen Sie eine SQS-Warteschlangen-Richtlinie

In diesem letzten Schritt fügen wir der SQS-Warteschlange Berechtigungen hinzu, um Nachrichten zu dem Thema senden zu können. Das ist wichtig, denn ohne die richtigen Berechtigungen wird es nicht funktionieren!

Fügen Sie zunächst die aws_sqs_queue_policy hinzu, die auf ein aws_iam_policy_document verweist, in dem die Richtlinie deklariert ist.

resource "aws_sqs_queue_policy" "order_placed_queue_policy" {
  queue_url = "${aws_sqs_queue.order_placed_queue.id}"
  policy = "${data.order_placed_queue_iam_policy.json}"
}

In der folgenden Richtlinie wird die Berechtigung hinzugefügt, dass SQS das Senden von Nachrichten über das SNS-Thema erlaubt.

data "aws_iam_policy_document" "order_placed_queue_iam_policy" {
  policy_id = "SQSSendAccess"
  Anweisung {
  sid = "SQSSendAccessStatement"
  Wirkung = "Zulassen"
  actions = ["SQS:SendMessage"]
  resources = ["${aws_sqs_queue.order_placed_queue.arn}"]
  Direktoren {
  identifiers = ["*"]
  Typ = "*"
  }
  Bedingung {
  test = "ArnEquals"
  values = ["${data.aws_sns_topic.order_placed_topic.arn}"]
  variable = "aws:SourceArn"
  }
  }
}

Testen Sie

Nachdem Sie diese Schritte durchgeführt haben, können Sie die folgenden Schritte ausführen, um zu testen, ob die Einrichtung funktioniert.

  • Verwenden Sie die Terraform CLI, um Ihre Skripte zu validieren. Dies geschieht mit dem Befehl terraform validate.
  • Wenn Sie beide Microservices bereitstellen, überprüfen Sie Ihre Protokolle, um zu sehen, ob die Infrastruktur erstellt wird.
  • Melden Sie sich bei Ihrer Amazon SQS-Konsole an, um zu sehen, ob der SQS-Service das SNS-Thema abonniert hat. Wenn dies funktioniert, können Sie Testnachrichten von SNS an https://console.aws.amazon.com/sns/ senden. Wählen Sie das passende Thema und dann die Schaltfläche "Nachricht veröffentlichen".

Hoffentlich funktioniert alles wie erwartet und Kunden wie Lucy erhalten ihre geliebte Bestell-E-Mail ✨.

Fazit

Terraform ist ein großartiges Tool, das Ihren Prozess durch die Erstellung von Infrastruktur als Code rationalisieren kann. Ich hoffe, dass es Ihnen mit diesem Blog leichter fällt, Ihre Infrastruktur für SNS und SQS zu erstellen.

Danke fürs Lesen!

Verfasst von

Bart den Hollander

Contact

Let’s discuss how we can support your journey.