我有一个简单的 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 的方法。
答案1
通常你不会给弹性 IP致东道主Auto Scaling 组。
其中一些原因是 ASG 可以扩展和收缩,您需要跟踪已分配/空闲的 EIP,在创建新实例时重新分配它们,不断更新 DNS 以仅列出已分配的 EIP 等。这并不切实际。
标准方法是负载均衡器在......面前Auto Scaling 组.最好应用程序负载均衡器(ALB)除非你有特殊要求使用经典/弹性负载均衡器(ELB)或网络负载均衡器(国家图书馆协会)。
ASG 中的实例可以自动注册到 ALB,在 DNS 中,您将拥有 ALB 主机名的 CNAME 等。这是 Auto Scaling Groups 的标准方法。
CFN 模板的另一个选项是创建单个实例(Type: AWS::EC2::Instance
) 而不是启动配置和自动伸缩组。它不会像 ASG 那样为您提供那么多的弹性,但可以让您在模板中分配 EIP 并摆脱 ALB。
希望有帮助:)
答案2
作为甲基路写道,最好切换到没有任何 AutoScaling 组/ASG 的单个 EC2 实例。
如果您在实例状态检查失败时使用 ASG 恢复实例,并且这是默认的 ASG 健康检查行为,您可以尝试EC2 自动恢复功能。您可以创建一个 Amazon CloudWatch 警报来监控实例,并在实例因底层硬件故障或需要 AWS 参与修复的问题而受损时自动恢复实例。换句话说,当其状态检查失败时。这可以在 CloudFormation 模板中轻松声明。
如果您确实需要为 ASG 中的实例分配 EIP,假设这是 ASG 中唯一的实例,那么您可以尝试:
- 创建一个 IAM 角色,其策略允许将 EIP 与实例关联
- 通过设置实例配置文件将角色传递给实例
- 通过从用户数据中调用相应的 API(即使用 AWS CLI 等)将 EIP 与实例关联起来
在 EC2-VPC-only 账户中的 VPC 中,这已经足够了,因为默认情况下允许 EIP 重新关联。否则,您必须在“旧版”EC2-classic 账户中明确允许它。
如果你想让它更成熟,你可以尝试使用AutoScaling 生命周期挂钩。有了它们,您可以在启动时/ASG 扩展但尚未启动时说“将 EIP 与新实例关联” in-service
。当即将终止/ASG 在终止之前缩减时,您可以“将 EIP 与实例解除关联”。这将需要 IAM 角色中的额外权限才能允许解除关联的 EIP 地址 API 操作。