ECS服务使用ALB的权限问题

Posted

技术标签:

【中文标题】ECS服务使用ALB的权限问题【英文标题】:Permission issue for an ECS Service to use an ALB 【发布时间】:2018-08-09 18:16:24 【问题描述】:

我正在尝试使用 cloudformation 部署带有 ALB 的 ECS 堆栈,但在创建服务时出现错误,这似乎是缺少访问负载均衡器的权限。

这是错误:Unable to assume role and validate the specified targetGroupArn. Please verify that the ECS service role being passed has the proper permissions.

这里是服务定义:

    "EcsService": 
      "Type":"AWS::ECS::Service",
      "DependsOn": [
        "loadBalancer",
        "EcsServiceRole"
      ],
      "Properties":
        "Cluster":
          "Ref": "EcsCluster"
        ,
        "DesiredCount":"1",
        "DeploymentConfiguration":
          "MaximumPercent":100,
          "MinimumHealthyPercent":0
        ,
        "LoadBalancers": [
          
            "ContainerName": "test-web",
            "ContainerPort": "80",
            "TargetGroupArn" : 
              "Ref": "loadBalancer"
            ,
          
        ],
        "Role":
          "Ref": "EcsServiceRole"
        ,
        "TaskDefinition":
          "Ref": "runWebServerTaskDefinition"
        
      
    

这里是负载均衡器的定义:

    "loadBalancer" : 
      "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties": 
        "Name": "testalb",
        "Scheme" : "internal",
        "Subnets" : [
          "subnet-b8217295",
          "subnet-ddaad2b8",
          "subnet-6d71fb51"
        ],
        "LoadBalancerAttributes" : [
           "Key" : "idle_timeout.timeout_seconds", "Value" : "50" 
        ],
        "SecurityGroups": [
           "Ref": "InstanceSecurityGroupOpenWeb" ,
           "Ref" : "InstanceSecurityGroupOpenFull" 
        ],
        "Tags" : [
           "Key" : "key", "Value" : "value" ,
           "Key" : "key2", "Value" : "value2" 
        ]
      
    

这是服务应使用的 IAM 角色:

    "EcsServiceRole": 
      "Type":"AWS::IAM::Role",
      "Properties": 
        "AssumeRolePolicyDocument": 
          "Statement":[
            
              "Effect":"Allow",
              "Principal":
                "Service":[
                  "ecs.amazonaws.com"
                ]
              ,
              "Action":[
                "sts:AssumeRole"
              ]
            
          ]
        ,
        "Path":"/",
        "Policies":[
          
            "PolicyName":"ecs-service",
            "PolicyDocument":
              "Statement":[
                
                  "Effect":"Allow",
                  "Action":[
                    "elasticloadbalancing:*",
                    "ec2:*"
                  ],
                  "Resource":"*"
                
              ]
            
          
        ]
      
    

我没有找到 IAM 中是否有 ALB 的特定命名空间。 你有什么想法吗?

【问题讨论】:

【参考方案1】:

TargetGroupArn 应该指向 TargetGroup ARN,而不是 ALB ARN,目前,它指向 Load Balancer ARN。

          "TargetGroupArn" : 
              "Ref": "loadBalancer"
            ,

【讨论】:

【参考方案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."

旧答案: 由于 AWS 引入了Service-Linked Roles,我不再为我的AWS::ECS::Service 指定角色。它将默认为具有所有必要权限的服务相关角色。

【讨论】:

嗨,我刚刚尝试从 EcsService 定义中删除 "Role": "Ref": "EcsServiceRole" ,我得到了完全相同的错误 对于旧的 AWS 账户,或者如果您从未在控制台中手动创建过 ECS 集群,则必须运行此命令来创建角色:aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com 出现一个错误,说它已经存在运行此命令,我在 UI 中找到了它,看起来问题来自其他地方... 您是否拥有对 AWS 账户的完全管理员访问权限,因为如果没有它,它可能会影响您传递服务所需的角色操作以承担服务相关角色的能力。 有完全相同的问题,但我的堆栈指向正确的 Arn "TargetGroupArn": "Ref": "ServiceTargetGroup" 。该问题是零星的,无法找到解决方案。

以上是关于ECS服务使用ALB的权限问题的主要内容,如果未能解决你的问题,请参考以下文章

每个 ECS 服务的 AWS ALB 与微服务架构的每个 ALB 的多个服务

AWS CDK 并在现有 ALB 上创建 ECS/Fargate 服务。使用现有的监听器?

AWS ECS Fargate ALB 错误(请求超时)

AWS ECS ALB 错误(请求超时)

Netflix Zuul/Ribbon/Eureka 与 AWS ELB/ALB 和 ECS

在 Docker 后面运行的 Nginx 上出现随机 502/503 错误(在 ECS 集群 + ALB 上)