Целевая группа с targetGroupArn не имеет связанной ошибки балансировки нагрузки - PullRequest
0 голосов
/ 06 февраля 2020

Я запускаю два сценария, один из которых создает кластер с необходимыми ресурсами, а затем другой сценарий для создания задач и службы. Первый сценарий создает все правильно, но когда я запускаю второй сценарий для создания службы и задачи, он выдает следующую ошибку:

Целевая группа с targetGroupArn arn: aws :asticloadbalancing: ca-central- 1: XXXXXXXXX: targetgroup / XXXXXXXXXXXXXXXXXXXXX не имеет соответствующего балансировщика нагрузки. (Сервис: AmazonECS; Код состояния: 400; Код ошибки: InvalidParameterException; Идентификатор запроса: 3899fd23-3eee-473f-9914-453a8d669f14)

Что я делаю не так?

Скрипт 1 для создания кластера:

AWSTemplateFormatVersion: '2010-09-09'

Описание: стек для развертывания контейнерных приложений в кластере EC2

         hosts using Elastic Container Service. This stack runs containers on

         hosts that are in a public VPC subnet, and includes a public facing load

         balancer to register the services in.

Параметры:

Желаемая емкость:

Type: Number

Default: '3'

Description: Number of EC2 instances to launch in your ECS cluster.

Максимальный размер:

Type: Number

Default: '6'

Description: Maximum number of EC2 instances that can be launched in your ECS cluster.

ECSAMI:

Description: AMI ID

Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>

Default: /aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id

InstanceType:

Description: EC2 instance type

Type: String

Default: t2.micro

AllowedValues: [t2.micro, t2.small, t2.medium, t2.large, m3.medium, m3.large,

  m3.xlarge, m3.2xlarge, m4.large, m4.xlarge, m4.2xlarge, m4.4xlarge, m4.10xlarge,

  c4.large, c4.xlarge, c4.2xlarge, c4.4xlarge, c4.8xlarge, c3.large, c3.xlarge,

  c3.2xlarge, c3.4xlarge, c3.8xlarge, r3.large, r3.xlarge, r3.2xlarge, r3.4xlarge,

  r3.8xlarge, i2.xlarge, i2.2xlarge, i2.4xlarge, i2.8xlarge]

ConstraintDescription: Please choose a valid instance type.

Отображения:

# Твердые значения для масок su bnet. Эти маски определяют

# диапазон внутренних IP-адресов, которые могут быть назначены.

# VP C может иметь все IP-адреса от 10.0.0.0 до 10.0.255.255

# Существуют две подсети, охватывающие диапазоны:

#

# 10.0.0.0 - 10.0.0.255

# 10.0.1.0 - 10.0.1.255

#

# Если вам нужно больше IP-адресов (возможно, у вас так много

# экземпляров, которые у вас закончились), вы можете настроить эти диапазоны

# для добавления больше

SubnetConfig:

VPC:

  CIDR: '10.0.0.0/16'

PublicOne:

  CIDR: '10.0.0.0/24'

PublicTwo:

  CIDR: '10.0.1.0/24'

Ресурсы:

# VP C, в которых контейнеры будут объединены в сеть.

# Имеет два опубликованных c подсети

# Мы распределяем подсети по первым двум доступным подсетям

# для региона для обеспечения высокой доступности.

VP C:

Type: AWS::EC2::VPC

Properties:

  EnableDnsSupport: true

  EnableDnsHostnames: true

  CidrBlock: !FindInMap ['SubnetConfig', 'VPC', 'CIDR']

# Две публичные c подсети, в которых контейнеры могут иметь публичные c IP-адреса

PublicSubnetOne:

Type: AWS::EC2::Subnet

Properties:

  AvailabilityZone:

     Fn::Select:

     - 0

     - Fn::GetAZs: {Ref: 'AWS::Region'}

  VpcId: !Ref 'VPC'

  CidrBlock: !FindInMap ['SubnetConfig', 'PublicOne', 'CIDR']

  MapPublicIpOnLaunch: true

PublicSubnetTwo:

Type: AWS::EC2::Subnet

Properties:

  AvailabilityZone:

     Fn::Select:

     - 1

     - Fn::GetAZs: {Ref: 'AWS::Region'}

  VpcId: !Ref 'VPC'

  CidrBlock: !FindInMap ['SubnetConfig', 'PublicTwo', 'CIDR']

  MapPublicIpOnLaunch: true

# S Сетевые ресурсы etup для подсетей publi c. Контейнеры

# в подсетях publi c имеют IP-адреса publi c, а таблица маршрутизации

# отправляет сетевой трафик c через шлюз inte rnet.

InternetGateway:

Type: AWS::EC2::InternetGateway

GatewayAttachement:

Type: AWS::EC2::VPCGatewayAttachment

Properties:

  VpcId: !Ref 'VPC'

  InternetGatewayId: !Ref 'InternetGateway'

PublicRouteTable:

Type: AWS::EC2::RouteTable

Properties:

  VpcId: !Ref 'VPC'

PublicRoute:

Type: AWS::EC2::Route

DependsOn: GatewayAttachement

Properties:

  RouteTableId: !Ref 'PublicRouteTable'

  DestinationCidrBlock: '0.0.0.0/0'

  GatewayId: !Ref 'InternetGateway'

PublicSubnetOneRouteTableAssociation:

Type: AWS::EC2::SubnetRouteTableAssociation

Properties:

  SubnetId: !Ref PublicSubnetOne

  RouteTableId: !Ref PublicRouteTable

PublicSubnetTwoRouteTableAssociation:

Type: AWS::EC2::SubnetRouteTableAssociation

Properties:

  SubnetId: !Ref PublicSubnetTwo

  RouteTableId: !Ref PublicRouteTable

# Ресурсы ECS

ECSCluster:

Type: AWS::ECS::Cluster

# Группа безопасности для хостов EC2, которая будет работать контейнеры.

# Два правила, разрешающие сетевой трафик c от публикуемой c балансировочной нагрузки

# и других узлов в группе безопасности.

#

# Удалите любое из следующих правил входа, которые не нужны.

# Если вы хотите делать прямые запросы к контейнеру, используя его

# publi c IP-адрес, вам нужно добавить правило группы безопасности

#, чтобы разрешить трафик c со всех IP-адресов.

EcsHostSecurityGroup:

Type: AWS::EC2::SecurityGroup

Properties:

  GroupDescription: Access to the ECS hosts that run containers

  VpcId: !Ref 'VPC'

EcsSecurityGroupIngressFromPublicALB:

Type: AWS::EC2::SecurityGroupIngress

Properties:

  Description: Ingress from the public ALB

  GroupId: !Ref 'EcsHostSecurityGroup'

  IpProtocol: -1

  SourceSecurityGroupId: !Ref 'PublicLoadBalancerSG'

EcsSecurityGroupIngressFromSelf:

Type: AWS::EC2::SecurityGroupIngress

Properties:

  Description: Ingress from other hosts in the same security group

  GroupId: !Ref 'EcsHostSecurityGroup'

  IpProtocol: -1

  SourceSecurityGroupId: !Ref 'EcsHostSecurityGroup'

# autoscaling group. Это запускает фактические экземпляры EC2, которые регистрируют себя

# как члены кластера, и запускают контейнеры docker.

ECSAutoScalingGroup:

Type: AWS::AutoScaling::AutoScalingGroup

Properties:

  VPCZoneIdentifier:

    - !Ref PublicSubnetOne

    - !Ref PublicSubnetTwo

  LaunchConfigurationName: !Ref 'ContainerInstances'

  MinSize: '1'

  MaxSize: !Ref 'MaxSize'

  DesiredCapacity: !Ref 'DesiredCapacity'

CreationPolicy:

  ResourceSignal:

    Timeout: PT15M

UpdatePolicy:

  AutoScalingReplacingUpdate:

    WillReplace: 'true'

ContainerInstances:

Type: AWS::AutoScaling::LaunchConfiguration

Properties:

  ImageId: !Ref 'ECSAMI'

  SecurityGroups: [!Ref 'EcsHostSecurityGroup']

  InstanceType: !Ref 'InstanceType'

  IamInstanceProfile: !Ref 'EC2InstanceProfile'

  UserData:

    Fn::Base64: !Sub |

      #!/bin/bash -xe

      echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config

      yum install -y aws-cfn-bootstrap

      /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource ECSAutoScalingGroup --region ${AWS::Region}

AutoscalingRole:

Type: AWS::IAM::Role

Properties:

  AssumeRolePolicyDocument:

    Statement:

    - Effect: Allow

      Principal:

        Service: [application-autoscaling.amazonaws.com]

      Action: ['sts:AssumeRole']

  Path: /

  Policies:

  - PolicyName: service-autoscaling

    PolicyDocument:

      Statement:

      - Effect: Allow

        Action:

          - 'application-autoscaling:*'

          - 'cloudwatch:DescribeAlarms'

          - 'cloudwatch:PutMetricAlarm'

          - 'ecs:DescribeServices'

          - 'ecs:UpdateService'

        Resource: '*'

EC2InstanceProfile:

Type: AWS::IAM::InstanceProfile

Properties:

  Path: /

  Roles: [!Ref 'EC2Role']

# Роль для хостов EC2. Это позволяет агенту ECS на хостах EC2

# связываться с плоскостью управления ECS, а также загружать образы docker

# из ECR для запуска на вашем хосте.

EC2Role:

Type: AWS::IAM::Role

Properties:

  AssumeRolePolicyDocument:

    Statement:

    - Effect: Allow

      Principal:

        Service: [ec2.amazonaws.com]

      Action: ['sts:AssumeRole']

  Path: /

  Policies:

  - PolicyName: ecs-service

    PolicyDocument:

      Statement:

      - Effect: Allow

        Action:

          - 'ecs:CreateCluster'

          - 'ecs:DeregisterContainerInstance'

          - 'ecs:DiscoverPollEndpoint'

          - 'ecs:Poll'

          - 'ecs:RegisterContainerInstance'

          - 'ecs:StartTelemetrySession'

          - 'ecs:Submit*'

          - 'logs:CreateLogStream'

          - 'logs:PutLogEvents'

          - 'ecr:GetAuthorizationToken'

          - 'ecr:BatchGetImage'

          - 'ecr:GetDownloadUrlForLayer'

        Resource: '*'

# Балансировщики нагрузки для получения трафика c в контейнеры.

# В этом примере шаблона создается один балансировщик нагрузки:

#

# - Одна публикация c балансировщик нагрузки, размещенный в подсетях publi c, который доступен

# в publi c и предназначен для маршрутизации трафика c в один или несколько publi c

# облицовочные сервисы.

# Публичный c балансировщик нагрузки, стоящий перед ним, используется для приема траффи c из паблика c

# inte rnet и направления его на publi c обращенные к микросервисам

PublicLoadBalancerSG:

Type: AWS::EC2::SecurityGroup

Properties:

  GroupDescription: Access to the public facing load balancer

  VpcId: !Ref 'VPC'

  SecurityGroupIngress:

      # Allow access to ALB from anywhere on the internet

      - CidrIp: 0.0.0.0/0

        IpProtocol: -1

PublicLoadBalancer:

Type: AWS::ElasticLoadBalancingV2::LoadBalancer

Properties:

  Scheme: internet-facing

  #LoadBalancerAttributes:

 # - Key: idle_timeout.timeout_seconds

   # Value: '30'

  Subnets:

    # The load balancer is placed into the public subnets, so that traffic

    # from the internet can reach the load balancer directly via the internet gateway

    - !Ref PublicSubnetOne

    - !Ref PublicSubnetTwo

  #SecurityGroups: [!Ref 'PublicLoadBalancerSG']
  Type: network

# Фиктивная целевая группа используется для настройки ALB для отбрасывания траффи c

# изначально, до добавления целевых групп реальных служб.

DummyTargetGroupPubli c:

Type: AWS::ElasticLoadBalancingV2::TargetGroup

Properties:

  HealthCheckIntervalSeconds: 10

  #HealthCheckPath: /

  HealthCheckProtocol: TCP

  #HealthCheckTimeoutSeconds: 5

  HealthyThresholdCount: 2

  Name: !Join ['-', [!Ref 'AWS::StackName', 'drop-1']]

  Port: 80

  Protocol: TCP

  UnhealthyThresholdCount: 2

  VpcId: !Ref 'VPC'

PublicLoadBalancerListener:

Type: AWS::ElasticLoadBalancingV2::Listener

DependsOn:

  - PublicLoadBalancer

Properties:

  DefaultActions:

    - TargetGroupArn: !Ref 'DummyTargetGroupPublic'

      Type: 'forward'

  LoadBalancerArn: !Ref 'PublicLoadBalancer'

  Port: 80

  Protocol: TCP

# Это роль IAM, которая уполномочивает ECS управлять ресурсами в вашей учетной записи

# от вашего имени, например, добавив в свой балансировщик нагрузки данные

# о том, где находятся ваши контейнеры, чтобы traffi c мог добраться до ваших

# контейнеров.

ECSRole:

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:

          # Rules which allow ECS to attach network interfaces to instances

          # on your behalf in order for awsvpc networking mode to work right

          - 'ec2:AttachNetworkInterface'

          - 'ec2:CreateNetworkInterface'

          - 'ec2:CreateNetworkInterfacePermission'

          - 'ec2:DeleteNetworkInterface'

          - 'ec2:DeleteNetworkInterfacePermission'

          - 'ec2:Describe*'

          - 'ec2:DetachNetworkInterface'



          # Rules which allow ECS to update load balancers on your behalf

          # with the information sabout how to send traffic to your containers

          - 'elasticloadbalancing:DeregisterInstancesFromLoadBalancer'

          - 'elasticloadbalancing:DeregisterTargets'

          - 'elasticloadbalancing:Describe*'

          - 'elasticloadbalancing:RegisterInstancesWithLoadBalancer'

          - 'elasticloadbalancing:RegisterTargets'

        Resource: '*'

Это значения, выводимые шаблоном CloudFormation. Будьте осторожны

при изменении любого из них, поскольку они экспортируются с указанными c

именами, чтобы их могли использовать другие шаблоны CF, связанные с задачей.

Выходные данные :

ClusterName:

Description: The name of the ECS cluster

Value: !Ref 'ECSCluster'

Export:

  Name: !Join [ ':', [ !Ref 'AWS::StackName', 'ClusterName' ] ]

ExternalUrl:

Description: The url of the external load balancer

Value: !Join ['', ['http://', !GetAtt 'PublicLoadBalancer.DNSName']]

Export:

  Name: !Join [ ':', [ !Ref 'AWS::StackName', 'ExternalUrl' ] ]

ECSRole:

Description: The ARN of the ECS role

Value: !GetAtt 'ECSRole.Arn'

Export:

  Name: !Join [ ':', [ !Ref 'AWS::StackName', 'ECSRole' ] ]

PublicListener:

Description: The ARN of the public load balancer's Listener

Value: !Ref PublicLoadBalancerListener

Export:

  Name: !Join [ ':', [ !Ref 'AWS::StackName', 'PublicListener' ] ]

VPCId:

Description: The ID of the VPC that this stack is deployed in

Value: !Ref 'VPC'

Export:

  Name: !Join [ ':', [ !Ref 'AWS::StackName', 'VPCId' ] ]

PublicSubnetOne:

Description: Public subnet one

Value: !Ref 'PublicSubnetOne'

Export:

  Name: !Join [ ':', [ !Ref 'AWS::StackName', 'PublicSubnetOne' ] ]

PublicSubnetTwo:

Description: Public subnet two

Value: !Ref 'PublicSubnetTwo'

Export:

  Name: !Join [ ':', [ !Ref 'AWS::StackName', 'PublicSubnetTwo' ] ]

EcsHostSecurityGroup:

Description: A security group used to allow containers to receive traffic

Value: !Ref 'EcsHostSecurityGroup'

Export:

  Name: !Join [ ':', [ !Ref 'AWS::StackName', 'EcsHostSecurityGroup' ] ]

Сценарий 2 для создания службы и задача:

AWSTemplateFormatVersion: '2010-09-09'

Описание: развертывание службы в кластере ECS за публикуемым c балансировщиком нагрузки.

Параметры:

StackName:

Type: String

Default: PublicNLBCluster2

Description: The name of the parent cluster stack that you created. Necessary

             to locate and reference resources created by that stack.

ServiceName:

Type: String

Default: nginx

Description: A name for the service

ImageUrl:

Type: String

Default: nginx

Description: The url of a docker image that contains the application process that

             will handle the traffic for this service

ContainerPort:

Type: Number

Default: 80

Description: What port number the application inside the docker container is binding to

ContainerCpu:

Type: Number

Default: 256

Description: How much CPU to give the container. 1024 is 1 CPU

ContainerMemory:

Type: Number

Default: 512

Description: How much memory in megabytes to give the container

Путь:

Type: String

Default: "*"

Description: A path on the public load balancer that this service

             should be connected to. Use * to send all load balancer

             traffic to this service.

Приоритет:

Type: Number

Default: 1

Description: The priority for the routing rule added to the load balancer.

             This only applies if your have multiple services which have been

             assigned to different paths on the load balancer.

DesiredCount:

Type: Number

Default: 2

Description: How many copies of the service task to run

Роль:

Type: String

Default: ""

Description: (Optional) An IAM role to give the service's containers if the code within needs to

             access other AWS resources like S3 buckets, DynamoDB tables, etc
* 126 7 * Условия:

HasCustomRole:! Not [! Equals [! Ref 'Role', '']]

Ресурсы:

# Определение задачи. Это простое описание метаданных того, какой контейнер

# должен быть запущен, и какие у него требования к ресурсам.

TaskDefinition:

Type: AWS::ECS::TaskDefinition

Properties:

  Family: !Ref 'ServiceName'

  Cpu: !Ref 'ContainerCpu'

  Memory: !Ref 'ContainerMemory'

  TaskRoleArn:

    Fn::If:

      - 'HasCustomRole'

      - !Ref 'Role'

      - !Ref "AWS::NoValue"

  ContainerDefinitions:

    - Name: !Ref 'ServiceName'

      Cpu: !Ref 'ContainerCpu'

      Memory: !Ref 'ContainerMemory'

      Image: !Ref 'ImageUrl'

      PortMappings:

        - ContainerPort: !Ref 'ContainerPort'

# Служба. Служба является ресурсом, который позволяет вам запускать несколько

# копий одного типа задачи и собирать их журналы и метрики, а также

# для мониторинга количества запущенных задач и замените все, которые потерпели крах

Служба:

Type: AWS::ECS::Service

DependsOn: PublicLoadBalancerListener

Properties:

  ServiceName: !Ref 'ServiceName'

  Cluster:

    Fn::ImportValue:

      !Join [':', [!Ref 'StackName', 'ClusterName']]

  DeploymentConfiguration:

    MaximumPercent: 200

    MinimumHealthyPercent: 75

  DesiredCount: !Ref 'DesiredCount'

  TaskDefinition: !Ref 'TaskDefinition'

  LoadBalancers:

    - ContainerName: !Ref 'ServiceName'

      ContainerPort: !Ref 'ContainerPort'

      TargetGroupArn: !Ref 'TargetGroup'

# Целевая группа. Это используется для отслеживания всех задач и

# того, какие IP-адреса / номера портов у них есть. Вы можете запросить его самостоятельно,

#, чтобы использовать адреса самостоятельно, но чаще всего эта целевая группа просто

# подключена к балансировщику нагрузки приложения или балансировщику сетевой нагрузки, поэтому

# он может автоматически распределять трафик c по всем целям.

TargetGroup:

Type: AWS::ElasticLoadBalancingV2::TargetGroup


Properties:

  Name: !Ref 'ServiceName'

  Port: 80

  Protocol: TCP

  VpcId:

    Fn::ImportValue:

      !Join [':', [!Ref 'StackName', 'VPCId']]
...