Назад | Перейти на главную страницу

Как получить идентификатор экземпляра для хоста докеров в шаблоне облачной информации

У меня есть простой стек CloudFormation, который создается с помощью шаблона. Сервер, на котором размещен один контейнер Docker.

Это часть шаблона, который создает хост и контейнер:

  ContainerHostInstances:
    Type: "AWS::AutoScaling::LaunchConfiguration"
    DependsOn: "AttachGateway"
    Properties:
      AssociatePublicIpAddress: true
      ImageId: "ami-0302f3ec240b9d23c"
      SecurityGroups:
        - Ref: "NginxSecurityGroup"
      InstanceType: "t3.nano"
      IamInstanceProfile: !Ref "ECSHostEC2InstanceProfile"
      KeyName: "test-key-pair"
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          echo ECS_CLUSTER=${MyCluster} >> /etc/ecs/ecs.config
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource ECSAutoScalingGroup --region ${AWS::Region}

...

  MyTask:
    Type: "AWS::ECS::TaskDefinition"
    Properties:
      Family: "my-task-family"
      ContainerDefinitions:
        - Name: "nginx"
          Essential: true
          Image: "image_url/nginx:latest"
          MemoryReservation: 300
          LogConfiguration:
            LogDriver: "awslogs"
            Options:
              awslogs-group: "nginx"
              awslogs-region: !Ref "AWS::Region"
              awslogs-stream-prefix: "prefix"
              awslogs-datetime-format: "%Y-%m-%d %H:%M:%S.%L"
          PortMappings:
            - ContainerPort: 80
              HostPort: 80

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

Я пробовал так:

  ElasticIPAssoc:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId: "some_id"
      InstanceId: "HOW CAN I GET THIS VALUE"
      NetworkInterfaceId: "OR THAT VALUE"

Я не вижу способа получить instanceId или соответствующий ему NetworkInterfaceId.

Обычно вы не даете Эластичные IP-адреса хозяевам в Группы автоматического масштабирования.

Некоторые из причин заключаются в том, что ASG может расширяться и сокращаться, и вам нужно будет отслеживать назначенные / бесплатные EIP, переназначать их при создании новых экземпляров, постоянно обновлять DNS, чтобы отображать только назначенные, и т. Д. Это непрактично .

Стандартный подход - иметь Балансировщик нагрузки напротив Группа автоматического масштабирования. Предпочтительно Балансировщик нагрузки приложений (ALB), если у вас нет особых требований к использованию Классический / эластичный балансировщик нагрузки (ELB) или Балансировщик сетевой нагрузки (NLB).

Экземпляры в ASG могут автоматически регистрироваться в ALB, в DNS у вас будет CNAME для имени хоста ALB и т. Д. Это стандартный подход с Auto Scaling Groups.

Другой вариант для вашего шаблона CFN - просто создать единый экземпляр (Type: AWS::EC2::Instance) скорее, чем Конфигурация запуска и Группа автоматического масштабирования. Это не даст вам такой же отказоустойчивости, как ASG, но позволит вам назначить EIP в шаблоне и обойтись без ALB.

Надеюсь, это поможет :)

Так как MLu написал, что может быть лучше переключиться на один экземпляр EC2 без какой-либо группы AutoScaling / ASG.

Если вы используете ASG для восстановления экземпляра в случае сбоя проверки его состояния, и это поведение проверки работоспособности ASG по умолчанию, вы можете попробовать Функция автоматического восстановления EC2. Вы можете создать аварийный сигнал Amazon CloudWatch, который отслеживает экземпляр и автоматически восстанавливает его, если он выходит из строя из-за отказа основного оборудования или проблемы, требующей вмешательства AWS для ремонта. Другими словами, когда его проверка состояния не удалась. Это можно легко объявить в шаблоне CloudFormation.

Если вам действительно нужно назначить EIP для своего экземпляра в ASG, предполагая, что это единственный экземпляр в ASG, вы можете попробовать:

  • создать роль IAM с политикой, позволяющей связать EIP с экземпляром
  • передать роль экземпляру, установив его профиль экземпляра
  • связать EIP с экземпляром, вызвав соответствующий API из его пользовательских данных (он же AWS CLI и т. д.)

Этого достаточно для VPC в учетной записи EC2-VPC-only, где повторное связывание EIP разрешено по умолчанию. В противном случае вам придется явно разрешить это в «устаревшей» учетной записи EC2-classic.

Если вы хотите сделать это более зрелым, вы можете попробовать использовать Хуки жизненного цикла AutoScaling. С их помощью вы можете сказать «связать EIP с новым экземпляром», когда он запущен / ASG масштабируется, но это не так. in-service все же. И «отсоедините EIP от экземпляра», когда он будет завершен / ASG масштабируется до его завершения. Для этого потребуется дополнительное разрешение в роли IAM, чтобы разрешить отключение действия API адреса EIP.