Amazon EC2 操作参考 - AWS CodePipeline

Amazon 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

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

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

MaxBatch

必需:否

允许同时部署的实例最大数量。

MaxError

必需:否

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

TargetGroupNameList

必需:否

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

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

PreScript

必需:否

在操作部署阶段之前运行的脚本。

PostScript

必需:是

在操作部署阶段之后运行的脚本。

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

新管道的编辑操作页面,其中已使用操作配置指定了 EC2Deploy 操作。

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

新管道的编辑操作页面,其中显示使用规范文件的 EC2Deploy 操作选项

输入构件

  • 构件数:1

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

输出构件

  • 构件数:0

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

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

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

JSON
{ "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:us-east-1:111122223333:log-group:/aws/codepipeline/{{pipelineName}}:*" ] }, { "Sid": "StatementForElasticloadbalancing", "Effect": "Allow", "Action": [ "elasticloadbalancing:DeregisterTargets", "elasticloadbalancing:RegisterTargets" ], "Resource": [ "arn:aws:elasticloadbalancing:us-east-1:111122223333:targetgroup/[[targetGroupName]]/*" ] }, { "Sid": "StatementForSsmOnTaggedInstances", "Effect": "Allow", "Action": [ "ssm:SendCommand" ], "Resource": [ "arn:aws:ec2:us-east-1:111122223333:instance/*" ], "Condition": { "StringEquals": { "aws:ResourceTag/{{tagKey}}": "{{tagValue}}" } } }, { "Sid": "StatementForSsmApprovedDocuments", "Effect": "Allow", "Action": [ "ssm:SendCommand" ], "Resource": [ "arn:aws:ssm:us-east-1::document/AWS-RunPowerShellScript", "arn:aws:ssm:us-east-1::document/AWS-RunShellScript" ] } ] }

CloudWatch Logs 中的管道日志组

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

/aws/codepipeline/MyPipelineName

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

  • logs:CreateLogGroup

  • logs:CreateLogStream

  • logs:PutLogEvents

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

CloudWatch Logs 的服务角色策略权限

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

/aws/codepipeline/MyPipelineName

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

部署规范文件参考

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

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

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

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

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

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

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

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

  • hooks - 事件的生命周期挂钩。支持以下钩子:ApplicationStopBeforeInstallAfterInstallApplicationStartValidateService

    注意

    钩子参数用于实现 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

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

操作声明

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" } ] },

带有部署规范示例的操作声明

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" } ] },

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