LocalStack中SQS队列添加SNS访问策略失败及账号ID疑问
问题描述
我需要允许SNS主题向SQS队列发送消息,按照AWS官方文档编写了如下JSON格式的访问策略文件:
{ "Statement": [ { "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sns:eu-central-1:000000000000:ses_events_topic" } ] }
在LocalStack环境中执行以下AWS CLI命令添加该策略:
aws --endpoint-url=http://localhost:4566 sqs set-queue-attributes --queue-url http://localhost:4566/000000000000/ses_events_queue --attributes file://set_queue_attributes.json --profile test-profile --region eu-central-1 --output table | cat
得到错误:
An error occurred (InvalidAttributeName) when calling the SetQueueAttributes operation: Unknown Attribute Statement.
尝试不同键值均提示未知属性,怀疑该策略仅适用于AWS控制台,打算改用add-permission命令:
aws sqs add-permission --queue-url https://sqs.us-east-1.amazonaws.com/80398EXAMPLE/MyQueue --label SendMessagesFromMyQueue --aws-account-ids 12345EXAMPLE --actions SendMessage
但不清楚LocalStack环境下--aws-account-ids参数应填写什么值。
解决方案
1. 修正set-queue-attributes的策略文件
你遇到的错误是因为策略文件格式不正确:使用set-queue-attributes时,策略内容必须放在Policy这个属性键下,而非直接用Statement。同时要注意Resource必须是SQS队列的ARN,而非SNS主题的ARN,这是你之前的另一个错误。
修正后的set_queue_attributes.json内容如下:
{ "Policy": "{\"Statement\": [{\"Effect\": \"Allow\", \"Principal\": {\"Service\": \"sns.amazonaws.com\"}, \"Action\": \"sqs:SendMessage\", \"Resource\": \"arn:aws:sqs:eu-central-1:000000000000:ses_events_queue\"}]}" }
注意:Policy的值是经过字符串转义的JSON,确保CLI能正确解析。
重新执行原set-queue-attributes命令即可成功设置权限。
2. 关于add-permission命令的账号ID
如果坚持使用add-permission命令,LocalStack环境下默认的AWS账号ID是000000000000。但需要注意:add-permission命令无法直接指定服务主体(如sns.amazonaws.com),只能指定AWS账号ID,因此这种方式无法满足允许SNS服务向队列发消息的需求,更推荐使用第一种修正后的set-queue-attributes方法。
内容的提问来源于stack exchange,提问作者AlbertMunichMar
相关产品推荐
相关产品推荐

