AppSpec 文件示例 - Amazon CodeDeploy
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

AppSpec 文件示例

此主题 AppSpec 用于AmazonLambda 和 EC2/ 本地部署。

Amazon ECS 部署 AppSpec 文件示例

下面是使用 YAML 编写的、用于部署 Amazon ECS 服务的 AppSpec 文件的示例。

version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition: "arn:aws:ecs:us-east-1:111222333444:task-definition/my-task-definition-family-name:1" LoadBalancerInfo: ContainerName: "SampleApplicationName" ContainerPort: 80 # Optional properties PlatformVersion: "LATEST" NetworkConfiguration: AwsvpcConfiguration: Subnets: ["subnet-1234abcd","subnet-5678abcd"] SecurityGroups: ["sg-12345678"] AssignPublicIp: "ENABLED" CapacityProviderStrategy: - Base: 1 CapacityProvider: "FARGATE_SPOT" Weight: 2 - Base: 0 CapacityProvider: "FARGATE" Weight: 1 Hooks: - BeforeInstall: "LambdaFunctionToValidateBeforeInstall" - AfterInstall: "LambdaFunctionToValidateAfterInstall" - AfterAllowTestTraffic: "LambdaFunctionToValidateAfterTestTrafficStarts" - BeforeAllowTraffic: "LambdaFunctionToValidateBeforeAllowingProductionTraffic" - AfterAllowTraffic: "LambdaFunctionToValidateAfterAllowingProductionTraffic"

下面是用 JSON 编写的上述示例的版本。

{ "version": 0.0, "Resources": [ { "TargetService": { "Type": "AWS::ECS::Service", "Properties": { "TaskDefinition": "arn:aws:ecs:us-east-1:111222333444:task-definition/my-task-definition-family-name:1", "LoadBalancerInfo": { "ContainerName": "SampleApplicationName", "ContainerPort": 80 }, "PlatformVersion": "LATEST", "NetworkConfiguration": { "AwsvpcConfiguration": { "Subnets": [ "subnet-1234abcd", "subnet-5678abcd" ], "SecurityGroups": [ "sg-12345678" ], "AssignPublicIp": "ENABLED" } }, "CapacityProviderStrategy": [ { "Base" : 1, "CapacityProvider" : "FARGATE_SPOT", "Weight" : 2 }, { "Base" : 0, "CapacityProvider" : "FARGATE", "Weight" : 1 } ] } } } ], "Hooks": [ { "BeforeInstall": "LambdaFunctionToValidateBeforeInstall" }, { "AfterInstall": "LambdaFunctionToValidateAfterInstall" }, { "AfterAllowTestTraffic": "LambdaFunctionToValidateAfterTestTrafficStarts" }, { "BeforeAllowTraffic": "LambdaFunctionToValidateBeforeAllowingProductionTraffic" }, { "AfterAllowTraffic": "LambdaFunctionToValidateAfterAllowingProductionTraffic" } ] }

下面是部署期间的事件序列:

  1. 在更换任务集上安装更新的 Amazon ECS 应用程序之前,名为的 Lambda 函数。LambdaFunctionToValidateBeforeInstall运行。

  2. 在替换任务集上安装更新的 Amazon ECS 应用程序之后,但在该应用程 Lambda 接收任何流量之前,名为LambdaFunctionToValidateAfterInstall运行。

  3. 替换任务集上的 Amazon ECS 应用程序开始接收来自测试侦听器的流量后,名为的 Lambda 函数。LambdaFunctionToValidateAfterTestTrafficStarts运行。此函数可能会运行验证测试以确定部署是否继续。如果未在部署组中指定测试侦听器,则会忽略此挂钩。

  4. AfterAllowTestTraffic挂钩,并且在将生产流量提供给更新的 Amazon ECS 应用程序之前,名为的 Lambda 函数。LambdaFunctionToValidateBeforeAllowingProductionTraffic运行。

  5. 生产流量在更换任务集上提供给更新的 Amazon ECS 应用程序后,名为的 Lambda 函数。LambdaFunctionToValidateAfterAllowingProductionTraffic运行。

在任何挂钩期间运行的 Lambda 函数都可以执行验证测试或者收集流量指标。

AppSpec 文件示例AmazonLambda 部署

下面是使用 YAML 编写的、用于部署 Lambda 函数版本的 AppSpec 文件的示例。

version: 0.0 Resources: - myLambdaFunction: Type: AWS::Lambda::Function Properties: Name: "myLambdaFunction" Alias: "myLambdaFunctionAlias" CurrentVersion: "1" TargetVersion: "2" Hooks: - BeforeAllowTraffic: "LambdaFunctionToValidateBeforeTrafficShift" - AfterAllowTraffic: "LambdaFunctionToValidateAfterTrafficShift"

下面是用 JSON 编写的上述示例的版本。

{ "version": 0.0, "Resources": [{ "myLambdaFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Name": "myLambdaFunction", "Alias": "myLambdaFunctionAlias", "CurrentVersion": "1", "TargetVersion": "2" } } }], "Hooks": [{ "BeforeAllowTraffic": "LambdaFunctionToValidateBeforeTrafficShift" }, { "AfterAllowTraffic": "LambdaFunctionToValidateAfterTrafficShift" } ] }

下面是部署期间的事件序列:

  1. 在从 Lambda 为myLambdaFunction到版本 2,运 Lambda 个名为LambdaFunctionToValidateBeforeTrafficShift,验证部署是否准备好开始流量转移。

  2. 如果 LambdaFunctionToValidateBeforeTrafficShift 返回了退出代码 0 (成功),则开始将流量转移到 myLambdaFunction 的版本 2。此部署的部署配置确定流量转移的速率。

  3. 在将流量从 Lambda 为myLambdaFunction到版本 2 已完成,请运行一个名为LambdaFunctionToValidateAfterTrafficShift验证部署已成功完成。

EC2/本地部署的AppSpec 文件示例

下面是对 Amazon Linux、Ubuntu 服务器或 RHEL 实例进行就地部署的 AppSpec 文件示例。

注意

部署到 Windows 服务器实例不支持runas元素。如果要部署到 Windows 服务器实例,请不要将其包含在您的 AppSpec 文件中。

version: 0.0 os: linux files: - source: Config/config.txt destination: /webapps/Config - source: source destination: /webapps/myApp hooks: BeforeInstall: - location: Scripts/UnzipResourceBundle.sh - location: Scripts/UnzipDataBundle.sh AfterInstall: - location: Scripts/RunResourceTests.sh timeout: 180 ApplicationStart: - location: Scripts/RunFunctionalTests.sh timeout: 3600 ValidateService: - location: Scripts/MonitorService.sh timeout: 3600 runas: codedeployuser

对于 Windows Server 实例,更改os: linuxos: windows。另外,您还必须完全限定 destination 路径(例如 c:\temp\webapps\Configc:\temp\webapps\myApp)。不包括 runas 元素。

下面是部署期间的事件序列:

  1. 运行位于 Scripts/UnzipResourceBundle.sh 的脚本。

  2. 如果前面的脚本返回了退出代码 0(成功),则运行位于 Scripts/UnzipDataBundle.sh 中的脚本。

  3. 将文件从 Config/config.txt 路径复制到 /webapps/Config/config.txt 路径中。

  4. 以递归方式将 source 目录中的所有文件复制到 /webapps/myApp 目录中。

  5. 运行位于 Scripts/RunResourceTests.sh 中的脚本,超时时间为 180 秒(3 分钟)。

  6. 运行位于 Scripts/RunFunctionalTests.sh 中的脚本,超时时间为 3600 秒(1 小时)。

  7. Scripts/MonitorService.sh 用户身份运行位于 codedeploy 中的脚本,超时时间为 3600 秒(1 小时)。