Elastic Beanstalk 运行部署后脚本

Posted

技术标签:

【中文标题】Elastic Beanstalk 运行部署后脚本【英文标题】:Elastic Beanstalk run post deploy script 【发布时间】:2017-04-07 10:38:16 【问题描述】:

我的 node.js 应用由两部分组成,一个 express 后端和一个 react 前端。

我在这个结构中有两个 package.json 文件

package.json 
/app/package.json

我想做的是在我的前端文件夹 app 中运行一个脚本来构建我的代码。

我要运行的脚本是npm installnpm run build 部署完成后如何运行此脚本?

commands:
    01_app_npm_install:
        command: npm install
        cwd: app/
    02_app_npm_build:
        command: npm run build
        cwd: app/

但它返回一个错误说“没有这样的文件或目录 tory: 'app/'。”

这可以在 aws elastic beanstalk 上执行吗?

【问题讨论】:

【参考方案1】:

更新: 这现在得到了更多的发展和定义。

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html

原文:

我自己没有用 Elastic Beanstalk 做过 nodejs,但是我做过很多 Django。

commands: 部分在项目文件就位之前运行。例如,您可以在此处安装服务器软件包。

container_commands: 部分在文件放入其最终目标(对于 nodejs 似乎是 /var/app/current)之前在暂存目录中运行。如果需要,您可以在此处修改文件。

以上参考: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

您还可以运行部署后脚本。这没有很好的记录(至少不是)。你可以这样做:

files:
    "/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh":
        mode: "000755"
        owner: root
        group: root
        content: |
            #!/usr/bin/env bash
            service httpd restart

【讨论】:

这为我指明了正确的方向,但是,从 AWS Linux 2 开始,这略有不同,请参阅:docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 您必须创建一个名为 .platform/hooks 的文件夹并放置 #! /usr/bin/env bash service httpd restart 直接进入文件【参考方案2】:

感谢@gustaf 和其他一些网站,我设法将解决方案整合在一起。它不漂亮,但很有效。

我在.ebextensions/01_build.config创建了一个文件

commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_build_app.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      cd /var/app/current/app/
      sudo /opt/elasticbeanstalk/node-install/node-v6.2.2-linux-x64/bin/npm install
      sudo /opt/elasticbeanstalk/node-install/node-v6.2.2-linux-x64/bin/npm run build

对节点版本进行硬编码并不完美,但目前可以使用。

【讨论】:

我认为您不需要创建该目录,它应该已经存在。我不必在 python 环境中这样做。如果需要,您显然也可以在 container_commands 中将文件移动到该目录中。 感谢您的回答。一个问题,我使用了您的答案,但无法弄清楚在构建反应应用程序时如何设置环境变量。即使我在 GUI 配置中设置它也是未定义的。你有遇到同样的问题吗?【参考方案3】:

如果您参考文档,您会发现 container_commands 是您应该放置应用相关内容的位置。

文件是根据各个部分的偏好执行的,commands 是第一个,container_commands 是最后一个。在此阶段,应用尚未复制到所需位置 (/var/app/current)。

另外,如果您设置环境变量,这些将仅在 container_commands 中提供给您。

【讨论】:

即使我把它改成 container_commands 还是找不到目录 app/.我在名为 .ebextensions 的目录中有 .config 文件,对吗?【参考方案4】:

从 Amazon Linux 2 开始,您必须使用 Platform Hooks。此处的其他答案仅适用于 Amazon Linux AMI 平台版本。

例如,在您的应用程序根目录中,创建

.platform/hooks/postdeploy

文件夹,然后创建一个名为 service-httpd-restart.sh 的文件

内容为

#!/usr/bin/env bash
service httpd restart

和Gustaf's comment做同样的事情。

【讨论】:

以上是关于Elastic Beanstalk 运行部署后脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Elastic Beanstalk 上部署后运行 PHP 脚本

AWS Elastic Beanstalk 部署后脚本

AWS Elastic Beanstalk - PHP 脚本在部署新版本后无法执行

使用 Elastic Beanstalk 部署后在容器中运行命令

我可以使用 Elastic Beanstalk 部署工作线程吗?

在 AWS Elastic Beanstalk 上运行临时脚本