【问题标题】:How to run Elastic Beanstalk commands on EC2 instance before connecting Resources如何在连接资源之前在 EC2 实例上运行 Elastic Beanstalk 命令
【发布时间】:2018-05-05 15:10:09
【问题描述】:

我们有一种情况,我们想以通常的 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 服务器能够通过 localhost 访问 Docker 容器,但我不反对在 Resources 中包含一个专门用于托管 Docker 容器的 EC2 实例,如果它在 auto-扩展的 EC2 实例
  • 我们尝试了多 docker 容器方法,但这种方式似乎更接近 EB 的用法(将 Web 服务器文件直接放在环境中,而不是制作 docker 映像以供环境运行)

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 不幸的是,我认为等待条件是 EC2 实例启动。我需要一个等待条件,等待 commands 挂钩运行。
    • 您可能需要将自己的 CreationPolicy 资源添加为依赖项(或者可能是 WaitCondition),并将 cfn 信号作为命令 03 调用给它。docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
    【解决方案2】:

    想清楚后自己解决了。

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

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 2017-03-31
      • 2016-05-29
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2015-07-16
      相关资源
      最近更新 更多