我有两个 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 的速率限制。