

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

# AppSpec 'hooks' 區段
<a name="reference-appspec-file-structure-hooks"></a>

AppSpec 檔案 `'hooks'`區段中的內容會根據您部署的運算平台而有所不同。EC2/現場部署的 `'hooks'`區段包含將部署生命週期事件掛鉤連結至一或多個指令碼的映射。Lambda 或 Amazon ECS 部署的 `'hooks'`區段指定要在部署生命週期事件期間執行的 Lambda 驗證函數。如果事件勾點不存在，則不會為該事件執行任何操作。只有在您執行指令碼或 Lambda 驗證函數做為部署的一部分時，才需要本節。

**Topics**
+ [Amazon ECS 部署的 AppSpec 'hooks' 區段](#appspec-hooks-ecs)
+ [AWS Lambda 部署的 AppSpec 'hooks' 區段](#appspec-hooks-lambda)
+ [EC2/現場部署的 AppSpec 'hooks' 區段](#appspec-hooks-server)

## Amazon ECS 部署的 AppSpec 'hooks' 區段
<a name="appspec-hooks-ecs"></a>

**Topics**
+ [Amazon ECS 部署的生命週期事件掛鉤清單](#reference-appspec-file-structure-hooks-list-ecs)
+ [在 Amazon ECS 部署中執行掛鉤順序。](#reference-appspec-file-structure-hooks-run-order-ecs)
+ [「勾點」區段的結構](#reference-appspec-file-structure-hooks-section-structure-ecs)
+ [Lambda 'hooks' 函數範例](#reference-appspec-file-structure-hooks-section-structure-ecs-sample-function)

### Amazon ECS 部署的生命週期事件掛鉤清單
<a name="reference-appspec-file-structure-hooks-list-ecs"></a>

 AWS Lambda 勾點是 Lambda 函數，指定的字串位於生命週期事件名稱之後的新行上。每個部署執行每個勾點一次。以下是生命週期事件的說明，您可以在其中在 Amazon ECS 部署期間執行掛鉤。
+  `BeforeInstall` – 用來在建立替代任務集之前執行任務。單一目標群組與原始任務設定相關。如果指定了選用測試接聽程式，則和原始任務設定相關。目前無法轉返。
+  `AfterInstall` – 在建立替代任務集，且其中一個目標群組與其相關聯之後，使用 來執行任務。如果指定了選用測試接聽程式，則和原始任務設定相關。此生命週期事件上的勾點函數結果可以觸發轉返。
+  `AfterAllowTestTraffic` – 在測試接聽程式將流量提供給替代任務集之後，使用 來執行任務。目前的勾點函數結果可以觸發轉返。
+  `BeforeAllowTraffic` – 在第二個目標群組與替代任務集相關聯之後，但在流量轉移到替代任務集之前，使用 來執行任務。此生命週期事件上的勾點函數結果可以觸發轉返。
+  `AfterAllowTraffic` – 在第二個目標群組將流量提供給替代任務集之後，使用 來執行任務。此生命週期事件上的勾點函數結果可以觸發轉返。

如需詳細資訊，請參閱[Amazon ECS 部署期間會發生什麼情況](deployment-steps-ecs.md#deployment-steps-what-happens)及[教學課程：使用驗證測試部署 Amazon ECS 服務](tutorial-ecs-deployment-with-hooks.md)。

### 在 Amazon ECS 部署中執行掛鉤順序。
<a name="reference-appspec-file-structure-hooks-run-order-ecs"></a>

在 Amazon ECS 部署中，事件掛鉤會以下列順序執行：

![\[Amazon ECS 部署中的事件掛鉤順序。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lifecycle-event-order-ecs.png)


**注意**  
部署中的 **Start**、**Install**、**TestTraffic**、​**AllowTraffic** 和 **End** 事件，無法以指令碼方式處理，這就是它們在本圖表中呈現灰色的原因。

### 「勾點」區段的結構
<a name="reference-appspec-file-structure-hooks-section-structure-ecs"></a>

下列為 `'hooks'` 部分的結構範例。

使用 YAML：

```
Hooks:
  - BeforeInstall: "BeforeInstallHookFunctionName"
  - AfterInstall: "AfterInstallHookFunctionName"
  - AfterAllowTestTraffic: "AfterAllowTestTrafficHookFunctionName"
  - BeforeAllowTraffic: "BeforeAllowTrafficHookFunctionName"
  - AfterAllowTraffic: "AfterAllowTrafficHookFunctionName"
```

使用 JSON：

```
"Hooks": [
		{
			"BeforeInstall": "BeforeInstallHookFunctionName"
		},
		{
			"AfterInstall": "AfterInstallHookFunctionName"
		},
		{
			"AfterAllowTestTraffic": "AfterAllowTestTrafficHookFunctionName"
		},
		{
			"BeforeAllowTraffic": "BeforeAllowTrafficHookFunctionName"
		},
		{
			"AfterAllowTraffic": "AfterAllowTrafficHookFunctionName"
		}
	]
}
```

### Lambda 'hooks' 函數範例
<a name="reference-appspec-file-structure-hooks-section-structure-ecs-sample-function"></a>

使用 `'hooks'`區段指定 CodeDeploy 可以呼叫的 Lambda 函數，以驗證 Amazon ECS 部署。您可以針對 `BeforeInstall`、`AfterInstall`、`BeforeAllowTraffic`、 `AfterAllowTestTraffic`和 `AfterAllowTraffic` 部署生命週期事件使用相同的函數或不同的函數。完成驗證測試後，Lambda `AfterAllowTraffic` 函數會回呼 CodeDeploy，並傳送 `Succeeded` 或 `Failed` 的結果。

**重要**  
如果 Lambda 驗證函數在一小時內未通知 CodeDeploy，則部署會被視為失敗。

 叫用 Lambda 勾點函數之前，必須使用 `putLifecycleEventHookExecutionStatus`命令通知伺服器部署 ID 和生命週期事件勾點執行 ID。

 以下是以 Node.js 編寫的範例 Lambda 勾點函數。

```
'use strict';

const aws = require('aws-sdk');
const codedeploy = new aws.CodeDeploy({apiVersion: '2014-10-06'});

exports.handler = (event, context, callback) => {
    //Read the DeploymentId from the event payload.
    var deploymentId = event.DeploymentId;

    //Read the LifecycleEventHookExecutionId from the event payload
    var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;

    /*
     Enter validation tests here.
    */

    // Prepare the validation test results with the deploymentId and
    // the lifecycleEventHookExecutionId for CodeDeploy.
    var params = {
        deploymentId: deploymentId,
        lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
        status: 'Succeeded' // status can be 'Succeeded' or 'Failed'
    };
    
    // Pass CodeDeploy the prepared validation test results.
    codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
        if (err) {
            // Validation failed.
            callback('Validation test failed');
        } else {
            // Validation succeeded.
            callback(null, 'Validation test succeeded');
        }
    });
};
```

## AWS Lambda 部署的 AppSpec 'hooks' 區段
<a name="appspec-hooks-lambda"></a>

**Topics**
+ [AWS Lambda 部署的生命週期事件掛鉤清單](#reference-appspec-file-structure-hooks-list-lambda)
+ [在 Lambda 函數版本部署中執行掛鉤順序](#reference-appspec-file-structure-hooks-run-order-lambda)
+ [「勾點」區段的結構](#reference-appspec-file-structure-hooks-section-structure-lambda)
+ [Lambda 'hooks' 函數範例](#reference-appspec-file-structure-hooks-section-structure-lambda-sample-function)

### AWS Lambda 部署的生命週期事件掛鉤清單
<a name="reference-appspec-file-structure-hooks-list-lambda"></a>

 AWS Lambda 勾點是 Lambda 函數，指定的字串位於生命週期事件名稱之後的新行上。每個部署執行每個勾點一次。以下是可用於 AppSpec 檔案之勾點的描述。
+ **BeforeAllowTraffic** – 在流量轉移到已部署的 Lambda 函數版本之前，使用 執行任務。
+ **AfterAllowTraffic** – 用於在所有流量轉移到已部署的 Lambda 函數版本後執行任務。

### 在 Lambda 函數版本部署中執行掛鉤順序
<a name="reference-appspec-file-structure-hooks-run-order-lambda"></a>

在無伺服器 Lambda 函數版本部署中，事件掛鉤會以下列順序執行：

![\[Lambda 部署中的事件掛鉤順序。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lifecycle-event-order-lambda.png)


**注意**  
部署中的 **Start**、**AllowTraffic** 和 **End** 事件無法以指令碼處理，這就是它們在本圖表中呈現灰色的原因。

### 「勾點」區段的結構
<a name="reference-appspec-file-structure-hooks-section-structure-lambda"></a>

下列為 'hooks' 部分的結構範例。

使用 YAML：

```
hooks:
   - BeforeAllowTraffic: BeforeAllowTrafficHookFunctionName
   - AfterAllowTraffic: AfterAllowTrafficHookFunctionName
```

使用 JSON：

```
"hooks": [{
    "BeforeAllowTraffic": "BeforeAllowTrafficHookFunctionName"
    },
    {
    "AfterAllowTraffic": "AfterAllowTrafficHookFunctionName"
}]
```

### Lambda 'hooks' 函數範例
<a name="reference-appspec-file-structure-hooks-section-structure-lambda-sample-function"></a>

使用 'hooks' 區段指定 CodeDeploy 可以呼叫的 Lambda 函數，以驗證 Lambda 部署。您可以針對 `BeforeAllowTraffic`和 `AfterAllowTraffic` 部署生命週期事件使用相同的函數或不同的函數。驗證測試完成後，Lambda 驗證函數會回呼 CodeDeploy 並交付 `Succeeded`或 的結果`Failed`。

**重要**  
如果 Lambda 驗證函數在一小時內未通知 CodeDeploy，則部署會被視為失敗。

 叫用 Lambda 勾點函數之前，必須使用 `putLifecycleEventHookExecutionStatus`命令通知伺服器部署 ID 和生命週期事件勾點執行 ID。

 以下是以 Node.js 編寫的範例 Lambda 勾點函數。

```
'use strict';

const aws = require('aws-sdk');
const codedeploy = new aws.CodeDeploy({apiVersion: '2014-10-06'});

exports.handler = (event, context, callback) => {
    //Read the DeploymentId from the event payload.
    var deploymentId = event.DeploymentId;

    //Read the LifecycleEventHookExecutionId from the event payload
    var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;

    /*
     Enter validation tests here.
    */

    // Prepare the validation test results with the deploymentId and
    // the lifecycleEventHookExecutionId for CodeDeploy.
    var params = {
        deploymentId: deploymentId,
        lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
        status: 'Succeeded' // status can be 'Succeeded' or 'Failed'
    };
    
    // Pass CodeDeploy the prepared validation test results.
    codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
        if (err) {
            // Validation failed.
            callback('Validation test failed');
        } else {
            // Validation succeeded.
            callback(null, 'Validation test succeeded');
        }
    });
};
```

## EC2/現場部署的 AppSpec 'hooks' 區段
<a name="appspec-hooks-server"></a>

**Topics**
+ [生命週期事件掛鉤的清單](#reference-appspec-file-structure-hooks-list)
+ [生命週期事件掛鉤可用性](#reference-appspec-file-structure-hooks-availability)
+ [部署中掛鉤的執行順序](#reference-appspec-file-structure-hooks-run-order)
+ [「勾點」區段的結構](#reference-appspec-file-structure-hooks-section-structure)
+ [參考掛鉤指令碼中的檔案](#codedeploy-agent-working-directory)
+ [勾點的環境變數可用性](#reference-appspec-file-structure-environment-variable-availability)
+ [勾點範例](#reference-appspec-file-structure-hooks-example)

### 生命週期事件掛鉤的清單
<a name="reference-appspec-file-structure-hooks-list"></a>

EC2/現場部署掛鉤會在每次部署至執行個體時執行一次。您可以指定一或多個指令碼以在勾點中執行。生命週期事件的每個勾點是在不同行上以字串指定。以下是可用於 AppSpec 檔案之勾點的描述。

如需有關哪些生命週期事件勾點對於哪些部署和復原類型有效的詳細資訊，請參閱[生命週期事件掛鉤可用性](#reference-appspec-file-structure-hooks-availability)。
+ `ApplicationStop` – 即使在下載應用程式修訂版之前，也會發生此部署生命週期事件。在準備部署時，您可以指定這個事件的指令碼從容地停止應用程式，或移除目前已安裝的套件。用於此部署生命週期事件的 AppSpec 檔案和指令碼來自先前成功部署的應用程式修訂版。
**注意**  
在部署到執行個體之前，執行個體上不存在 AppSpec 檔案。因此，`ApplicationStop` 勾點不會在您第一次部署到執行個體時執行。您可以在第二次部署到執行個體時使用 `ApplicationStop` 勾點。

   為了判斷上次成功部署應用程式修訂版的位置，CodeDeploy 代理程式會查詢 `deployment-group-id_last_successful_install` 檔案中列出的位置。此檔案位於：

   `/opt/codedeploy-agent/deployment-root/deployment-instructions` Amazon Linux、Ubuntu Server 和 RHEL Amazon EC2 執行個體上的 資料夾。

  `C:\ProgramData\Amazon\CodeDeploy\deployment-instructions` Windows Server Amazon EC2 執行個體上的 資料夾。

  若要排除部署在 `ApplicationStop` 部署生命週期事件期間失敗的問題，請參閱[故障診斷失敗的 ApplicationStop、 BeforeBlockTraffic 或 AfterBlockTraffic 部署生命週期事件](troubleshooting-deployments.md#troubleshooting-deployments-lifecycle-event-failures)。
+ `DownloadBundle` – 在此部署生命週期事件期間，CodeDeploy 代理程式會將應用程式修訂檔案複製到暫時位置：

  `/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive` Amazon Linux、Ubuntu Server 和 RHEL Amazon EC2 執行個體上的 資料夾。

  `C:\ProgramData\Amazon\CodeDeploy\deployment-group-id\deployment-id\deployment-archive` Windows Server Amazon EC2 執行個體上的 資料夾。

  此事件保留給 CodeDeploy 代理程式，無法用於執行指令碼。

  若要排除部署在 `DownloadBundle` 部署生命週期事件期間失敗的問題，請參閱[故障診斷錯誤訊息為「UnknownError：未開啟讀取」的已失敗 DownloadBundle 部署生命週期事件](troubleshooting-deployments.md#troubleshooting-deployments-downloadbundle)。
+ `BeforeInstall` – 您可以使用此部署生命週期事件來預先安裝任務，例如解密檔案和建立目前版本的備份。
+ `Install` – 在此部署生命週期事件期間，CodeDeploy 代理程式會將修訂檔案從暫時位置複製到最終目的地資料夾。此事件保留給 CodeDeploy 代理程式，無法用於執行指令碼。
+ `AfterInstall` – 您可以將此部署生命週期事件用於設定應用程式或變更檔案許可等任務。
+ `ApplicationStart` – 您通常會使用此部署生命週期事件來重新啟動在 期間停止的服務`ApplicationStop`。
+ `ValidateService` – 這是最後一個部署生命週期事件。這用於驗證部署已順利完成。
+ `BeforeBlockTraffic` – 在從負載平衡器取消註冊執行個體之前，您可以使用此部署生命週期事件在執行個體上執行任務。

  若要排除部署在 `BeforeBlockTraffic` 部署生命週期事件期間失敗的問題，請參閱[故障診斷失敗的 ApplicationStop、 BeforeBlockTraffic 或 AfterBlockTraffic 部署生命週期事件](troubleshooting-deployments.md#troubleshooting-deployments-lifecycle-event-failures)。
+ `BlockTraffic` – 在此部署生命週期事件期間，網際網路流量會遭到封鎖，無法存取目前正在服務流量的執行個體。此事件保留給 CodeDeploy 代理程式，無法用於執行指令碼。
+ `AfterBlockTraffic` – 在從個別負載平衡器取消註冊執行個體之後，您可以使用此部署生命週期事件在執行個體上執行任務。

  若要排除部署在 `AfterBlockTraffic` 部署生命週期事件期間失敗的問題，請參閱[故障診斷失敗的 ApplicationStop、 BeforeBlockTraffic 或 AfterBlockTraffic 部署生命週期事件](troubleshooting-deployments.md#troubleshooting-deployments-lifecycle-event-failures)。
+ `BeforeAllowTraffic` – 您可以在執行個體註冊負載平衡器之前，使用此部署生命週期事件在執行個體上執行任務。
+ `AllowTraffic` – 在此部署生命週期事件期間，允許網際網路流量在部署之後存取執行個體。此事件保留給 CodeDeploy 代理程式，無法用於執行指令碼。
+ `AfterAllowTraffic` – 在執行個體向負載平衡器註冊之後，您可以使用此部署生命週期事件在執行個體上執行任務。

### 生命週期事件掛鉤可用性
<a name="reference-appspec-file-structure-hooks-availability"></a>

下表列出生命週期事件勾點可用於每一個部署及復原案例。


| 生命週期事件名稱 | Auto Scaling 啟動部署1 | Auto Scaling 終止部署1 | 就地部署2 | 藍/綠部署：原始執行個體 | 藍/綠部署：取代執行個體 | 藍/綠部署復原：原始執行個體 | 藍/綠部署復原：取代執行個體 | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
| ApplicationStop | ✓ | ✓ | ✓ |  | ✓ |  |  | 
| DownloadBundle3 | ✓ |  | ✓ |  | ✓ |  |  | 
| BeforeInstall | ✓ |  | ✓ |  | ✓ |  |  | 
| Install3 | ✓ |  | ✓ |  | ✓ |  |  | 
| AfterInstall | ✓ |  | ✓ |  | ✓ |  |  | 
| ApplicationStart | ✓ |  | ✓ |  | ✓ |  |  | 
| ValidateService | ✓ |  | ✓ |  | ✓ |  |  | 
| BeforeBlockTraffic |  | ✓ | ✓ | ✓ |  |  | ✓ | 
| BlockTraffic3 |  | ✓ | ✓ | ✓ |  |  | ✓ | 
| AfterBlockTraffic |  | ✓ | ✓ | ✓ |  |  | ✓ | 
| BeforeAllowTraffic | ✓ |  | ✓ |  | ✓ | ✓ |  | 
| AllowTraffic3 | ✓ |  | ✓ |  | ✓ | ✓ |  | 
| AfterAllowTraffic | ✓ |  | ✓ |  | ✓ | ✓ |  | 
|  1 如需 Amazon EC2 Auto Scaling 部署的相關資訊，請參閱 [Amazon EC2 Auto Scaling 如何與 CodeDeploy 搭配使用](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-behaviors)。 2 也適用於就地部署的復原。 3 預留給 CodeDeploy 操作。無法用於執行指令碼。  | 

### 部署中掛鉤的執行順序
<a name="reference-appspec-file-structure-hooks-run-order"></a>

**Auto Scaling 啟動部署**

在 Auto Scaling 啟動部署期間，CodeDeploy 會依下列順序執行事件掛鉤。

如需 Auto Scaling 啟動部署的詳細資訊，請參閱 [Amazon EC2 Auto Scaling 如何與 CodeDeploy 搭配使用](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-behaviors)。

![\[Auto Scaling 啟動部署期間的事件掛鉤順序。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lifecycle-event-order-scale-out.png)


**注意**  
部署中的 **Start**、**DownloadBundle**、**Install**、**AllowTraffic** 和 **End** 事件無法編寫指令碼，因此在此圖表中會以灰色顯示。不過，您可以編輯 AppSpec 檔案的 `'files'`區段，以指定**安裝**事件期間安裝的項目。

**Auto Scaling 終止部署**

在 Auto Scaling 終止部署期間，CodeDeploy 會依下列順序執行事件掛鉤。

如需 Auto Scaling 終止部署的詳細資訊，請參閱 [在 Auto Scaling 縮減事件期間啟用終止部署](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-behaviors-hook-enable)。

![\[Auto Scaling 終止部署期間的事件掛鉤順序。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lifecycle-event-order-scale-in.png)


**注意**  
部署中的 **Start**、**BlockTraffic** 和 **End** 事件無法編寫指令碼，因此在此圖表中會以灰色顯示。

**就地部署**：

在就地部署中，包括就地部署的復原，事件勾點以下列順序執行：

**注意**  
對於就地部署，與封鎖和允許流量相關的六個掛鉤僅適用於部署群組中從 Elastic Load Balancing 指定 Classic Load Balancer、Application Load Balancer 或 Network Load Balancer。

![\[在就地部署復原期間的事件掛鉤順序。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lifecycle-event-order-in-place.png)


**注意**  
部署中的 **Start**、**DownloadBundle**、**Install** 和 **End** 事件無法以指令碼方式處理，這就是它們在本圖表中呈現灰色的原因。不過，您可以編輯 AppSpec 檔案的 `'files'`區段，以指定**安裝**事件期間安裝的項目。

**藍/綠部署**

在藍/綠部署中，事件勾點以下列順序執行：

![\[藍/綠部署中的事件掛鉤順序。\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/images/lifecycle-event-order-blue-green.png)


**注意**  
部署中的 **Start**、**DownloadBundle**​、**Install**、​**BlockTraffic**、​**AllowTraffic** 和 **End** 事件，無法以指令碼方式處理，這就是它們在本圖表中呈現灰色的原因。不過，您可以編輯 AppSpec 檔案的 'files' 區段，以指定**安裝**事件期間安裝的項目。

### 「勾點」區段的結構
<a name="reference-appspec-file-structure-hooks-section-structure"></a>

`'hooks'` 區段的結構如下：

```
hooks:
   deployment-lifecycle-event-name:
     - location: script-location
       timeout: timeout-in-seconds
       runas: user-name
```

您可以在 **hook** 項目中，在部署生命週期事件名稱後包含下列元素：

** location **  
必要. 修訂版指令碼檔案的套件組合位置。您在 `hooks`區段中指定的指令碼位置是相對於應用程式修訂版套件的根目錄。如需詳細資訊，請參閱[規劃 CodeDeploy 的修訂](application-revisions-plan.md)。

** timeout **  
選用。指令碼被視為失敗前允許執行的秒數。預設為 3600 秒 (1 小時)。  
3600秒 (1小時) 是允許為每個部署生命週期事件執行指令碼時間上限。如果指令碼超過此限制，部署會停止，且部署到執行個體會失敗。請確認每一個部署生命週期事件內所有的指令碼所指定的 **timeout** 總秒數不超過這個限制。

** runas **  
選用。當執行指令碼時要模擬的使用者。根據預設，這是在執行個體上執行的 CodeDeploy 代理程式。CodeDeploy 不會儲存密碼，因此如果 **Runas** 使用者需要密碼，就無法模擬使用者。此元素僅適用於 Amazon Linux 和 Ubuntu Server 執行個體。

### 參考掛鉤指令碼中的檔案
<a name="codedeploy-agent-working-directory"></a>

如果您要將指令碼連接到 CodeDeploy 生命週期事件，如 中所述[AppSpec 'hooks' 區段](#reference-appspec-file-structure-hooks)，並且想要在指令碼中參考檔案 （例如 `helper.sh`)，則需要`helper.sh`使用下列命令來指定 ：
+ （建議） 絕對路徑。請參閱 [使用絕對路徑](#codedeploy-agent-working-dir-absolute)。
+ 相對路徑。請參閱 [使用相對路徑](#codedeploy-agent-working-dir-relative)。

#### 使用絕對路徑
<a name="codedeploy-agent-working-dir-absolute"></a>

若要使用檔案的*絕對*路徑來參考檔案，您可以：
+ 在 `destination` 屬性的 AppSpec 檔案 `files`區段中指定絕對路徑。然後，在掛接指令碼中指定相同的絕對路徑。如需詳細資訊，請參閱[AppSpec 'files' 區段 （僅限 EC2/內部部署部署）](reference-appspec-file-structure-files.md)。
+ 在掛鉤指令碼中指定動態絕對路徑。如需詳細資訊，請參閱[部署封存位置](#codedeploy-agent-working-dir-archive)。

**部署封存位置**

在 [DownloadBundle](#reference-appspec-file-structure-hooks-list) 生命週期事件期間，CodeDeploy 代理程式會將部署的[修訂](application-revisions.md)擷取到具有下列格式的目錄：

`root-directory/deployment-group-id/deployment-id/deployment-archive`

路徑的*根目錄*部分一律設定為下表所示的預設值，或由 `:root_dir` 組態設定控制。如需組態設定的詳細資訊，請參閱 [CodeDeploy 代理程式組態參考](reference-agent-configuration.md)。


| 客服人員平台 | 預設根目錄 | 
| --- | --- | 
| Linux – 所有 rpm 分佈 |  /opt/codedeploy-agent/deployment-root  | 
| Ubuntu Server – 所有 Deb 分佈 |  /opt/codedeploy-agent/deployment-root  | 
| Windows Server |  %ProgramData%\$1Amazon\$1CodeDeploy  | 

從您的掛接指令碼中，您可以使用根目錄路徑和 `DEPLOYMENT_ID`和 `DEPLOYMENT_GROUP_ID`環境變數來存取目前的部署封存。如需您可以使用之變數的詳細資訊，請參閱 [勾點的環境變數可用性](#reference-appspec-file-structure-environment-variable-availability)。

例如，以下說明如何存取位於 Linux 修訂版根目錄`data.json`的檔案：

```
#!/bin/bash

rootDirectory="/opt/codedeploy-agent/deployment-root" # note: this will be different if you
                                                      # customize the :root_dir configuration
dataFile="$rootDirectory/$DEPLOYMENT_GROUP_ID/$DEPLOYMENT_ID/deployment-archive/data.json"
data=$(cat dataFile)
```

另一個範例是，以下是如何在 Windows 上使用 Powershell 存取位於修訂根目錄`data.json`的檔案：

```
$rootDirectory="$env:ProgramData\Amazon\CodeDeploy" # note: this will be different if you
                                                    # customize the :root_dir configuration
$dataFile="$rootDirectory\$env:DEPLOYMENT_GROUP_ID\$env:DEPLOYMENT_ID\deployment-archive\data.json"
$data=(Get-Content $dataFile)
```

#### 使用相對路徑
<a name="codedeploy-agent-working-dir-relative"></a>

若要使用檔案的*相對*路徑來參考檔案，您需要知道 CodeDeploy 代理程式的工作目錄。檔案路徑與此目錄相對。

下表顯示 CodeDeploy 代理程式每個支援平台的工作目錄。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html)

### 勾點的環境變數可用性
<a name="reference-appspec-file-structure-environment-variable-availability"></a>

在每個部署生命週期事件期間，勾點指令碼能存取以下環境變數：

** APPLICATION\$1NAME **  
CodeDeploy 中屬於目前部署一部分的應用程式名稱 （例如 `WordPress_App`)。

** DEPLOYMENT\$1ID **  
ID CodeDeploy 已指派給目前的部署 （例如，`d-AB1CDEF23`)。

** DEPLOYMENT\$1GROUP\$1NAME **  
CodeDeploy 中屬於目前部署一部分的部署群組名稱 （例如 `WordPress_DepGroup`)。

** DEPLOYMENT\$1GROUP\$1ID **  
CodeDeploy 中屬於目前部署一部分的部署群組 ID （例如 `b1a2189b-dd90-4ef5-8f40-4c1c5EXAMPLE`)。

** LIFECYCLE\$1EVENT **  
目前部署生命週期事件的名稱 (例如，`AfterInstall`)。

這些環境變數在每個部署生命週期事件的本機。

 根據部署套件的來源，還有其他環境變數可用於掛接指令碼：

**Amazon S3 的套件**
+ **BUNDLE\$1BUCKET**

  下載部署套件的 Amazon S3 儲存貯體名稱 （例如 `my-s3-bucket`)。
+ **BUNDLE\$1KEY**

  Amazon S3 儲存貯體中下載套件的物件金鑰 （例如 `WordPress_App.zip`)。
+ **BUNDLE\$1VERSION**

  套件的物件版本 （例如，`3sL4kqtJlcpXroDTDmJ+rmSpXd3dIbrHY+MTRCxf3vjVBH40Nr8X8gdRQBpUMLUo`)。只有在 Amazon S3 儲存貯體已啟用[物件版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)時，才會設定此變數。
+ **BUNDLE\$1ETAG**

  套件的物件標籤 （例如 `b10a8db164e0754105b7a99be72e3fe5-4`)。

**GitHub 的套件**
+ **BUNDLE\$1COMMIT**

  Git 產生的套件的 SHA256 遞交雜湊 （例如，`d2a84f4b8b650937ec8f73cd8be2c74add5a911ba64df27458ed8229da804a26`)。

如果 **DEPLOYMENT\$1GROUP\$1NAME** 的值等於 `Staging`，以下指令碼會變更Apache HTTP 伺服機上的接聽連接埠到 9090 以代替 80。這個指令碼必須在 `BeforeInstall` 部署生命週期事件期間叫用：

```
if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ]
then
    sed -i -e 's/Listen 80/Listen 9090/g' /etc/httpd/conf/httpd.conf
fi
```

如果 **DEPLOYMENT\$1GROUP\$1NAME** 環境變數的值等於 `Staging`，以下指令碼範例會將錯誤日誌中所記錄的詳細資訊等級，從警告變更為偵錯。這個指令碼必須在 `BeforeInstall` 部署生命週期事件期間叫用：

```
if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ]
then
    sed -i -e 's/LogLevel warn/LogLevel debug/g' /etc/httpd/conf/httpd.conf
fi
```

以下指令碼範例取代被指定的網頁文字，其顯示這些環境變數的值。這個指令碼必須在 `AfterInstall` 部署生命週期事件期間叫用：

```
#!/usr/bin/python

import os
 
strToSearch="<h2>This application was deployed using CodeDeploy.</h2>"
strToReplace="<h2>This page for "+os.environ['APPLICATION_NAME']+" application and "+os.environ['DEPLOYMENT_GROUP_NAME']+" deployment group with "+os.environ['DEPLOYMENT_GROUP_ID']+" deployment group ID was generated by a "+os.environ['LIFECYCLE_EVENT']+" script during "+os.environ['DEPLOYMENT_ID']+" deployment.</h2>"
 
fp=open("/var/www/html/index.html","r")
buffer=fp.read()
fp.close()
 
fp=open("/var/www/html/index.html","w")
fp.write(buffer.replace(strToSearch,strToReplace))
fp.close()
```

### 勾點範例
<a name="reference-appspec-file-structure-hooks-example"></a>

這裡有一個 **hooks** 輸入項目的範例，其為 `AfterInstall` 生命週期事件指定兩個勾點。

```
hooks:
   AfterInstall:
     - location: Scripts/RunResourceTests.sh
       timeout: 180
     - location: Scripts/PostDeploy.sh
       timeout: 180
```

`Scripts/RunResourceTests.sh`指令碼在部署程序的 `AfterInstall` 階段期間執行。如果它需要超過 180 秒 (3分鐘) 去執行指令碼，則表示部署是不成功的。

您在 'hooks' 部分指定的指令碼位置，與應用程式修訂版套件組合的根目錄相關。在前述案例中，名為 `RunResourceTests.sh` 的檔案位於名為 `Scripts` 的目錄中。`Scripts` 目錄位於套件組合的根層級。如需詳細資訊，請參閱[規劃 CodeDeploy 的修訂](application-revisions-plan.md)。