AWS CodeDeploy
User Guide (API Version 2014-10-06)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

AppSpec 的“hooks”部分

AppSpec 文件的 hooks 部分包含将部署生命周期事件挂钩链接到一个或多个脚本的映射。如果某个事件的挂钩不存在,则不会对该事件执行任何操作。仅当您将在部署过程中运行脚本时,才需要此部分。

一些挂钩仅对蓝/绿部署有效。若要了解哪些生命周期事件挂钩对哪些部署和回滚类型有效,请参阅下表。

可用的事件挂钩有:

  1. ApplicationStop - 此部署生命周期事件发生在下载应用程序修订之前。如果您希望从容地停止应用程序或删除部署准备过程中当前已安装的软件包,您可以使用此事件。用于此部署生命周期事件的 AppSpec 文件 和脚本来自于上一次成功部署的应用程序修订。

    注意

    在您部署实例之前,实例上不存在 AppSpec 文件。因此,ApplicationStop 钩子在您首次部署到实例时不会运行。您可以在第二次部署到实例时使用 ApplicationStop 钩子。

    为确定上次成功部署的应用程序修订的位置,AWS CodeDeploy 代理会查看 deployment-group-id_last_successful_install 文件中列出的位置。此文件位于:

    Amazon Linux、Ubuntu Server 和 RHEL Amazon EC2 实例上的 /opt/codedeploy-agent/deployment-root/deployment-instructions 文件夹。

    Windows Server Amazon EC2 实例上的 C:\ProgramData\Amazon\CodeDeploy\deployment-instructions 文件夹。

    要对在 ApplicationStop 部署生命周期事件期间失败的部署进行故障排除,请参阅 排查 ApplicationStop 部署生命周期事件失败的问题

  2. DownloadBundle - 在此部署生命周期事件期间,AWS CodeDeploy 代理会将应用程序修订文件复制到临时位置:

    Amazon Linux、Ubuntu Server 和 RHEL Amazon EC2 实例上的 /opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive 文件夹。

    Windows Server Amazon EC2 实例上的 C:\ProgramData\Amazon\CodeDeploy\deployment-group-id\deployment-id\deployment-archive

    此事件是为 AWS CodeDeploy 代理预留的,不能用于运行脚本。

    要对在 DownloadBundle 部署生命周期事件期间失败的部署进行故障排除,请参阅 排查失败的 DownloadBundle 部署生命周期事件的问题,错误为“UnknownError: not opened for reading”

  3. BeforeInstall - 您可以使用此部署生命周期事件执行预安装任务,例如解密文件和创建当前版本的备份。

  4. Install - 在此部署生命周期事件期间,AWS CodeDeploy 代理会将修订文件从临时位置复制到最终目标文件夹中。此事件是为 AWS CodeDeploy 代理预留的,不能用于运行脚本。

  5. AfterInstall - 您可以使用此部署生命周期事件执行配置应用程序或更改文件权限等任务。

  6. ApplicationStart - 您通常使用此部署生命周期事件来重新启动在 ApplicationStop 期间停止的服务。

  7. BeforeBlockTraffic – 在从负载均衡器取消注册原始环境中的实例之前,您可以使用此部署生命周期事件在这些实例上运行任务。仅对蓝/绿部署有效。

  8. BlockTraffic - 在此部署生命周期事件期间,阻止 Internet 流量访问原始环境中的实例。此事件是为 AWS CodeDeploy 代理预留的,不能用于运行脚本。仅对蓝/绿部署有效。

  9. AfterBlockTraffic – 在从负载均衡器取消注册原始环境中的实例之后,您可以使用此部署生命周期事件在这些实例上运行任务。仅对蓝/绿部署有效。

  10. BeforeAllowTraffic – 在向负载均衡器注册替换环境中的实例之前,您可以使用此部署生命周期事件在这些实例上运行任务。仅对蓝/绿部署有效。

  11. AllowTraffic - 在此部署生命周期事件期间,允许 Internet 流量访问替换环境中的实例。此事件是为 AWS CodeDeploy 代理预留的,不能用于运行脚本。仅对蓝/绿部署有效。

  12. AfterAllowTraffic – 在向负载均衡器注册替换环境中的实例之后,您可以使用此部署生命周期事件在这些实例上运行任务。仅对蓝/绿部署有效。

  13. ValidateService - 这是最后的部署生命周期事件。它用于验证部署已成功完成。

下表列出了适用于每个部署和回滚方案的生命周期事件挂钩。

生命周期事件名称 就地部署¹ 蓝/绿部署:原始实例 蓝/绿部署:替换实例 蓝/绿部署回滚:原始实例 蓝/绿部署回滚:替换实例
ApplicationStop
DownloadBundle²
BeforeInstall
安装²
AfterInstall
ApplicationStart
BeforeBlockTraffic
BlockTraffic²
AfterBlockTraffic
BeforeAllowTraffic
AllowTraffic²
AfterAllowTraffic
ValidateService

¹也适用于就地部署的回滚。

² 为 AWS CodeDeploy 操作预留。不能用于运行脚本。

在就地部署中 (包括就地部署的回滚),事件挂钩按以下顺序运行:

注意

部署中的 StartDownloadBundleInstallEnd 事件无法脚本化,这就是为什么它们在此图中灰显。不过,您可以编辑 AppSpec 文件 的 files 部分,以指定在 Install 事件期间安装的内容。

在蓝/绿部署中,事件挂钩按以下顺序运行:

注意

部署中的 StartDownloadBundleInstallBlockTrafficAllowTrafficEnd 事件无法脚本化,这就是它们在此图中灰显的原因。不过,您可以编辑 AppSpec 文件 的 files 部分,以指定在 Install 事件期间安装的内容。

挂钩部分具有以下结构:

Copy
hooks: deployment-lifecycle-event-name - location: script-location timeout: timeout-in-seconds runas: user-name

可以在 hook 条目中的部署生命周期事件名称后包括以下元素:

位置

必需。修订的脚本文件的位置。

timeout

可选。在脚本被视为失败之前允许其执行的秒数。默认值为 3600 秒(1 小时)。

注意

3600 秒(1 小时)是允许每个部署生命周期事件脚本执行的最长时间。如果脚本超过此限制,则部署将停止,并且部署到实例将失败。确保在 timeout 中为每个部署生命周期事件的所有脚本指定的总秒数不超过此限制。

runas

可选。运行脚本时要模拟的用户。默认情况下,这是在实例上运行的 AWS CodeDeploy 代理。AWS CodeDeploy 不存储密码,因此,如果 runas 用户需要密码,则无法模拟该默认用户。此元素仅适用于 Amazon Linux 和 Ubuntu Server 实例。

在每个部署生命周期事件期间,挂钩脚本可以访问以下环境变量:

APPLICATION_NAME

AWS CodeDeploy 中属于当前部署的应用程序的名称 (例如 WordPress_App)。

DEPLOYMENT_ID

AWS CodeDeploy 已分配给当前部署的 ID(例如 d-AB1CDEF23)。

DEPLOYMENT_GROUP_NAME

AWS CodeDeploy 中属于当前部署的部署组的名称 (例如 WordPress_DepGroup)。

DEPLOYMENT_GROUP_ID

AWS CodeDeploy 中属于当前部署的部署组的 ID (例如 b1a2189b-dd90-4ef5-8f40-4c1c5EXAMPLE)。

LIFECYCLE_EVENT

当前部署生命周期事件的名称(例如 AfterInstall)。

这些是每个部署生命周期事件的本地环境变量。

如果 DEPLOYMENT_GROUP_NAME 的值等于 Staging,则以下脚本会将 Apache HTTP 服务器上的监听端口更改为 9090 而非 80。必须在 BeforeInstall 部署生命周期事件期间调用此脚本:

Copy
if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ] then sed -i -e 's/Listen 80/Listen 9090/g' /etc/httpd/conf/httpd.conf fi

如果 DEPLOYMENT_GROUP_NAME 环境变量的值等于 Staging,则以下脚本示例会将其错误日志中记录的消息的详细级别从警告更改为调试。必须在 BeforeInstall 部署生命周期事件期间调用此脚本:

Copy
if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ] then sed -i -e 's/LogLevel warn/LogLevel debug/g' /etc/httpd/conf/httpd.conf fi

以下脚本示例将指定网页中的文本替换为显示这些环境变量值的文本。必须在 AfterInstall 部署生命周期事件期间调用此脚本:

Copy
#!/usr/bin/python import os strToSearch="<h2>This application was deployed using AWS CodeDeploy.</h2>" strToReplace="<h2>This page for "+os.environ['APPLICATION_NAME']+" application and "+os.environ['DEPLOYMENT_GROUP_NAME']+" deployment group with "+os.environ['DEPLOYMENT_GROUP_ID']+" deployment group ID was generated by a "+os.environ['LIFECYCLE_EVENT']+" script during "+os.environ['DEPLOYMENT_ID']+" deployment.</h2>" fp=open("/var/www/html/index.html","r") buffer=fp.read() fp.close() fp=open("/var/www/html/index.html","w") fp.write(buffer.replace(strToSearch,strToReplace)) fp.close()

hooks 示例

下面是 hooks 条目示例:

Copy
hooks: AfterInstall: - location: Scripts/RunResourceTests.sh timeout: 180

Scripts/RunResourceTests.sh 脚本将在部署过程的 AfterInstall 阶段运行。如果该脚本的运行时间超过 180 秒(3 分钟),则部署将失败。

本页内容: