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
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.

Um dies zu erreichen, müssen wir eine Ereignismeldung von unserem 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.

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.

Um SQS bei unserem SNS-Thema zu abonnieren, müssen wir die folgenden 3 Schritte ausführen.
- Abonnieren Sie SQS für die SNS-Ereignisnachricht
- Erstellen Sie eine SQS-Warteschlange und eine SQS-Warteschlange für tote Briefe
- 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
Unsere Ideen
Weitere Blogs
Contact



