AWS SQS访问策略致关联IAM角色的实例无法访问队列咨询
问题分析:SQS访问策略导致关联IAM角色的实例无法访问队列
问题现象
部署SQS后配置了访问策略,允许指定外部账号的SNS推送消息;同时有一台关联了IAM角色的EC2实例,原本可正常与该队列交互。但添加该SQS访问策略后,实例无法访问队列,移除策略后则恢复正常。尝试移除策略中的Principal字段后,IAM策略模拟器验证通过,但SNS无法再向队列推送消息。
当前使用的SQS策略如下:
{ "Version": "2012-10-17", "Id": "sqspolicy", "Statement": [ { "Sid": "First", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "${module.elmo-s-rem-sqs-user-sync-service.primary_queue_arn}", "Condition": { "ArnEquals": { "aws:SourceArn": "${local.pivot_topic_arn}" } } } ] }
原因解析
AWS资源策略(如SQS访问策略)的核心逻辑是:当资源存在明确的访问策略时,默认拒绝所有未被策略明确允许的请求。
在未添加SQS访问策略时,实例的访问权限由关联的IAM角色控制——只要IAM角色拥有访问该SQS的权限,请求就能通过。但添加仅允许SNS服务推送的策略后,该策略成为队列的唯一访问控制规则,其中没有包含允许实例关联的IAM角色(或实例所在账号主体)访问队列的条目,因此即使IAM角色有相关权限,也会被SQS的资源策略拒绝。
而移除Principal字段后,策略的权限范围失效(缺少明确的授权主体),SNS自然无法再推送消息,但此时资源策略相当于没有有效规则,IAM角色的权限又重新生效,所以模拟器验证通过。
解决方案
需要在SQS访问策略中添加一条允许实例关联的IAM角色(或实例所属账号)访问队列的语句,同时保留原有的SNS授权规则。示例修改后的策略如下:
{ "Version": "2012-10-17", "Id": "sqspolicy", "Statement": [ { "Sid": "AllowSNSSendMessage", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "${module.elmo-s-rem-sqs-user-sync-service.primary_queue_arn}", "Condition": { "ArnEquals": { "aws:SourceArn": "${local.pivot_topic_arn}" } } }, { "Sid": "AllowEC2RoleAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的账号ID:role/实例关联的IAM角色名称" }, "Action": [ "sqs:ReceiveMessage", "sqs:DeleteMessage", "sqs:GetQueueAttributes" ], "Resource": "${module.elmo-s-rem-sqs-user-sync-service.primary_queue_arn}" } ] }
- 替换
你的账号ID和实例关联的IAM角色名称为实际信息 - 根据实例的业务需求调整
Action列表,添加所需的SQS操作
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

