AWS 服务无法担任角色

Posted

技术标签:

【中文标题】AWS 服务无法担任角色【英文标题】:AWS Service Unable To Assume Role 【发布时间】:2018-09-19 01:09:55 【问题描述】:

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

【问题讨论】:

我想我看到的间歇性问题和你一样,但是使用 ALB 和目标组,所以我的错误略有不同:“Unable to assume role and validate the specified targetGroupArn. Please verify that the ECS service role being passed has the proper permissions. (Service: AmazonECS; Status Code: 400; Error Code: InvalidParameterException; Request ID: ...)”。请问你们提高了哪个ELB服务速率限制? 【参考方案1】:

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

"service" : 
    "Type" : "AWS::ECS::Service",
    "DependsOn" : [
        "TaskDefinition",
        "EcsElasticLoadBalancer",
        "DnsRecord"
    ],
    "Properties" : 
      etc...
    

【讨论】:

【参考方案2】:

更新: 自 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 界面中? @ChrisFoster 看看我的帖子的更新,看起来现在可以这样做了。

以上是关于AWS 服务无法担任角色的主要内容,如果未能解决你的问题,请参考以下文章

AWS GraphQL Appsync - 无法担任角色

Terraform 无法承担启用 MFA 的角色

无法担任角色并验证指定的 targetGroupArn

媒体转换服务上的 AWS IAM 角色策略问题 [无法打开输入文件 [无法读取数据:AssumeRole 失败]]]

使用 Spring Cloud AWS 自动配置担任角色

在 AWS Lambda 中担任角色,在 SSM 调用时拒绝访问