我有两个 AWS Cloudformation堆栈,一个用于 IAM 角色,另一个用于创建 AWS 服务并使用 Cloudformation 将各自的角色导入其中。
部署 10+ 个服务时,1 或 2 个服务上随机出现以下错误 -
AWS::ECS::服务服务 无法代入角色并验证 负载均衡器上配置的侦听器。请验证弹性云服务器是否 传递的服务角色具有适当的权限。
如果所有服务都被拆除,并且服务被重新绑定到 ECS 集群,则会出现错误,但针对不同的服务。
可以在此处查看对此的 AWS 修复程序
如果拆除并重新部署了 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...
}
}
更新:自 2018 年 7 月 19 日起,现在可以使用 CloudFormation https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-servicelinkedrole.html 创建 IAM 服务相关角色。
EcsServiceLinkedRole:
Type: "AWS::IAM::ServiceLinkedRole"
Properties:
AWSServiceName: "ecs.amazonaws.com"
Description: "Role to enable Amazon ECS to manage your cluster."
旧答案:不再需要创建自己的ECSServiceRole
。如果不为您的服务指定角色,AWS 将默认使用 ECS 服务相关角色。如果您的 AWS 账户足够新,或者您已经通过控制台创建了集群,则无需执行任何操作即可使其正常工作。如果没有,请运行以下命令以创建角色:aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com
。