AWS服务无法承担角色

时间:2018-04-09 15:12:44

标签: amazon-web-services amazon-cloudformation amazon-iam

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

部署10多项服务时,1或2项服务会随机出现以下错误 -

  

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

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

可以看到针对此的AWS修复here

如果拆除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的速率限制。

2 个答案:

答案 0 :(得分:1)

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

from t
group by name
having sum( age = 21 ) > 0 and
       sum( age = 26) = 0;

答案 1 :(得分: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."

OLD ANSWER: 不再需要创建自己的ECSServiceRole。通过不为您的服务指定角色,AWS将默认使用ECS Service-Linked role。如果您的AWS账户足够新,或者您已经通过控制台创建了集群,则无需执行任何操作即可。如果没有,请运行以下命令来创建角色:aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com