如何在连接资源之前在 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 实例注册到集群?
更多上下文:
- 我们希望 Django 服务器能够使用本地主机访问 Docker 容器,但我不反对在资源中包含一个 EC2 实例专门用于托管 Docker 容器,如果在自动缩放的EC2实例中很容易引用
- 我们已经尝试过多docker 容器方法,但这种方法似乎更接近 EB 的用法(直接在环境中使用 Web 服务器文件,而不是为 docker 制作图像环境 运行)
试试下面的方法。由于 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实例)。
我们有这样一种情况,我们希望以通常的 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 实例注册到集群?
更多上下文:
- 我们希望 Django 服务器能够使用本地主机访问 Docker 容器,但我不反对在资源中包含一个 EC2 实例专门用于托管 Docker 容器,如果在自动缩放的EC2实例中很容易引用
- 我们已经尝试过多docker 容器方法,但这种方法似乎更接近 EB 的用法(直接在环境中使用 Web 服务器文件,而不是为 docker 制作图像环境 运行)
试试下面的方法。由于 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实例)。