如何在 LB 后面的 ASG 中启动服务器并通过 cloudformation 在其上部署代码?

如何在 LB 后面的 ASG 中启动服务器并通过 cloudformation 在其上部署代码?

我正在尝试为 DEV 环境创建一个非常简单的基础架构。给定的限制如下:

  • 仅一个 ec2 实例,基于标准 ec2 linux
  • Docker 容器中的 nginx 服务器提供 healthcheck.html
  • 服务器必须位于自动缩放组中
  • 仅通过 aws 应用程序负载均衡器从 Web 访问

这是预期的架构:

带有 Docker 和 Code Deploy 的负载均衡器、ASG、目标组、EC2 实例

我有一个不错的 cloudformation 模板,但它失败了。错误消息:

Received 1 FAILURE signal(s) out of 1. Unable to satisfy 100% MinSuccessfulInstancesPercent requirement

这似乎是由依赖循环引起的:

Cloudformation 堆栈失败

...或者,用文字来说:

目标组的健康检查失败
...因为 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资源名称匹配。

希望有帮助:)

相关内容