我创建了一个SNS主题,通过cli发布来自Cloudformation的所有信息。然而,当我检查队列时,它没有接收任何SNS消息。我通过订阅我的电子邮件来验证SNS是否正常工作,所以问题似乎出在队列和SNS之间的连接上。然而,我没有发现我的语法有任何问题。一、 据我所知,他们严格遵循了亚马逊的文档。
猛击:
#SNS parameters
SNS_NAME="${NAME}_SNS"
SQS_NAME="${NAME}_SQS"
#Create SNS topic to send cloudformation notifications to
SNS_ARN=`aws sns create-topic --name ${SNS_NAME} | jq -r '.TopicArn'`
#Create SQS to send SNS to (holding SNS messages for lambda -^ up)
SQS_URL=`aws sqs create-queue --queue-name ${SQS_NAME} | jq -r '.QueueUrl'`
SQS_ARN=`aws sqs get-queue-attributes --queue-url ${SQS_URL} --attribute-names QueueArn | jq -r '.Attributes .QueueArn'`
#subscribe the queue to the notifications
aws sns subscribe --topic-arn ${SNS_ARN} --protocol sqs --notification-endpoint ${SQS_ARN}
aws sns subscribe --topic-arn ${SNS_ARN} --protocol email-json --notification-endpoint ${EMAIL}
#Create the stack which kicks everything else off-
aws cloudformation create-stack $REGIONTEXT $ITYPETEXT --capabilities CAPABILITY_IAM --template-url https://${BUCKETNAME}.s3.amazonaws.com/${TEMPLATE} --notification-arns ${SNS_ARN} --stack-name $NAME --parameters ParameterKey=SNSARN,ParameterValue=${SNS_ARN} ParameterKey=Bucket,ParameterValue=${BUCKETNAME} ${PARAMTEXT} ${EXTRAARGS}
谢谢马克B的回答。它为这项工作提供了开始。然而,为了使策略文档通过CLI工作,文档中没有介绍一些怪癖。
aws sqs set-queue-ite
命令中的--属性
标志时存在各种错误。出于某种原因,它要求修改json位于cli引用的. json
文档中。. json
文件中,"Policy"
值(嵌套json)内的所有双引号都必须转义(即{\"语句\":\"HelloWorld\"}
)。如果不遵循这一点,它将验证错误。我最终需要使用ascii转义字符来正确格式化输出(\x5C
)。-属性
标志中的file://local-location
来引用json文件。如果不遵循这一点,它会抛出错误。请参阅以下我用于参考的元素:
load_sqs.sh:
SQS_POLICY=
sqs-policy()
{
#First param is the queue arn, second param is the topic arn
SQS_POLICY=`printf '{ "Policy": "{\x5C\"Version\x5C\":\x5C\"2012-10-17\x5C\",\x5C\"Statement\x5C\":[{\x5C\"Sid\x5C\":\x5C\"CloudformationLambdaSQSPolicy\x5C\",\x5C\"Effect\x5C\":\x5C\"Allow\x5C\",\x5C\"Principal\x5C\":\x5C\"*\x5C\",\x5C\"Action\x5C\":\x5C\"sqs:SendMessage\x5C\",\x5C\"Resource\x5C\":\x5C\"%s\x5C\",\x5C\"Condition\x5C\":{\x5C\"ArnEquals\x5C\":{\x5C\"aws:SourceArn\x5C\":\x5C\"%s\x5C\"}}}]}" }' "$1" "$2"`
`echo $SQS_POLICY > $PWD/sqs-policy.json`
}
#SNS parameters
SNS_NAME="${NAME}_SNS"
SQS_NAME="${NAME}_SQS"
#Create SNS topic to send cloudformation notifications to
SNS_ARN=`aws sns create-topic --name ${SNS_NAME} | jq -r '.TopicArn'`
#Create SQS to send SNS to (holding SNS messages for lambda -^ up)
SQS_URL=`aws sqs create-queue --queue-name ${SQS_NAME} | jq -r '.QueueUrl'`
SQS_ARN=`aws sqs get-queue-attributes --queue-url ${SQS_URL} --attribute-names QueueArn | jq -r '.Attributes .QueueArn'`
#Add necessary SQS <--> SNS permissions
sqs-policy ${SQS_ARN} ${SNS_ARN}
`aws sqs set-queue-attributes --queue-url ${SQS_URL} --attributes file://sqs-policy.json`
#subscribe the queue to the notifications
aws sns subscribe --topic-arn ${SNS_ARN} --protocol sqs --notification-endpoint ${SQS_ARN}
sqs政策。json:
{ "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"CloudformationLambdaSQSPolicy\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"sqs:SendMessage\",\"Resource\":\"ResourceARN\",\"Condition\":{\"ArnEquals\":{\"aws:SourceArn\":\"SourceARN\"}}}]}" }
在我的例子中,SQS wan无法接收来自SNS的消息,因为SQS打开了加密。当我关闭SQS上的加密时,它开始工作了!
此AWS留档说明了如何启用SNS与加密SQS队列的兼容性:
https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#compatibility-使用aws服务
SNS需要额外的权限才能使用KMS密钥加密队列的消息。
看起来您没有授予SNS主题发布到SQS队列的权限。请参阅本演练中的步骤2。您需要向SQS队列中添加这样的策略:
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"MySQSPolicy001",
"Effect":"Allow",
"Principal":"*",
"Action":"sqs:SendMessage",
"Resource":"arn:aws:sqs:us-east-1:123456789012:MyQueue",
"Condition":{
"ArnEquals":{
"aws:SourceArn":"arn:aws:sns:us-east-1:123456789012:MyTopic"
}
}
}
]
}
将ARN替换为主题和队列的ARN。
我的代码中有一个Spring JmsListener。它接收和消费消息2天,但突然在这2天后,它没有收到来自外部Activemq的消息。然而,它的队列中有一些挂起的消息。当我重置Activemq和消费者时,消费者会收到大量消息。当消息挂起时,连接到Activemq的消费者(代表Spring致动器日志)。日志和配置显示Activemq没有将消息推送给消费者。我有另一个像这个消费者一样的服务从其他队列
我试图通过社交网络从亚马逊SES获得电子邮件回复(退回、投诉和交付)。在亚马逊SQS控制台上,我看到消息已经在队列中,所以我确信亚马逊上的结构设置是正确的。 然后,使用Laravel 5.5,按照官方指南,我设置了一个队列来听SQS。我跳过了将作业分配到队列的部分,因为这将由SNS完成。为了简单起见,在作业处理程序中,我只需要转储我收到的内容。作业如下所示: 其配置如下所示: 为安全起见,实际值隐
我正在使用Amazon Textract的StartDocumentAnalysis函数异步扫描文件。S3存储桶中的pdf文件。正如文档所说,我应该会收到一份关于工作状态的通知,发送到提供的SNS主题。 返回用于获取操作结果的作业标识符(JobId)。当文本分析完成后,亚马逊文本将完成状态发布到您在中指定的亚马逊简单通知服务(Amazon SNS)主题。 我用来开始分析的代码如下: 我在AWS控制
null 我遵循Xamarin的文档实现了这个功能。 然后一步一步地执行,直到下面的部分: 后台通知 我点击了Log Token按钮并收到了令牌。 null Firebase控制台显示消息为“完成”。 我错过了什么来解决这个问题?
我在使用时遇到了困难,无法从开头或其他任何显式偏移量读取它。 为同一主题的使用者运行命令行工具,我确实看到带有选项的消息,否则它将挂起 我使用的是kafka-python 0.9.5,而代理运行的是Kafka8.2。不确定确切的问题是什么。 按照dpkp的建议设置_group_id=none_以模拟控制台使用者的行为。
我们面临着ActiveMQ及其消费者的随机问题。我们观察到,很少有消费者不接收消息,即使他们连接到ActiveMQ队列。但在消费者重启后,它工作正常。 我们在ActiveMQ端有一个名为testQueue的队列。消费者正试图将消息从该队列中解列。为此,我们正在使用Spring的DefaultMessageListenerContainer。消息正在从ActiveMQ代理传递到使用者节点。从tcpd