

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

# Amazon EC2 操作参考
<a name="action-reference-EC2Deploy"></a>

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

**注意**  
此操作仅支持 Linux 实例类型。支持的最大实例集规模是 500 个实例。

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

**注意**  
此操作仅支持 V2 类型管道。

**Topics**
+ [操作类型](#action-reference-EC2Deploy-type)
+ [配置参数](#action-reference-EC2Deploy-parameters)
+ [输入构件](#action-reference-EC2Deploy-input)
+ [输出构件](#action-reference-EC2Deploy-output)
+ [EC2 部署操作的服务角色策略权限](#action-reference-EC2Deploy-permissions-action)
+ [部署规范文件参考](#action-reference-EC2Deploy-spec-reference)
+ [操作声明](#action-reference-EC2Deploy-example)
+ [带有部署规范示例的操作声明](#action-reference-EC2Deploy-example-spec)
+ [另请参阅](#action-reference-EC2Deploy-links)

## 操作类型
<a name="action-reference-EC2Deploy-type"></a>
+ 类别：`Deploy`
+ 拥有者：`AWS`
+ 提供方：`EC2`
+ 版本：`1`

## 配置参数
<a name="action-reference-EC2Deploy-parameters"></a>

**InstanceTagKey**  
是否必需：是  
您在 Amazon EC2 中创建的实例的标签键，例如 `Name`。

**InstanceTagValue**  
必需：否  
您在 Amazon EC2 中创建的实例的标签值，例如 `my-instances`。  
如果未指定此值，则**InstanceTagKey**将匹配所有带有的实例。

**InstanceType**  
是否必需：是  
在 Amazon EC2 中创建的实例或 SSM 节点的类型。有效值为 `EC2` 和 `SSM_MANAGED_NODE`。  
您必须已经在所有实例上创建、标记并安装了 SSM 代理。  
创建实例时，会创建角色或使用现有的 EC2 实例角色。为避免`Access Denied`错误，您必须向实例角色添加 S3 存储桶权限，以授予实例对 CodePipeline 项目存储桶的权限。创建默认角色或更新现有角色，将 `s3:GetObject` 权限范围缩小到管道所在区域的构件存储桶。

**TargetDirectory**  
必需：是（如果指定了脚本）。  
在 Amazon EC2 实例中用来运行脚本的目录。

**DeploySpec**  
必须：是（如果指定了部署规范）  
用于配置部署、安装和生命周期事件的文件。有关部署规范字段的描述和信息，请参阅[部署规范文件参考](#action-reference-EC2Deploy-spec-reference)。要查看指定了部署规范文件的操作配置，请参阅[带有部署规范示例的操作声明](#action-reference-EC2Deploy-example-spec)中的示例。

**MaxBatch**  
必需：否  
允许同时部署的实例最大数量。

**MaxError**  
必需：否  
部署期间允许的实例错误最大数量。

**TargetGroupNameList**  
必需：否  
要部署的目标组名称列表。您必须已经创建了目标组。  
目标组提供了一组用于处理特定请求的实例。如果指定了目标组，则实例将在部署前从目标组中移除，并在部署后重新添加到目标组。

**PreScript**  
必需：否  
在操作部署阶段之前运行的脚本。

**PostScript**  
是否必需：是  
在操作部署阶段之后运行的脚本。

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

![\[新管道的 “编辑” 操作页面，其中 “部 EC2署” 操作使用操作配置指定\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/ec2deploy-action.png)


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

![\[新管道的 “编辑” 操作页面，其中包含使用规范文件的 “ EC2部署” 操作选项\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/ec2deploy-action-spec.png)


## 输入构件
<a name="action-reference-EC2Deploy-input"></a>
+ **构件数：**`1`
+ **描述：**为支持部署期间的脚本操作而提供的文件（如果有）。

## 输出构件
<a name="action-reference-EC2Deploy-output"></a>
+ **构件数：**`0`
+ **描述：**输出构件不适用于此操作类型。

## EC2 部署操作的服务角色策略权限
<a name="action-reference-EC2Deploy-permissions-action"></a>

 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 组
<a name="action-reference-EC2Deploy-logs"></a>

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

```
/aws/codepipeline/MyPipelineName
```

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

要在控制台中使用操作详细信息对话框页面查看日志，必须在控制台角色中添加查看日志的权限。有关更多信息，请参阅[在控制台中查看计算日志所需的权限](security-iam-permissions-console-logs.md)中的控制台权限策略示例。

### 服务角色策略 CloudWatch 日志权限
<a name="w2aac56c13c21c11"></a>

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

```
/aws/codepipeline/MyPipelineName
```

要在控制台中使用操作详细信息对话框页面查看日志，必须在控制台角色中添加查看日志的权限。有关更多信息，请参阅[在控制台中查看计算日志所需的权限](security-iam-permissions-console-logs.md)中的控制台权限策略示例。

## 部署规范文件参考
<a name="action-reference-EC2Deploy-spec-reference"></a>

 CodePipeline 运行操作时，您可以指定一个规范文件来配置实例的部署。部署规范文件指定要安装的内容以及运行哪些生命周期事件钩子以响应部署生命周期事件。部署规范文件始终采用 YAML 格式。部署规范文件用于：
+ 将应用程序修订中的源文件映射到其在实例上的目的地。
+ 为部署的文件指定自定义权限。
+ 指定要在部署过程的各个阶段在每个实例上运行的脚本。

部署规范文件支持该 AppSpec 文件支持的 CodeDeploy 特定部署配置参数。您可以直接使用现有 AppSpec 文件，任何不支持的参数都将被忽略。有关中该 AppSpec文件的更多信息 CodeDeploy，请参阅《*[CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html)用户指南*》中的 “应用程序规范” 文件参考。

文件部署参数的指定方式如下。
+ `files` - 部署规范文件为部署文件指定 `source:` 和 `destination:`。
+ `scripts` - 部署的脚本事件。支持两个事件：`BeforeDeploy` 和 `AfterDeploy`。
+ `hooks` - 事件的生命周期挂钩。支持以下钩子：`ApplicationStop`、`BeforeInstall`、`AfterInstall`、`ApplicationStart` 和 `ValidateService`。
**注意**  
hooks 参数可用于 AppSpec 兼容， CodeDeploy并且仅在 0.0 版（AppSpec 格式）中可用。对于这种格式， CodePipeline 将尽力对事件进行映射。

规范文件中必须使用正确的 YAML 空间；否则，如果部署规范文件中的位置和空间数量不正确，将发生错误。有关间距的更多信息，请参阅 [YAML](http://www.yaml.org/) 规范。

下方是部署规范文件示例。

```
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
```

要查看指定了部署规范文件的操作配置，请参阅[带有部署规范示例的操作声明](#action-reference-EC2Deploy-example-spec)中的示例。

## 操作声明
<a name="action-reference-EC2Deploy-example"></a>

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

------

## 带有部署规范示例的操作声明
<a name="action-reference-EC2Deploy-example-spec"></a>

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

------

## 另请参阅
<a name="action-reference-EC2Deploy-links"></a>

下列相关资源在您使用此操作的过程中会有所帮助。
+  [教程：使用以下命令部署到 Amazon EC2 实例 CodePipeline](tutorials-ec2-deploy.md)：本教程将引导您创建 EC2 实例，在其中部署脚本文件，并使用 EC2 操作创建管道。
+ [EC2 部署操作失败并显示错误消息“`No such file`”](troubleshooting.md#troubleshooting-ec2-deploy)：本主题描述了针对 EC2 操作中文件未找到错误的故障排除方法。