如何在连接资源之前在 EC2 实例上 运行 Elastic Beanstalk 命令

How to run Elastic Beanstalk commands on EC2 instance before connecting Resources

我们有这样一种情况,我们希望以通常的 Elastic Beanstalk 方式 运行 Django 服务器,同时连接自定义 Docker 容器以供 Django 网站使用。到目前为止,我基本上有以下.ebextensions配置文件:

packages:
  yum:
    ecs-init: []

files:
  /etc/ecs/ecs.config:
    mode: "000644"
    owner/group: root
    content: ECS_CLUSTER=${Ref: MyCluster}

commands:
  01_start_docker: sudo service docker start
  02_start_ecs: sudo start ecs

Resources:
  MyCluster:
    Type: AWS::ECS::Cluster
  MyService:
    Type: AWS::ECS::Service
    Properties:
      Cluster: ${Ref: MyCluster}
      DesiredCount: 1
      TaskDefinition: ${Ref: MyTask}
  MyTask:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ContainerDefinitions:
        - ...

问题是 ECS 服务试图在 Elastic Beanstalk 提供的 EC2 实例注册到集群之前启动。因此,部署到 Elastic Beanstalk 挂起。如果我手动通过 SSH 连接到 EC2 实例并手动安装 ecs-init、创建 ecs.config 和 运行 命令,将继续创建服务并成功创建 EB 环境。

有没有办法让服务等到由 EB 的自动缩放组创建的 EC2 实例注册到集群?

更多上下文:

试试下面的方法。由于 EB 只是 CloudFormation 堆栈,请查看以 awseb- 开头的堆栈以找到您的堆栈。然后在您的 EB 应用程序部署时查看 CF 资源,以查看您未在 .ebextensions 中指定的预定义 EB 资源使用的名称。我看到我的 AWSEBInstanceLaunchWaitCondition,它似乎与初始实例启动有关。

Resources:
  MyService:
    Type: AWS::ECS::Service
    Properties:
      Cluster: ${Ref: MyCluster}
      DesiredCount: 1
      TaskDefinition: ${Ref: MyTask}
    DependsOn: AWSEBInstanceLaunchWaitCondition

想清楚了自己解决了

将 Elastic Beanstalk 启动(通过 AutoScaling)的每个 EC2 实例注册到 ECS 集群是没有意义的。 ECS 任务应该只有一个实例。所以实际上有必要创建一个单独的EC2实例连接到ECS集群(其服务现在可以依赖于EC2实例)。