亚马逊 EC2 操作参考 - Amazon CodePipeline
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

亚马逊 EC2 操作参考

您可以使用 Amazon EC2 EC2 操作将应用程序代码部署到您的部署队列中。您的部署队列可以由 Amazon EC2 Linux 实例或 Linux SSM 托管的节点组成。您的实例必须安装了 SSM 代理。

注意

此操作仅支持 Linux 实例类型。支持的最大队列大小为 500 个实例。

该操作将根据指定的最大实例数选择一定数量的实例。将首先选择先前实例中的失败实例。如果实例已经部署了相同的输入项目,例如之前操作失败的情况,则该操作将跳过在某些实例上的部署。

注意

只有 V2 类型的管道支持此操作。

操作类型

  • 类别:Deploy

  • 拥有者:AWS

  • 提供方:EC2

  • 版本:1

配置参数

InstanceTagKey

必需:是

您在 Amazon 中创建的实例的标签密钥 EC2,例如Name

InstanceTagValue

必需:否

您在 Amazon 中创建的实例的标签值 EC2,例如my-instances

如果未指定此值,则InstanceTagKey将匹配所有带有的实例。

InstanceType

必需:是

在 Amazon EC2 中创建的实例或 SSM 节点的类型。有效值为 EC2SSM_MANAGED_NODE

您必须已经在所有实例上创建、标记并安装了 SSM 代理。

注意

创建实例时,即创建或使用现有的 EC2实例角色。为避免Access Denied错误,您必须向实例角色添加 S3 存储桶权限,以授予实例对 CodePipeline 项目存储桶的权限。创建默认角色或更新现有角色,其s3:GetObject权限范围仅限于管道区域的工件存储桶。

TargetDirectory

必需:是(如果指定了脚本)

您的 Amazon EC2 实例上用于运行脚本的目录。

DeploySpec

必需:是(如果指定了部署规范)

用于配置部署、安装和生命周期事件的文件。有关部署规格字段的描述和信息,请参阅部署规范文件参考。要查看指定了部署规范文件的操作配置,请参阅中的示例带有 Deploy 规范示例的操作声明

MaxBatch

必需:否

允许并行部署的最大实例数。

MaxError

必需:否

部署期间允许的最大实例错误数。

TargetGroupNameList

必需:否

要部署的目标组名称列表。您必须已经创建了目标群体。

目标组提供了一组用于处理特定请求的实例。如果指定了目标组,则实例将在部署前从目标组中移除,并在部署后重新添加到目标组。

PreScript

必需:否

要在动作 “部署” 阶段之前运行的脚本。

PostScript

必需:是

要在动作 “部署” 阶段之后运行的脚本。

下图显示了选择使用操作配置的操作的 “编辑” 页面示例。

新管道的 “编辑” 操作页面,其中 “部 EC2署” 操作使用操作配置指定

下图显示了选择 “使用 DeploySpec 文件” 的操作的 “编辑” 页面示例。

新管道的 “编辑” 操作页面,其中包含使用规范文件的 “ EC2部署” 操作选项

输入构件

  • 构件数:1

  • 描述:为支持部署期间的脚本操作而提供的文件(如果有)。

输出构件

  • 构件数:0

  • 描述:输出构件不适用于此操作类型。

EC2 部署操作的服务角色策略权限

CodePipeline 运行操作时, CodePipeline 服务角色需要以下权限,这些权限已适当缩小范围,便于具有最低权限的访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "StatementWithAllResource", "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "elasticloadbalancing:DescribeTargetGroupAttributes", "elasticloadbalancing:DescribeTargetGroups", "elasticloadbalancing:DescribeTargetHealth", "ssm:CancelCommand", "ssm:DescribeInstanceInformation", "ssm:ListCommandInvocations" ], "Resource": [ "*" ] }, { "Sid": "StatementForLogs", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:{{region}}:{{AccountId}}:log-group:/aws/codepipeline/{{pipelineName}}:*" ] }, { "Sid": "StatementForElasticloadbalancing", "Effect": "Allow", "Action": [ "elasticloadbalancing:DeregisterTargets", "elasticloadbalancing:RegisterTargets" ], "Resource": [ "arn:aws:elasticloadbalancing:{{region}}:{{AccountId}}:targetgroup/[[targetGroupName]]/*" ] }, { "Sid": "StatementForSsmOnTaggedInstances", "Effect": "Allow", "Action": [ "ssm:SendCommand" ], "Resource": [ "arn:aws:ec2:{{region}}:{{AccountId}}:instance/*" ], "Condition": { "StringEquals": { "aws:ResourceTag/{{tagKey}}": "{{tagValue}}" } } }, { "Sid": "StatementForSsmApprovedDocuments", "Effect": "Allow", "Action": [ "ssm:SendCommand" ], "Resource": [ "arn:aws:ssm:{{region}}::document/AWS-RunPowerShellScript", "arn:aws:ssm:{{region}}::document/AWS-RunShellScript" ] } ] }

在日志中记录管道的 CloudWatch 组

CodePipeline 运行操作时,使用管道名称 CodePipeline 创建日志组,如下所示。这样就可以使用管道名称缩小日志资源的权限范围。

/aws/codepipeline/MyPipelineName

上述服务角色更新中包含以下日志记录权限。

  • 日志:CreateLogGroup

  • 日志:CreateLogStream

  • 日志:PutLogEvents

要在控制台中使用操作详细信息对话框页面查看日志,必须在控制台角色中添加查看日志的权限。有关更多信息,请参阅在 CodePipeline 控制台中查看计算日志所需的权限中的控制台权限策略示例。

服务角色策略 CloudWatch 日志权限

CodePipeline 运行操作时,使用管道名称 CodePipeline 创建日志组,如下所示。这样就可以使用管道名称缩小日志资源的权限范围。

/aws/codepipeline/MyPipelineName

要在控制台中使用操作详细信息对话框页面查看日志,必须在控制台角色中添加查看日志的权限。有关更多信息,请参阅在 CodePipeline 控制台中查看计算日志所需的权限中的控制台权限策略示例。

部署规范文件参考

CodePipeline 运行操作时,您可以指定一个规范文件来配置实例的部署。部署规范文件指定要安装的内容以及运行哪些生命周期事件挂钩以响应部署生命周期事件。部署规范文件始终采用 YAML 格式。部署规范文件用于:

  • 将应用程序修订中的源文件映射到其在实例上的目的地。

  • 为部署的文件指定自定义权限。

  • 指定要在部署过程的各个阶段在每个实例上运行的脚本。

部署规范文件支持该 AppSpec 文件支持的 CodeDeploy 特定部署配置参数。您可以直接使用现有 AppSpec 文件,任何不支持的参数都将被忽略。有关中该 AppSpec文件的更多信息 CodeDeploy,请参阅《CodeDeploy用户指南》中的 “应用程序规范” 文件参考。

文件部署参数的指定如下。

  • files-部署规范文件destination:为部署文件指定source:和。

  • scripts-部署的脚本事件。支持两个事件:BeforeDeployAfterDeploy

  • hooks-事件的生命周期挂钩。支持以下挂钩:ApplicationStopBeforeInstallAfterInstallApplicationStart、和ValidateService

    注意

    hooks 参数可用于 AppSpec 兼容, CodeDeploy并且仅在 0.0 版(AppSpec 格式)中可用。对于这种格式, CodePipeline 将尽力对事件进行映射。

规范文件中必须使用正确的 YAML 间距;否则,如果部署规范文件中的位置和空格数量不正确,则会引发错误。有关间距的更多信息,请参阅 YAML 规范。

部署规范文件示例如下。

version: 0.1 files: - source: /index.html destination: /var/www/html/ scripts: BeforeDeploy: - location: scripts/install_dependencies timeout: 300 runas: myuser AfterDeploy: - location: scripts/start_server timeout: 300 runas: myuser

要查看指定了部署规范文件的操作配置,请参阅中的示例带有 Deploy 规范示例的操作声明

操作声明

YAML
name: DeployEC2 actions: - name: EC2 actionTypeId: category: Deploy owner: AWS provider: EC2 version: '1' runOrder: 1 configuration: InstanceTagKey: Name InstanceTagValue: my-instances InstanceType: EC2 PostScript: "test/script.sh", TargetDirectory: "/home/ec2-user/deploy" outputArtifacts: [] inputArtifacts: - name: SourceArtifact region: us-east-1
JSON
{ "name": "DeployEC2", "actions": [ { "name": "EC2Deploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "provider": "EC2", "version": "1" }, "runOrder": 1, "configuration": { "InstanceTagKey": "Name", "InstanceTagValue": "my-instances", "InstanceType": "EC2", "PostScript": "test/script.sh", "TargetDirectory": "/home/ec2-user/deploy" }, "outputArtifacts": [], "inputArtifacts": [ { "name": "SourceArtifact" } ], "region": "us-east-1" } ] },

带有 Deploy 规范示例的操作声明

YAML
name: DeployEC2 actions: - name: EC2 actionTypeId: category: Deploy owner: AWS provider: EC2 version: '1' runOrder: 1 configuration: DeploySpec: "deployspec.yaml" InstanceTagKey: Name InstanceTagValue: my-instances InstanceType: EC2 outputArtifacts: [] inputArtifacts: - name: SourceArtifact region: us-east-1
JSON
{ "name": "DeployEC2", "actions": [ { "name": "EC2Deploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "provider": "EC2", "version": "1" }, "runOrder": 1, "configuration": { "DeploySpec": "deployspec.yaml", "InstanceTagKey": "Name", "InstanceTagValue": "my-instances", "InstanceType": "EC2" }, "outputArtifacts": [], "inputArtifacts": [ { "name": "SourceArtifact" } ], "region": "us-east-1" } ] },

下列相关资源在您使用此操作的过程中会有所帮助。