

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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)
+ [Input artifacts (輸入成品)](#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**  
必要：是  
動作部署階段之後要執行的指令碼。

下圖顯示選取**使用動作組態之動作**的**編輯**頁面範例。

![\[使用動作組態指定 EC2Deploy 動作之新管道的編輯動作頁面\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ec2deploy-action.png)


下圖顯示選取**使用 DeploySpec 檔案**之動作的**編輯**頁面範例。

![\[使用 EC2Deploy 動作選項來使用規格檔案之新管道的編輯動作頁面\]](http://docs.aws.amazon.com/zh_tw/codepipeline/latest/userguide/images/ec2deploy-action-spec.png)


## Input artifacts (輸入成品)
<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
```

下列記錄許可包含在上述服務角色的更新中。
+ logs:CreateLogGroup
+ logs:CreateLogStream
+ logs: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 格式。部署規格檔案用於：
+ 將應用程式修訂中的來源檔案，映射至執行個體上的目標。
+ 指定已部署檔案的自訂許可。
+ 指定在部署程序各階段在每個執行個體上執行的指令碼。

部署規格檔案支援 CodeDeploy 使用 AppSpec 檔案支援的特定部署組態參數。您可以直接使用現有的 AppSpec 檔案，並忽略任何不支援的參數。如需 CodeDeploy 中 AppSpec 檔案的詳細資訊，請參閱 *[CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html) 使用者指南*中的應用程式規格檔案參考。

檔案部署參數指定如下。
+ `files` - 部署規格檔案會`destination:`為部署檔案指定 `source:`和 。
+ `scripts` - 部署的指令碼事件。支援兩個事件： `BeforeDeploy`和 `AfterDeploy`。
+ `hooks` - 事件的生命週期關聯。支援下列掛鉤：`ApplicationStop`、`BeforeInstall`、`ApplicationStart`、 `AfterInstall`和 `ValidateService`。
**注意**  
勾點參數適用於 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>

以下相關資源可協助您使用此動作。
+  [教學課程：使用 CodePipeline 部署至 Amazon EC2 執行個體](tutorials-ec2-deploy.md) – 本教學課程會逐步引導您建立 EC2 執行個體，您將在其中部署指令碼檔案，以及使用 EC2 動作建立管道。
+ [EC2 部署動作失敗並顯示錯誤訊息 `No such file`](troubleshooting.md#troubleshooting-ec2-deploy) – 本主題說明使用 EC2 動作對找不到錯誤的檔案進行故障診斷。