У меня есть простой стек 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, вы можете попробовать:
Этого достаточно для VPC в учетной записи EC2-VPC-only, где повторное связывание EIP разрешено по умолчанию. В противном случае вам придется явно разрешить это в «устаревшей» учетной записи EC2-classic.
Если вы хотите сделать это более зрелым, вы можете попробовать использовать Хуки жизненного цикла AutoScaling. С их помощью вы можете сказать «связать EIP с новым экземпляром», когда он запущен / ASG масштабируется, но это не так. in-service
все же. И «отсоедините EIP от экземпляра», когда он будет завершен / ASG масштабируется до его завершения. Для этого потребуется дополнительное разрешение в роли IAM, чтобы разрешить отключение действия API адреса EIP.