AWS服务无法扮演角色。

4
我有两个AWS CloudFormation堆栈,一个是IAM角色,另一个是使用CloudFormation创建AWS服务并将相应角色导入其中的堆栈。
当部署10个或更多服务时,随机出现以下错误中的1或2个服务-
"AWS::ECS::Service service Unable to assume role and validate the listeners configured on your load balancer. Please verify that the ECS service role being passed has the proper permissions."
如果拆除所有服务并将服务重新部署到ECS集群,则该错误会出现,但是对于不同的服务而言。
AWS的解决方法可以在此处here看到。
如果拆除1或2个损坏的服务并重新部署服务,则服务将无问题地部署。因此,该问题似乎仅在同时部署许多服务时才会发生-这表明它可能是Cloudformation中IAM传播时间问题。
我尝试在服务定义中添加了depends on,
"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" : "*"
                        }
                    ]
                }
            }
        ]
    }
}

但是,内联策略也无法解决问题。

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

回复第一个答案。

谢谢 - 我不知道这个改进。

这是关联 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上的速率限制。


我觉得我也遇到了和你一样的间歇性问题,但是我使用的是带有目标组的ALB,所以我的错误略有不同:“无法假定角色并验证指定的targetGroupArn。请验证传递的ECS服务角色是否具有适当的权限。(服务:AmazonECS;状态码:400;错误代码:InvalidParameterException;请求ID:...)”。能问一下您增加了哪个ELB服务速率限制吗? - Lee Netherton
2个回答

1
因此,在Cloudformation中继续使用两个堆栈方法进行修复,一个包含IAM角色,这些角色进而被导入到服务层堆栈中。解决方法是在服务层脚本的所有其他堆栈资源的服务定义中添加depends on。通过这样做,它允许足够的时间将IAM角色导入并由服务执行,因此这是一个Cloudformation资源创建时间问题。
"service" : {
    "Type" : "AWS::ECS::Service",
    "DependsOn" : [
        "TaskDefinition",
        "EcsElasticLoadBalancer",
        "DnsRecord"
    ],
    "Properties" : {
      etc...
    }
}

0

更新: 截至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 Service-Linked role。如果您的AWS账户足够新,或者您已经通过控制台创建了一个集群,则无需执行任何操作即可使其正常工作。否则,请运行以下命令来创建角色:aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com


这是针对Cloudformation正确的吗,还是只在Web界面上使用? - Chris Foster
1
@ChrisFoster 看看我帖子的更新,现在似乎可以这样做了。 - Laurent Jalbert Simard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接