AWS → STACKIT · MESSAGING-LEITFADEN

Amazon SQS, SNS und MQ zu STACKIT RabbitMQ

Auf STACKIT landen Queues, Topics und Broker bei RabbitMQ: Eine Instanz trägt die Queues von SQS und die Exchanges von SNS, ein Amazon-MQ-Broker für RabbitMQ bekommt eine eigene Instanz. Dieser Leitfaden begleitet eine kleine Messaging-Umgebung durch einen StackToIT-Lauf und zeigt, was der Terraform-Entwurf übernimmt, was Ihr Team neu anlegt und in welcher Reihenfolge Producer und Consumer umziehen.

Zwei Queues, ein Topic und ein Broker: Eingabe und Entwurf

Eine für diese Seite geschriebene Messaging-Umgebung, am 4. November 2026 von StackToIT bewertet: eine Standard-Queue mit Dead-Letter-Queue, eine FIFO-Queue, ein SNS-Topic mit SQS- und E-Mail-Abonnement und ein Amazon-MQ-RabbitMQ-Broker. Links die Eingabe für SQS und SNS, rechts der eine Ressourcenblock, den der Lauf dafür schreibt; die Prüfkommentare über dem Block sind hier ausgelassen.

Beispieleingabemain.tf
resource "aws_sqs_queue" "orders_dlq" {
  name                      = "orders-dlq"
  message_retention_seconds = 1209600
}

resource "aws_sqs_queue" "orders" {
  name                       = "orders"
  visibility_timeout_seconds = 60
  message_retention_seconds  = 345600
  receive_wait_time_seconds  = 10
  redrive_policy = jsonencode({
    deadLetterTargetArn = aws_sqs_queue.orders_dlq.arn
    maxReceiveCount     = 5
  })
}

resource "aws_sqs_queue" "invoices" {
  name                        = "invoices.fifo"
  fifo_queue                  = true
  content_based_deduplication = true
}

resource "aws_sns_topic" "order_events" {
  name = "order-events"
}

resource "aws_sns_topic_subscription" "orders_to_queue" {
  topic_arn = aws_sns_topic.order_events.arn
  protocol  = "sqs"
  endpoint  = aws_sqs_queue.orders.arn
}

resource "aws_sns_topic_subscription" "orders_to_email" {
  topic_arn = aws_sns_topic.order_events.arn
  protocol  = "email"
  endpoint  = "ops@example.com"
}
STACKIT-Terraform von StackToITterraform/messaging.tf
resource "stackit_rabbitmq_instance" "messaging" {
  project_id = var.project_id
  name       = "messaging"
  plan_name  = var.rabbitmq_plan_name
  version    = var.rabbitmq_version
  parameters = {
    sgw_acl = join(",", var.rabbitmq_allowed_cidrs)
  }
}
  • Eine Instanz für viele Queues

    Die vier SQS- und SNS-Einheiten werden durch eine stackit_rabbitmq_instance ersetzt. Queues und Exchanges darin legt Ihr Team an, denn sie entstehen in der Instanz außerhalb von Terraform. Beachten Sie: Der Entwurf schreibt einen Zugang nur für die Instanz des Brokers, nicht für diese gemeinsame Instanz. Ergänzen Sie vor dem Plan ein stackit_rabbitmq_credential für die Clients der Queues.

  • Die Zugriffsliste füllen Sie

    sgw_acl wird aus einer Variablen ohne Standardwert gebildet. Bleibt sie leer, gilt die Standardliste von STACKIT; der Lauf verlangt daher, die Client-Netzwerke vor dem Plan zu nennen.

Die Migration in sechs Schritten

Die Reihenfolge folgt dem Lauf: Seine Wellen setzen die Dead-Letter-Queue vor die Queue, die auf sie verweist, und das Topic zuletzt; sein Dokument zum Datenumzug des Brokers stellt die Struktur an den Anfang, dann die Producer, zuletzt die Consumer, die die alten Queues leeren.

  1. 1. Alle Queues, Topics und Abonnements erfassen

    Erfassen Sie jede Queue mit Typ (Standard oder FIFO), Visibility Timeout, Aufbewahrung, Redrive-Policy sowie ihre Producer und Consumer. Dasselbe gilt für jedes SNS-Topic und die Protokolle seiner Abonnements. Der Lauf listet die gefundenen Einheiten; nicht übernommene Einstellungen sind im Entwurf je Einheit benannt.

  2. 2. Das Brokermodell entscheiden

    Wählen Sie zwischen RabbitMQ für alles und der PubSub-API für queueartige Objekte, die bewusst zugeschaltet werden muss. Der Lauf entwirft RabbitMQ und schreibt die PubSub-Aufrufe als JSON-Dateien, die Sie stattdessen nutzen können, nie zusätzlich.

  3. 3. Instanz anlegen und Zugriffsliste füllen

    Setzen Sie project_id, Plan, Version und Client-Netzwerke und wenden Sie den Entwurf an. Lesen Sie die Zugangsausgaben, die der Entwurf für die Instanz des Brokers schreibt (Host, Port, Management-URL, Passwort), und legen Sie für die gemeinsame Instanz selbst einen Zugang an. Geben Sie beides vor jedem Cutover an die Clients weiter.

  4. 4. Topologie neu anlegen

    Legen Sie Queues, den Dead-Letter-Exchange und den Fanout-Exchange mit seinen Bindings an. Bei einem Amazon-MQ-Broker exportieren Sie die Definitionen, entfernen, was sich nicht übertragen lässt, proben den Import auf einem Scratch-Virtual-Host und importieren dann produktiv.

  5. 5. Producer umstellen, Consumer leerlaufen lassen

    Die Producer wechseln zuerst auf die neue Instanz, damit nichts mehr in die alten Queues geschrieben wird. Die Consumer lesen die alten Queues leer und wechseln danach.

  6. 6. Prüfen, Rückweg offenhalten, stilllegen

    Senden Sie eine Nachricht End-to-End durch, vergleichen Sie die Definitionen beider Seiten, halten Sie fest, wie lange die Quelle bleibt und was mit zwischenzeitlich gesendeten Nachrichten geschieht, und löschen Sie die Quelle erst nach der entschiedenen Aufbewahrung.

Was der Lauf zuordnet

Aus der assessment.json des Laufs: fünf Einheiten aus sieben Ressourcen. Die beiden SNS-Abonnements gehen in ihrem Topic auf.

AWS-EinheitSTACKIT-ZielKlasse und Konfidenz
aws_sqs_queue.ordersRabbitMQ-Queue auf der gemeinsamen InstanzREPLATFORM, LOW
aws_sqs_queue.orders_dlqRabbitMQ-Queue hinter einem Dead-Letter-ExchangeREPLATFORM, MEDIUM
aws_sqs_queue.invoices (FIFO)RabbitMQ-Queue als Ziel, doch der Plan lehnt es ab, strikte Reihenfolge und Exactly-once-Verarbeitung zu übernehmen: Beides wird zuerst neu entworfenREPLATFORM, MEDIUM
aws_sns_topic.order_eventsRabbitMQ-Fanout-ExchangeREPLATFORM, LOW
aws_mq_broker.legacy (RabbitMQ 3.13)Eigene stackit_rabbitmq_instance mit ZugangRECONFIGURE, MEDIUM

RECONFIGURE heißt: Das Produkt bleibt gleich, Release und Einstellungen ändern sich. REPLATFORM heißt: Das Programmiermodell ändert sich; die Clients verlassen die SQS- oder SNS-API und sprechen AMQP. Die Queue und das Topic tragen die Konfidenz LOW; sie unterscheidet der Befund, dass beide auf eine andere Einheit verweisen, die der Entwurf nicht als eigene Ressource anlegt.

Was der Entwurf Ihrem Team überlässt

Links zwei Kommentarzeilen aus der messaging.tf des Laufs, unverändert; die Kommentarzeilen dazwischen sind ausgelassen. Rechts eine der PubSub-Nutzlasten, die der Lauf als Alternative schreibt. Die Nutzlasten greifen erst, wenn Sie der Opt-in-Entscheidung für eine API zustimmen, die sich noch ändern kann, und ersetzen die RabbitMQ-Instanz, statt sie zu ergänzen. Die ackDeadline von 60s des Abonnements übernimmt das 60-Sekunden-Visibility-Timeout der Queue; die Topic-Nutzlast übernimmt die Aufbewahrung als 345600s.

Kommentare im Entwurfterraform/messaging.tf
# NOT CARRIED (aws_sqs_queue.orders): visibility_timeout_seconds = 60, receive_wait_time_seconds = 10 — SQS hides a received message from the other consumers for the visibility timeout and long-polls for receive_wait_time_seconds … the acknowledgement handling of the consumers is checked. (shortened: the whole reason is in the trace of this block)
# CONSUMER CHANGE (aws_sns_topic_subscription.orders_to_queue): the subscriber aws_sqs_queue.orders is a queue that a person binds to the exchange of aws_sns_topic.order_events; the subscription itself has no resource and its settings are not generated.
PubSub-API-Nutzlastterraform/pubsub-api/orders/create-subscription.json
{
  "displayName": "orders",
  "settings": {
    "ackDeadline": "60s"
  }
}
  • Dead-Letter-Behandlung

    AWS verschiebt eine Nachricht nach maxReceiveCount Empfängen in die Dead-Letter-Queue, festgelegt in der Redrive-Policy, und empfiehlt für die Dead-Letter-Queue eine längere Aufbewahrung als für die Quell-Queue, wie in dieser Umgebung (14 gegenüber 4 Tagen). In RabbitMQ deklariert Ihr Team nach gängiger Praxis je Queue einen Dead-Letter-Exchange und bei Quorum-Queues ein Zustelllimit.

  • Visibility Timeout

    RabbitMQ kennt kein Visibility Timeout (allgemeines RabbitMQ-Verhalten). Eine Nachricht bleibt unbestätigt, bis der Consumer sie quittiert oder sein Kanal schließt; Consumer-Code, der sich auf das Timeout verlassen hat, wird geprüft. Deshalb nennt der Lauf visibility_timeout_seconds und receive_wait_time_seconds als nicht übernommen.

  • FIFO und Deduplizierung

    Der Plan führt die FIFO-Queue unter dem, was sich nicht migrieren lässt: Eine Standard-Queue würde Nachrichten stillschweigend umsortieren und doppelt zustellen. Reihenfolge und Deduplizierung werden daher neu entworfen, bevor ein Ziel entsteht, etwa mit einem geordneten Consumer und idempotenter Verarbeitung über eine Sequenznummer.

Der Amazon-MQ-Broker: eine eigene Instanz

Der Lauf sieht für den Broker eine eigene Instanz mit eigenem Zugang vor; die Prüfkommentare über beiden Blöcken sind hier ausgelassen. Nachrichten gehören nicht zu den Definitionen, und die Benutzer des Brokers werden nicht übernommen: Die Clients erhalten den Benutzer, den STACKIT für den Zugang erzeugt.

Entwurfterraform/messaging.tf
resource "stackit_rabbitmq_instance" "legacy" {
  project_id = var.project_id
  name       = "legacy-rabbit"
  plan_name  = var.legacy_plan_name
  version    = var.legacy_version
  parameters = {
    sgw_acl = join(",", var.legacy_allowed_cidrs)
  }
}

resource "stackit_rabbitmq_credential" "legacy" {
  project_id  = var.project_id
  instance_id = stackit_rabbitmq_instance.legacy.instance_id
}
  • Versionssprung

    Die Quelle läuft mit RabbitMQ 3.13. Der Lauf weist darauf hin, dass die klassische Queue-Spiegelung in der Versionslinie 4.x entfernt wurde: Eine gespiegelte klassische Queue wird zur Quorum-Queue, und die Spiegelungsschlüssel werden vor dem Import aus den Policies entfernt.

  • Version bestätigen

    Der vom Lauf gelesene Katalog führt für die Region 4.1. Die Lifecycle-Seite von STACKIT nennt Stand November 2026 die aktuelle Hauptversion 4.0 ohne End-of-Life-Datum und für 3.13, die Version der Quelle, September 2025 als End of Life. Bestätigen Sie vor dem Cutover, welche Version die Instanz annimmt.

  • Einzelinstanz vermerkt

    Der Quell-Broker ist eine SINGLE_INSTANCE. Die Plangröße ist eine Variable mit einem vorgeschlagenen Standardwert, den Sie bestätigen; der Entwurf behauptet keine gleiche Ausfallsicherheit.

Die Definitionen des Brokers in vier Schritten

Aus dem Dokument zum Datenumzug, das der Lauf für den Broker schreibt. Jeder Befehl ist eine Vorlage aus diesem Dokument; die Passwörter kommen aus Umgebungsvariablen. Verantwortlich für jeden Schritt: der Data Architect.

SchrittWas der Lauf festlegtErledigt, wenn
Preflight (nur lesend)Topologie exportieren: curl -u "<source-user>:$SOURCE_PASSWORD" "<source-broker-endpoint>/api/definitions" > definitions-source.json. Die Datei enthält Passwort-Hashes und wird als vertraulich behandelt.Definitionen, Queue-Tiefen, Benutzer und Clients sind erfasst, beide Management-APIs antworten.
GeneralprobeAus einer Kopie Benutzer, Berechtigungen und die ha-mode-Policies entfernen, einen Scratch-Virtual-Host anlegen (curl ... /api/vhosts/rehearsal -X PUT) und die Kopie dort importieren (curl ... /api/definitions/rehearsal -X POST).Der Import wird angenommen, abgelehnte Elemente sind geklärt, und die Tests der Anwendung bestehen gegen den Scratch-Host.
ErstkopieDie bereinigte Datei importieren, bevor ein Producer umzieht: curl ... /api/definitions -X POST -d @definitions-target.json. Das legt Struktur an und überträgt keine Nachricht.Virtual Hosts, Queues, Exchanges, Bindings und Policies existieren auf der Instanz.
AbgleichBeide Seiten erneut exportieren, Queues, Exchanges und Bindings vergleichen und mit der Prüfung aus dem Dokument zählen (curl ... /api/queues | jq length auf beiden Seiten). GO oder NO-GO festhalten.Die Definitionen stimmen bis auf dokumentierte Änderungen überein, und jeder Client hat Endpunkt und Zugang der neuen Instanz.

Entscheidungen Ihrer Architekten

Das Entscheidungsregister des Laufs führt für diese Umgebung zwölf offene Einträge. Diese ändern das Design.

  • RabbitMQ oder PubSub-API

    Die Zustimmung zum Zuschalten von APIs, die sich noch ändern können, stellt queueartige Objekte auf PubSub um. Es ist die einzige Entscheidung hier, an der Planschritte hängen.

  • Öffentlicher Endpunkt und Zugriffsliste

    Der RabbitMQ-Endpunkt ist öffentlich und über sgw_acl begrenzt. Der Lauf belässt das als Standardwert und bittet um Bestätigung oder ein anderes Design, falls Clients ihn nicht von außen erreichen dürfen.

  • Plangröße

    Die Größe wird aus der Instanzklasse der Quelle vorgeschlagen. Bestätigen Sie sie oder wählen Sie einen Plan.

  • E-Mail- und SMS-Abonnements

    Das SNS-Topic hat ein E-Mail-Abonnement. AWS nennt HTTP und HTTPS, E-Mail, Firehose, SQS, Lambda, Plattformanwendung und SMS als Endpunkte; an E-Mail, SMS, Mobile-Push oder HTTP-Endpunkte liefert RabbitMQ nicht selbst aus. Ein kleiner eigener Dienst liest eine an den Exchange gebundene Queue und stellt zu.

  • Nachrichten im Flug

    Nachrichten werden vom Entwurf nicht migriert. Entscheiden Sie, ob die Queues vor dem Umschalten der Producer leerlaufen oder ob ein Replay-Verfahren geprobt wird.

Fragen von Messaging-Teams

Können unsere Anwendungen den SQS-Client behalten?

Nein. SQS und SNS sind AWS-APIs. Bei RabbitMQ sprechen die Clients AMQP, Producer und Consumer wechseln also Bibliothek, Endpunkt und Zugangsdaten. Deshalb stuft der Lauf die Queues als REPLATFORM ein.

Verschiebt StackToIT die Nachrichten?

Nein. StackToIT ändert nichts in einer Cloud und überträgt keine Daten. Es schreibt die Instanz, die Ausgaben des Zugangs und ein Dokument zum Datenumzug mit Befehlen, die Ihr Team ausführt.

Was passiert mit der Redrive-Policy?

Sie ist im Entwurf als nicht übernommen benannt. Ihr Team deklariert an der Queue einen Dead-Letter-Exchange und ein Limit. Laut AWS-Dokumentation hält die Redrive-Policy den Wert maxReceiveCount; diese Zahl wird übernommen.

Brauchen wir eine Instanz je Queue?

Nein. Der Lauf legt Queues und Topic auf eine gemeinsame Instanz und gibt dem Amazon-MQ-Broker eine eigene, weil ein Broker bereits eine Topologie trägt, die als Ganzes importiert wird.

Ist das ein Lift and Shift?

Nein. Der Broker behält sein Produkt und wechselt das Release. Queues und Topics wechseln das Programmiermodell; deshalb enthält der Plan Schritte für Producer und Consumer.

Quellen

Ihr nächster Schritt: STACKIT.

Erzählen Sie uns von Ihrer Umgebung. Wir zeigen Ihnen, was StackToIT dafür liefert: Zielarchitektur, Terraform-Artefakte und einen strukturierten Migrationsplan.