我正在尝试为 DEV 环境创建一个非常简单的基础架构。给定的限制如下:
- 仅一个 ec2 实例,基于标准 ec2 linux
- Docker 容器中的 nginx 服务器提供 healthcheck.html
- 服务器必须位于自动缩放组中
- 仅通过 aws 应用程序负载均衡器从 Web 访问
这是预期的架构:
我有一个不错的 cloudformation 模板,但它失败了。错误消息:
Received 1 FAILURE signal(s) out of 1. Unable to satisfy 100% MinSuccessfulInstancesPercent requirement
这似乎是由依赖循环引起的:
...或者,用文字来说:
目标组的健康检查失败
...因为 nginx docker 容器不存在
...因为 CodeDeploy 没有部署 docker 容器
...因为 cloudformation 认为 ASG 尚未准备好
...因为目标组的健康检查失败
问题:是否可以通过禁用目标组的健康检查来打破循环?(我在 aws 中没有找到这样的选项)。还有哪些其他选项可以提供帮助?
答案1
您可以在 ASG 模板中设置HealthCheck
属性EC2
。这样它就不会依赖于 ELB 健康检查,并且会在脚本完成后立即将实例标记为健康UserData
。
TestAutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
[...]
HealthCheckType: EC2
然后,LaunchConfiguration.UserData
您需要在 UserData 脚本完成后发送一个信号:
TestLaunchConfig:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
[...]
UserData:
Fn::Base64:
!Sub |
#!/bin/bash -x
[... some setup ...]
# Signal the status from this instance
/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} \
--resource TestAutoScalingGroup --region ${AWS::Region}
注意--resource
参数必须与TestAutoScalingGroup
资源名称匹配。
希望有帮助:)