Создание целевой группы ALB в CloudFormation

Я пытаюсь создать балансировщик нагрузки приложений в CloudFormation с целевой группой, которая перенаправляет трафик в экземпляры EC2. Вот соответствующий фрагмент, в котором в качестве параметров передаются ELBSubnets, ECSCluster, taskdefinition и VpcId:

"EcsElasticLoadBalancer" : {
  "Type" : "AWS::ElasticLoadBalancingV2::LoadBalancer",
  "Properties" : {
    "Subnets" : { "Ref" : "ELBSubnets" },
    "SecurityGroups": [
      { "Ref": "ELBAccessSecurityGroup" }
    ]
  }
},
"LoadBalancerListener": {
  "Type": "AWS::ElasticLoadBalancingV2::Listener",
  "Properties": {
    "DefaultActions": [{
      "Type": "forward",
      "TargetGroupArn": { "Ref": "TargetGroup" }
    }],
    "LoadBalancerArn": { "Ref": "EcsElasticLoadBalancer" },
    "Port": 80,
    "Protocol": "HTTP"
  }
},
"TargetGroup": {
  "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
  "Properties": {
    "Name": { "Fn::Join": [ "-", [ { "Ref": "AWS::StackName" }, "TargetGroup" ] ] },
    "Port": 80,
    "Protocol": "HTTP",
    "VpcId": { "Ref": "VpcId" }
  },
  "DependsOn": [ "EcsElasticLoadBalancer" ]
},
"service": {
  "Type": "AWS::ECS::Service",
  "Properties" : {
    "Cluster": { "Ref": "ECSCluster" },
    "DesiredCount": "1",
    "LoadBalancers": [
      {
        "ContainerName": "main-app",
        "ContainerPort": 3000,
        "TargetGroupArn": { "Ref": "TargetGroup" }
      }
    ],
    "Role" : {"Ref":"ECSServiceRole"},
    "TaskDefinition" : {"Ref":"taskdefinition"}
  }
},
"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:Describe*",
                "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
                "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
                "ec2:Describe*",
                "ec2:AuthorizeSecurityGroupIngress"
              ],
              "Resource": "*"
            }
          ]
        }
      }
    ]
  }
}

Я получаю следующую ошибку при создании сервиса:

Целевая группа с targetGroupArn arn: aws: эластичная балансировка нагрузки: us-east-1: xxxxxxxx: targetgroup/AlbServiceStack-TargetGroup/6ba9c037c26cdb36 не имеет связанного балансировщика нагрузки.

Что мне не хватает? В документации, кажется, нет способа указать балансировщик нагрузки для целевой группы.

Ответы

Ответ 1

Получилось - проблема была двоякой:

  1. Следующие строки отсутствовали в Role PolicyDocument:
    • "elasticloadbalancing:DeregisterTargets"
    • "elasticloadbalancing:RegisterTargets"
  2. Служба нуждалась в "DependsOn": [ "LoadBalancerListener" ] в качестве дополнительного атрибута.

Обновленный шаблон выглядит так:

"EcsElasticLoadBalancer" : {
  "Type" : "AWS::ElasticLoadBalancingV2::LoadBalancer",
  "Properties" : {
    "Subnets" : { "Ref" : "ELBSubnets" },
    "SecurityGroups": [
      { "Ref": "ELBAccessSecurityGroup" }
    ]
  }
},
"LoadBalancerListener": {
  "Type": "AWS::ElasticLoadBalancingV2::Listener",
  "Properties": {
    "DefaultActions": [{
      "Type": "forward",
      "TargetGroupArn": { "Ref": "TargetGroup" }
    }],
    "LoadBalancerArn": { "Ref": "EcsElasticLoadBalancer" },
    "Port": 80,
    "Protocol": "HTTP"
  }
},
"TargetGroup": {
  "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
  "Properties": {
    "Name": { "Fn::Join": [ "-", [ { "Ref": "AWS::StackName" }, "TargetGroup" ] ] },
    "Port": 80,
    "Protocol": "HTTP",
    "VpcId": { "Ref": "VpcId" }
  },
  "DependsOn": [ "EcsElasticLoadBalancer" ]
},
"service": {
  "Type": "AWS::ECS::Service",
  "DependsOn": [ "LoadBalancerListener" ],
  "Properties" : {
    "Cluster": { "Ref": "ECSCluster" },
    "DesiredCount": "1",
    "LoadBalancers": [
      {
        "ContainerName": "main-app",
        "ContainerPort": 3000,
        "TargetGroupArn": { "Ref": "TargetGroup" }
      }
    ],
    "Role" : {"Ref":"ECSServiceRole"},
    "TaskDefinition" : {"Ref":"taskdefinition"}
  }
},
"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:Describe*",
                "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
                "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
                "ec2:Describe*",
                "ec2:AuthorizeSecurityGroupIngress",
                "elasticloadbalancing:DeregisterTargets",
                "elasticloadbalancing:RegisterTargets"
              ],
              "Resource": "*"
            }
          ]
        }
      }
    ]
  }
}

Ответ 2

У меня была такая же проблема, но теперь я вижу следующее:

Мой код выглядит следующим образом: AWS :: ECS :: Service ServiceQA Нельзя указать роль IAM для служб, для которых требуется роль, связанная со службой.

{"TaskQA": {
           "Type": "AWS::ECS::TaskDefinition",
            "Properties": {
                "RequiresCompatibilities": ["FARGATE"],
                "Cpu" : "1024",
                "TaskRoleArn" : "arn:aws:iam::683574420318:role/ecsTaskExecutionRole",
                "ExecutionRoleArn" : "arn:aws:iam::683574420318:role/ecsTaskExecutionRole",
                "Memory": "2048",
                "NetworkMode" : "awsvpc",
                 "ContainerDefinitions" : [{ 
                            "Image": "683574420318.dkr.ecr.us-west-1.amazonaws.com/xxx:latest",
                            "Cpu": "1024",
                            "Memory": "2048",  
                            "Name":"ContenedorName",
                            "PortMappings":[{ "ContainerPort": 8080,"HostPort": 8080}]

                }]
            }
        },
        "ServiceQA": {
          "Type": "AWS::ECS::Service",
          "DependsOn": [ "LoadBalancerQA01" ],
          "Properties" : {
            "NetworkConfiguration" : {
                  "AwsvpcConfiguration" : {
                  "AssignPublicIp" : "ENABLED",
                  "SecurityGroups" : [
                    {
                        "Ref": "SecurityGroupPublic01"
                    }
                ],"Subnets": [
                    {
                        "Ref": "SubnetPublicQATestUno"
                    },
                    {
                        "Ref": "SubnetPublicQATestDos"
                    }
                ]}
             },
            "Cluster": { "Ref": "ClusterQA" },
            "DesiredCount": "1",
            "LoadBalancers": [
              {
                "ContainerName": "ContenedorName",
                "ContainerPort": 8080,
                "TargetGroupArn": { "Ref": "TargetGroupQA" }
              }
            ],
            "Role" : {"Ref":"ECSServiceRole"},
            "TaskDefinition" : {"Ref":"TaskQA"}
        }      
    } ,
      "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:Describe*",
                        "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
                        "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
                        "ec2:Describe*",
                        "ec2:AuthorizeSecurityGroupIngress"
                      ],
                      "Resource": "*"
                    }
                  ]
                }
              }]}
            }
}

Ваша помощь, пожалуйста