在使用 AWS Elastic Beanstalk 创建实例时运行命令

Posted

技术标签:

【中文标题】在使用 AWS Elastic Beanstalk 创建实例时运行命令【英文标题】:Running commands upon creation of instances using AWS Elastic Beanstalk 【发布时间】:2016-05-29 12:14:21 【问题描述】:

我一直在研究在 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"

但是,我只希望在创建实例时运行此代码,而不是像当前那样在每次部署时运行。有谁知道实现这一点的方法吗?

提前致谢!

【问题讨论】:

可以添加更多细节你想实现什么? @VadymFedorov 我进行了一些修改以包含更多信息。这有帮助吗? 我发现使用 AWS 技术支持建议的方法 1 和 2 都取得了巨大的成功。生命周期钩子非常适合一次性命令执行(即像你想要的那样创建实例),所以我建议对它进行更多研究。自定义 AMI 非常适合更高级的配置需求(即安装大量自定义软件、更新软件、设置环境等)。再试一次,如果您仍然遇到困难,请回来! 【参考方案1】:

我建议在您的应用程序中创建一个幂等脚本,在成功执行时使用 mkdir -p /var/myapp-state/; touch /var/myapp-state/marker 之类的东西在某个位置的实例上留下一个标记文件,例如 /var/myapp/marker。这样,在您的脚本中,您可以检查标记文件是否存在,您可以使您的脚本成为无操作。

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

【讨论】:

谁知道为什么有些人投反对票?我为你平衡了它,因为这对我来说似乎是一个明智的解决方案。【参考方案2】:

创建自定义 AMI。这样您就可以随心所欲地设置您的实例,并且它们会更快地启动

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.customenv.html

更新

我不明白为什么有人会对此投反对票。无论如何,正如 cmets 中所说,自定义 AMI 是在您的实例上创建自定义行为的好方法。

【讨论】:

我没有投反对票,但是自定义 ami 可能会引起很多麻烦,您必须维护它们,最好尽可能使用 ebextensions 和默认的弹性 beanstalk ami 如果您进行大量扩展(或出于其他原因需要快速启动)并且使用 rpm 和其他需要时间的东西进行复杂设置,您可以完全完成该步骤。管理 ami 并不难,通过自动化可以很容易地完成。【参考方案3】:

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

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

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

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

【讨论】:

container_commands 在使用 Elastic Beanstalk 时与 Docker 无关。这些是在 Elastic Beanstalk EC2 实例的虚拟环境中运行的命令。命令在您的 EC2 实例上运行。【参考方案4】:

有一个简单的选项 leader_only: true 您需要根据当前的 AWS Elasticbeanstalk 配置使用,您只需将其添加到

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

这是根据 AWS 的链接 AWS Elasticbeanstalk container command option

【讨论】:

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

以上是关于在使用 AWS Elastic Beanstalk 创建实例时运行命令的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Elastic beanstalk 和 Dockerrun.aws.json 正确部署到 AWS?

如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?

AWS Elastic Beanstalk 上禁止使用 Django 403

如何在 AWS Elastic Beanstalk 上强制使用 HTTPS

Elastic Beanstalk (AWS) 的休眠配置

如何在 AWS Elastic Beanstalk 上设置 HTTPS