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

时间:2017-11-22 01:00:00

标签: amazon-web-services elastic-beanstalk amazon-cloudformation

我们有一种情况,我们希望以通常的Elastic Beanstalk方式运行Django服务器,同时连接Django网站使用的自定义Docker容器。到目前为止,我基本上有以下.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服务器能够使用localhost访问Docker容器,但我不反对在Resources中包含一个专门用于托管Docker容器的EC2实例,如果它很容易在auto中引用缩放EC2实例
  • 我们尝试过多Docker容器方法,但这种方式似乎更接近于EB的使用(直接在环境中使用Web服务器文件而不是为运行环境制作docker镜像)。

2 个答案:

答案 0 :(得分:1)

尝试类似下面的内容。由于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

答案 1 :(得分:0)

在更清楚地思考之后自己解决了。

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