AWS 服务无法承担角色

2024-01-06

我有两个 AWS Cloudformation 堆栈,一个用于 IAM 角色,第二个用于创建 AWS 服务并使用 Cloudformation 将相应的角色导入其中。

当部署 10 个以上服务时,其中 1 个或 2 个服务会随机出现以下错误 -

AWS::ECS::Service 服务无法承担角色并验证 在负载均衡器上配置的侦听器。请确认ECS 传递的服务角色具有适当的权限。

如果拆除所有服务并将服务重新部署到 ECS 集群,则会出现该错误,但针对的是不同的服务。

可以看到AWS对此的修复here https://aws.amazon.com/premiumsupport/knowledge-center/assume-role-validate-listeners/

如果 1 或 2 个损坏的服务被拆除并重新部署,则服务部署不会出现问题。因此,该问题似乎仅在同时部署许多服务时才会出现 - 这表明这可能是 Cloudformation 中的 IAM 传播计时问题。

我尝试在服务定义中添加依赖 -

"service" : {
"Type" : "AWS::ECS::Service",
"DependsOn" : [
    "taskdefinition",
    "ECSServiceRole"
],
"Properties" : {
    "Cluster" : { "Ref": "ECSCluster"},
    "Role" : {"Ref" : "ECSServiceRole"},
     etc...
 }
}

但这行不通。

您可能会注意到,我还删除了 ECSServiceRole 的 IAM 导入值,并将其替换为此处所示的内联资源策略 -

"ECSServiceRole" : {
    "Type" : "AWS::IAM::Role",
    "Properties" : {
        "AssumeRolePolicyDocument" : {
            "Statement" : [
                {
                    "Sid": "",
                    "Effect" : "Allow",
                    "Principal" : {
                        "Service" : [
                            "ecs.amazonaws.com"
                        ]
                    },
                    "Action" : [
                        "sts:AssumeRole"
                    ]
                }
            ]
        },
        "Path" : "/",
        "Policies" : [
            {
                "PolicyName" : "ecs-service",
                "PolicyDocument" : {
                    "Statement" : [
                        {
                            "Effect" : "Allow",
                            "Action" : [
                                "ec2:Describe*",
                                "ec2:AuthorizeSecurityGroupIngress",
                                "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
                                "elasticloadbalancing:DeregisterTargets",
                                "elasticloadbalancing:Describe*",
                                "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
                                "elasticloadbalancing:RegisterTargets",
                                "sns:*"
                            ],
                            "Resource" : "*"
                        }
                    ]
                }
            }
        ]
    }
}

但同样,内联策略也不能解决问题。

任何想法或指示将不胜感激!

回复答案1。

谢谢 - 我没有意识到这种改进。

这是为 ECS 关联服务相关角色的正确方法吗?

"ECSServiceRole": {
    "Type": "AWS::IAM::Role",
    "Properties": {
        "AssumeRolePolicyDocument": {
            "Statement": [
                {
                    "Sid": "",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": [
                            "ecs.amazonaws.com"
                        ]
                    },
                    "Action": [
                        "sts:AssumeRole"
                    ]
                }
            ]
        },
        "Path": "/",
        "Policies": [
            {
                "PolicyName": "CreateServiceLinkedRoleForECS",
                "PolicyDocument": {
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Action": [
                                "iam:CreateServiceLinkedRole",
                                "iam:PutRolePolicy",
                                "iam:UpdateRoleDescription",
                                "iam:DeleteServiceLinkedRole",
                                "iam:GetServiceLinkedRoleDeletionStatus"
                            ],
                            "Resource": "arn:aws:iam::*:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS*",
                            "Condition": {
                                "StringLike": {
                                    "iam:AWSServiceName": "ecs.amazonaws.com"
                                }
                            }
                        }
                    ]
                }
            }
        ]
    }
}

最终答案

在就此事与 AWS 断断续续地发生了几个月的问题之后,AWS 回来说他们在后台的 ELB 上对我们进行了限制。这就是为什么在通过 Cloudformation 同时部署 3 个以上 docker 服务时会出现随机且多样的问题。该解决方案与 IAM 权限无关,而是通过“AWS 服务团队”提高 ELB 的速率限制。


因此,解决方案是继续在 Cloudformation 中使用两个堆栈方法,其中一个具有 IAM 角色,这些角色又被导入到服务层堆栈中。修复方法是在服务定义中为服务层脚本中的所有其他堆栈资源添加依赖项。通过这样做,可以让服务有足够的时间导入和执行 IAM 角色,因此这是一个 Cloudformation 资源创建计时问题。

"service" : {
    "Type" : "AWS::ECS::Service",
    "DependsOn" : [
        "TaskDefinition",
        "EcsElasticLoadBalancer",
        "DnsRecord"
    ],
    "Properties" : {
      etc...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS 服务无法承担角色 的相关文章

随机推荐