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 install
和npm 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 - PHP 脚本在部署新版本后无法执行
使用 Elastic Beanstalk 部署后在容器中运行命令