使用AWS Elastic Beanstalk创建实例时运行命令的方法

4
我一直在研究在AWS Elastic Beanstalk上创建EC2实例后运行命令的各种方法。AWS技术支持提供了不同的方法,包括生命周期钩子、自定义AMI和.ebextensions。我尝试使用前两种方法(生命周期钩子和自定义AMI)来与EB配合使用时出现了问题。
目前,我正在使用.ebextensions在部署时运行命令,但不确定是否有办法只在创建时运行一组命令,而不是每次部署代码都运行。例如,我有一个文件 .ebextensions/03-commands.config 包含以下代码:
container_commands:
  01_npm_install:
    command: "npm install -g -f npm@latest"

然而,我只希望这段代码在实例创建时运行,而不是像现在一样每次部署都运行。有人知道如何实现吗?

谢谢!


你想要实现什么样的目标? - Vadym Fedorov
1
@VadymFedorov 我稍微修改了一下,加入了更多的信息。这样有帮助吗? - nratter
我使用AWS技术支持建议的方法1和方法2都取得了巨大的成功。生命周期钩子非常适合一次性命令执行(例如在实例创建时),因此建议您进一步研究它。自定义AMI非常适合更高级的配置需求(例如安装大量自定义软件、更新软件、设置环境等)。再试一次,如果您仍然遇到困难,请回来咨询! - Chris Franklin
4个回答

4
我建议在您的应用程序中创建一个幂等脚本,并使用类似于 mkdir -p /var/myapp-state/; touch /var/myapp-state/marker 的命令将标记文件留在实例的某个位置(如 /var/myapp/marker)上。这样,在脚本中,您可以检查如果标记文件存在,则使您的脚本成为无操作。

然后,您可以从容器命令调用您的脚本,但每次都会变成无操作,因为在第一次成功执行时,它将创建标记文件,后续执行将成为无操作。


谁知道为什么有些人会踩贴?我已经为你平衡了,因为在我看来这似乎是一个明智的解决方案。 - tugi

1

我没有点踩,然而自定义 AMI 可能会带来很多麻烦,你必须要维护它们,最好在可能的情况下使用 ebextensions 和默认的 Elastic Beanstalk AMI。 - SSED
如果您需要频繁进行扩展(或由于其他原因需要快速启动),并且具有需要花费时间的rpm和其他复杂设置,则可以完全跳过该步骤。管理AMI并不难,可以通过自动化相对容易地完成。 - Gustaf

0

从您的问题中我看到,您正在使用container_commands,这意味着您正在使用带有Docker的Elastic Beanstalk。对吗?在这种情况下,我建议阅读:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.html

思路如下,您可以创建自己的Dockerfile,在其中指定构建docker容器所需的所有命令,例如安装所有依赖项。

我建议使用.ebextensions进行Elastic Beanstalk的自定义和配置,例如指定ELB或RDS配置。在Dockerfile中,有必要指定构建应用程序容器所需的所有命令,包括设置Web服务器、依赖项等。

采用这种方法,Elastic Beanstalk将构建一个容器,每次部署时,它都会执行一个带有已部署源代码的docker实例。


1
container_commands在使用Elastic Beanstalk时与Docker无关。这些命令在您的Elastic Beanstalk EC2实例的虚拟环境中运行。命令在您的EC2实例上运行。 - Gustaf

-1

根据当前的AWS Elasticbeanstalk配置,有一个简单的选项leader_only: true,您需要使用它。您只需将其添加在下面即可。

container_commands:
  01_npm_install:
    command: "npm install -g -f npm@latest"
    leader_only: true

这是 AWS 的链接 AWS Elasticbeanstalk 容器命令选项


leader_only 用于指定该命令仅在负载均衡设置中的一个实例上运行。它与命令是否在实例创建时或每次部署时运行无关。 - kloddant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接