您需要在部署后执行安装过程。AWS并没有真正记录如何在部署后执行命令,因此我将在此处进行说明。
commands:
create_post_dir:
command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
ignoreErrors: true
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/99_install_libwebp.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
cd $EB_CONFIG_APP_CURRENT
wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-0.5.0.tar.gz
tar xvzf libwebp-0.5.0.tar.gz
cd libwebp-0.5.0
sudo ./configure
sudo make
sudo make install
正如我之前提到的,AWS并没有真正记录您可以在ElasticBeanstalk部署后执行脚本的方法。如果您查看eb-commandprocessor.log文件,您会发现eb正在寻找AppDeployPreHook(6个中的4个)和AppDeployPostHook(2个中的1个)。它将类似于以下内容:
[2016-04-13T14:15:22.955Z] DEBUG [8851] : Loaded 6 actions for stage 0.<br>
[2016-04-13T14:15:22.955Z] INFO [8851] : Running 1 of 6 actions: InfraWriteConfig...<br>
[2016-04-13T14:15:22.962Z] INFO [8851] : Running 2 of 6 actions: DownloadSourceBundle...<br>
[2016-04-13T14:15:23.606Z] INFO [8851] : Running 3 of 6 actions: EbExtensionPreBuild...<br>
[2016-04-13T14:15:24.229Z] INFO [8851] : Running 4 of 6 actions: AppDeployPreHook...<br>
[2016-04-13T14:15:28.469Z] INFO [8851] : Running 5 of 6 actions: EbExtensionPostBuild...<br>
[2016-04-13T14:15:28.970Z] INFO [8851] : Running 6 of 6 actions: InfraCleanEbextension...<br>
[2016-04-13T14:15:28.974Z] INFO [8851] : Running stage 1 of command CMD-AppDeploy...<br>
[2016-04-13T14:15:28.974Z] DEBUG [8851] : Loaded 2 actions for stage 1.<br>
[2016-04-13T14:15:28.974Z] INFO [8851] : Running 1 of 2 actions: AppDeployEnactHook...<br>
[2016-04-13T14:15:29.600Z] INFO [8851] : Running 2 of 2 actions: AppDeployPostHook...<br>
[2016-04-13T14:16:42.048Z] INFO [8851] : Running AddonsAfter for command CMD-AppDeploy... <br>
那个小的 "AppDeployPostHook" 告诉我们它正在寻找脚本来运行部署后操作。您可以在服务器上的
/opt/elasticbeanstalk
目录中找到 eb 部署脚本,如果您 ssh 进入并在该目录上输入
ls
,则会找到
hooks
,这就是我们要找的内容,如果您
cd hooks
,则会找到 appdeploy 目录,
cd appdeploy
然后
ls
,您将得到两个目录 pre 和 enact。这似乎很平凡,但实际上非常棒,因为现在我们知道了 eb 正在运行的脚本所在的位置。由于 AppDeployPreHook 脚本是从 "pre" 目录执行的,因此我们知道我们需要一个 "post" 目录来使用 AppDeployPostHook 在部署后执行命令。既然我们知道该怎么做了,我们就可以开始编写命令了。
- create_post_dir 第一步是实际上使用 mkdir 命令在服务器上创建 "post" 目录。
mkdir "/opt/elasticbeanstalk/hooks/appdeploy/post"
将为我们完成此操作,因此我们将其创建为命令。
- files files 配置允许我们通过 ElasticBeanstalk 在目录中创建文件。对于我们的目的非常方便! files 操作的第一行给出了要创建的文件名。我们将创建一个 shell 脚本来执行命令,您可以随意命名,但我建议从 99 开始并继续向后。我们将称这个正在创建的 shell 脚本为 "99_install_libwebp.sh"。
- File settings 接下来的三行设置文件设置。确保根拥有它们,并且它们是 000755 的。
- File Contents 这是我们正在创建的文件的内容。直截了当。将您的 shell 脚本放在那里,就可以了。
- Load environment vars 我们选择加载 eb 环境变量,以便我们的脚本可以知道应用程序的当前版本位于何处。通常在 /var/app/current 中,但根据各种因素可能在其他位置。我们将使用环境变量使生活变得更加轻松。
- Change to our current app directory 我们将 cd 到当前应用程序目录,以便我们可以做我们要做的事情。
- Get the package we want 使用 wget 获取我们想要的 libwebp
- Unpack the package 不言自明
- Change to the package directory 现在我们已经解压了包,我们可以切换到包目录。
- Do what we need to do 现在我们可以运行 ./configure、make 和 make install。
就是这样。您可以使用隐秘的AppDeployPostHook来运行几乎任何需要的部署后命令。如果需要安装软件包、重启服务或进行其他任何部署后操作,这将非常有用。
我还将我部署的代码添加到了Github上,以便轻松参考。https://github.com/hephalump/testphp
注意:我在稍微不同的环境下成功地完成了此操作。我使用ElasticBeanstalk部署了一个新的PHP应用程序,使用的是最新的环境版本,即64位Amazon Linux 2016.03 v2.1.0上的PHP 5.6;您正在使用的环境类型对我来说不可用作选项...实际上,这是唯一提供给我的PHP 5.6版本,所以我选择了它。