You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:55:17