Der Versuch, eine Cloud-Formationsvorlage mit SNS und SQS zu erstellen, funktioniert, aber es kommen nie Nachrichten an
-
26-12-2019 - |
Frage
Nachdem ich die Dokumente durchgesehen hatte, schrieb ich die folgende Cloud-Formationsvorlage, um ein SNS-Thema und ein SQS-Thema zu erstellen und das Thema in der SQS-Warteschlange zu abonnieren:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Creates the SNS topic, SQS queue and instance that will service the custom resources queue",
"Parameters": {
"Environment": {
"Description": "Environment in which to manage queues",
"Type": "String",
"Default": "qa",
"AllowedValues": [ "development", "qa", "staging", "production"]
},
"EmailAddress": {
"Description": "Email to where notifications will be sent",
"Type": "String",
"Default": "example@email.com"
}
},
"Resources": {
"CustomResourcesQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"ReceiveMessageWaitTimeSeconds": 20,
"VisibilityTimeout": 60,
"QueueName": {
"Fn::Join": ["-", ["cloud_formation_custom_resources", {
"Ref": "Environment"
}]]
}
}
},
"CustomResourcesTopic": {
"Type": "AWS::SNS::Topic",
"Properties": {
"Subscription": [
{
"Endpoint": {
"Ref": "EmailAddress"
},
"Protocol": "email"
},
{
"Endpoint": {
"Fn::GetAtt": ["CustomResourcesQueue", "Arn"]
},
"Protocol": "sqs"
}
]
}
},
"SNSToSQSPolicy": {
"Type": "AWS::SQS::QueuePolicy",
"Properties": {
"PolicyDocument": {
"Id": "PushMessageToSQSPolicy",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "allow-sns-to-send-message-to-sqs",
"Effect": "Allow",
"Action": [ "sqs:*" ],
"Principal": {
"AWS": "*"
},
"Resource": {
"Ref": "CustomResourcesTopic"
},
"Condition": {
"StringEquals": {
"aws:SourceArn": {
"Ref": "CustomResourcesTopic"
}
}
}
}
]
},
"Queues": [
{
"Ref": "CustomResourcesQueue"
}
]
}
}
}
}
Die Cloud-Formation wurde erfolgreich erstellt, aber wenn ich eine Nachricht im SNS-Thema veröffentliche, erhalte ich nur die E-Mail, die Nachricht kommt nie in der SQS-Warteschlange an.
Übersehe ich hier etwas in der Richtlinie?Gibt es eine andere Möglichkeit, Wolkenformationen zu nutzen, um SNS und SQS zu verbinden?
Lösung
Ein paar Dinge, die helfen könnten:
- Ich habe
"Resource": "*"
in meiner Warteschlangenrichtlinie. - Ich habe
ArnEquals
anstattStringEquals
auf derCondition
(Aber ich denke, das spielt keine Rolle). - Sie sollten in der Lage sein, einfach damit durchzukommen
"Action": ["sqs:SendMessage"]
.
Andere Tipps
Es ist falsch, denn hier müssen Sie die Warteschlange ARN
verwenden generasacodicetagpre.und dieser Code denke auch, dass es falsch ist
generasacodicetagpre. Da Sie DE THOPIC ARN verwenden sollen, und verwenden Sie den "Ref": "CustomResourcesTopic"
, erhalten Sie de TopicName
Also, es wird
sein generasacodicetagpre.