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

时间:2016-02-17 16:43:53

标签: linux amazon-web-services amazon-ec2 elastic-beanstalk amazon-elastic-beanstalk

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

但是,我只希望这个代码在实例创建时运行,而不是每次我部署时都如此。有没有人知道实现这个目标的方法?

提前致谢!

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

创建自定义AMI。通过这种方式,您可以根据需要设置实例,并且可以更快地启动

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

<强>更新

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

答案 2 :(得分:1)

正如我从您那里看到的问题,您正在使用: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实例。

答案 3 :(得分:0)

有一个简单的选项 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