

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

# 在 AWS PCS 中設定節點生命週期動作
<a name="cng-node-lifecycle-actions-configure"></a>

您可以在運算節點群組組態中定義節點生命週期動作。本主題說明如何定義指令碼、控制是否在重新開機時重新執行、存放指令碼、傳遞引數、處理失敗、快取指令碼、驗證指令碼完整性，以及讀取其日誌。

**代理程式版本需求**  
節點生命週期動作需要 AWS PCS 代理程式 1.5.0-1 版或更新版本。如果您的運算節點使用具有舊版代理程式的自訂 AMI，請在設定生命週期動作之前更新代理程式。如需詳細資訊，請參閱[AWS PCS 代理程式版本](pcs-agent-versions.md)。

## 如何定義指令碼
<a name="cng-node-lifecycle-actions-configure-define"></a>

每個指令碼都有 `name`、`scriptSource`、選用 、 `arguments``onError`政策和 `executionPolicy`。位置和完整性欄位會在 下分組`scriptSource`。

```
{
  "name": "My script",
  "scriptSource": {
    "scriptLocation": "s3://{{my-bucket}}/{{my-script}}.sh",
    "s3VersionId": "optional, S3 only",
    "checksum": "optional 64-char SHA-256 hex"
  },
  "arguments": ["{{arg1}}", "{{arg2}}"],
  "onError": "TERMINATE",
  "executionPolicy": "FIRST_BOOT_ONLY"
}
```

## 將生命週期動作新增至運算節點群組
<a name="cng-node-lifecycle-actions-configure-add"></a>

您可以在建立或更新運算節點群組時新增生命週期動作。使用 AWS 管理主控台 或 AWS CLI。

------
#### [ AWS 管理主控台 ]

**使用主控台新增生命週期動作**

1. 開啟 [AWS PCS 主控台](https://console.aws.amazon.com/pcs/home#/clusters)。

1. 開啟運算節點群組的建立或更新頁面。

1. 在**節點生命週期動作**區段中，選擇**新增指令碼**。

1. 選取指令碼來源：

   1. **從 AWS PCS 指令碼程式庫新增** - 參考 AWS維護的指令碼。如需詳細資訊，請參閱[在 AWS PCS AWS中為節點生命週期動作使用維護的指令碼](cng-node-lifecycle-actions-vetted-scripts.md)。

   1. **透過 S3 新增** – 透過其 Amazon S3 URI 參考指令碼。

   1. **透過 HTTPS 新增** - 透過 HTTPS URL 參考指令碼。

1. 選取節點階段。

1. 對於您透過 S3 或 HTTPS 新增的指令碼，請指定下列設定：

   1. **指令碼位置** – 輸入指令碼的 S3 URI 或 HTTPS URL。

   1. **名稱** – 輸入指令碼的名稱。

   1. （選用） **檢查總**和 – 輸入 SHA-256 檢查總和以驗證指令碼的完整性。如需詳細資訊，請參閱[指令碼完整性 （總和檢查）](#cng-node-lifecycle-actions-configure-checksums)。

   1. （選用） 對於您透過 S3 新增的指令碼，輸入版本以參考物件的特定版本。

1. 對於所有指令碼來源，請指定下列設定：

   1. **錯誤處理行為** – 選取 `TERMINATE`、 `STOP_SEQUENCE`或 `CONTINUE`。

   1. **執行政策** – 選取 `FIRST_BOOT_ONLY`或 `EVERY_BOOT`。

   1. （選用） **引數** – 新增要傳遞至指令碼的引數。

1. 若要新增更多指令碼，請重複這些步驟。

1. 指令碼會在階段內從上到下執行。若要變更執行順序，請選擇指令碼**的動作**，然後選擇**上移**或**下移**。

1. 針對**快取政策**，選取 `CACHE_ONCE`或 `REFRESH_ON_REBOOT`。快取政策適用於所有指令碼。如需詳細資訊，請參閱[指令碼快取和更新](#cng-node-lifecycle-actions-configure-caching)。

------
#### [ AWS CLI ]

使用 `--node-lifecycle-actions` 參數搭配 `create-compute-node-group`或 `update-compute-node-group`命令。如需參數結構，請參閱 *AWS PCS API 參考*中的 [NodeLifecycleActionsRequest](https://docs.aws.amazon.com/pcs/latest/APIReference/API_NodeLifecycleActionsRequest.html)。如需範例命令，請參閱 [AWS PCS 的節點生命週期動作範例](cng-node-lifecycle-actions-examples.md)。

------

## 控制重新啟動行為
<a name="cng-node-lifecycle-actions-configure-reboot"></a>

設定`executionPolicy`每個指令碼以控制重新啟動時是否重新執行。


| **Value** | **行為** | **使用情況** | 
| --- | --- | --- | 
| `FIRST_BOOT_ONLY` (default) | 在節點第一次開機時執行指令碼一次。每次後續重新開機時，請略過它。 | 一次性設定，例如安裝套件、加入網域或初始化儲存體。您不需要將這些指令碼設為等冪。 | 
| `EVERY_BOOT` | 在第一次開機**和**每次重新開機時執行指令碼。 | 重新啟動後必須重新套用的組態，例如重新掛載暫時性檔案系統或重新宣告節點狀態。 | 

指令碼設定為`FIRST_BOOT_ONLY`執行一次，並在重新啟動時略過。指令碼設定為在每次開機時`EVERY_BOOT`執行，且應具有等冪性 （以相同結果安全地執行多次）。

## 指令碼儲存位置
<a name="cng-node-lifecycle-actions-configure-storage"></a>

您可以在 **Amazon S3** 中存放指令碼，或透過 **HTTPS** 提供指令碼。指令碼無法透過 API 內嵌上傳，而且每個指令碼不得超過 2 MiB — 代理程式會拒絕任何超過此大小的指令碼。
+ **Amazon S3 (`s3://{{bucket}}/{{key}}`)** — 執行個體 IAM 描述檔必須在 物件`s3:GetObject`上具有 。透過 S3 閘道 VPC 端點，私有子網路中的節點可以透過 VPC 端點擷取指令碼。使用 固定特定版本 `scriptSource.s3VersionId`（僅限 S3 位置）。
+ **HTTPS (`https://{{hostname}}/{{path}}`)** — 主機必須是可公開讀取的 （無身分驗證），且節點需要傳出網際網路存取 （網際網路閘道、NAT 閘道或 HTTP 代理）。這適用於 GitHub 或其他公有儲存庫上託管的指令碼。

外部儲存提供版本控制、可稽核性和跨團隊重複使用。不支援內嵌或上傳的指令碼。

## 將引數傳遞至指令碼
<a name="cng-node-lifecycle-actions-configure-arguments"></a>

將引數做為排序陣列傳遞。它們會以位置命令列參數的形式到達您的指令碼。

```
arguments: ["fs-12345678", "/shared", "nfs4"]
# script.sh fs-12345678 /shared nfs4   ($1=fs-12345678, $2=/shared, $3=nfs4)
```

代理程式會將環境變數匯出至每個指令碼。這些變數包含叢集和節點中繼資料。


| **變數** | **Description** | 
| --- | --- | 
| `PCS_CLUSTER_ID` / `PCS_CLUSTER_NAME` | 叢集識別符/名稱 | 
| `PCS_COMPUTE_NODE_GROUP_ID` / `PCS_COMPUTE_NODE_GROUP_NAME` | 運算節點群組識別符/名稱 | 
| `PCS_NODE_ID` | 節點識別符 | 
| `PCS_IS_FIRST_BOOT` | `1` 節點第一次開機時，每次後續重新開機`0`時。用來在`EVERY_BOOT`指令碼中分支行為。 | 

```
#!/usr/bin/env bash
echo "Configuring node $PCS_NODE_ID in cluster $PCS_CLUSTER_NAME"
```

## 錯誤處理
<a name="cng-node-lifecycle-actions-configure-errors"></a>

每個指令碼都有一個 `onError` 欄位，可控制指令碼退出非零或被訊號終止時會發生的情況。


| **Value** | **行為** | **使用情況** | 
| --- | --- | --- | 
| `TERMINATE` (default) | 標記節點失敗並終止它。 | 關鍵設定 （儲存掛載、Active Directory 聯結）。防止支付損壞節點的費用。 | 
| `STOP_SEQUENCE` | 停止階段中剩餘的指令碼；讓節點保持執行狀態。 | 除錯 - 在故障後檢查執行個體。 | 
| `CONTINUE` | 記錄錯誤並執行下一個指令碼。 | 選用或盡最大努力的任務。 | 

如果指令碼結束非零或被訊號 （例如 ) 刪除，則指令碼會失敗`SIGSEGV`。**指令碼不會重試。**如果操作可能遇到暫時性失敗，請在指令碼內新增重試邏輯。不過，指令碼*擷取* （下載） 會重試，在`onError`行為套用之前，最多 3 次嘗試呈指數退避 （最多約 17 秒）。

## 指令碼快取和更新
<a name="cng-node-lifecycle-actions-configure-caching"></a>

代理程式會在第一次開機時將每個指令碼下載到執行個體，並將其存放在本機。兩個欄位控制重新啟動時的行為：`scriptCachingPolicy`控制重新下載和`executionPolicy`控制重新執行。
+ **`CACHE_ONCE` （預設）** — 第一次開機時下載一次；永遠不要重新擷取。重新啟動時的行為相同。更新指令碼*內容*需要替換執行個體。
+ **`REFRESH_ON_REBOOT`** — 每次重新開機時重新下載，覆寫快取。這可讓您透過重新啟動來運送指令碼修正。它在每次開機時都需要網路存取權；如果重新整理失敗，下載會被視為擷取失敗，並且指令碼`onError`的行為適用 （快取複本沒有後援）。重新整理的指令碼只有在其`executionPolicy`為 時，才會在重新啟動時實際重新執行`EVERY_BOOT`。

生命週期*組態* （指令碼執行的項目、其引數、錯誤處理和執行政策） 永遠不會改變每個執行個體。透過 變更它只會`UpdateComputeNodeGroup`影響**新的**執行個體，並觸發`DRAIN`策略，讓執行中的任務在取代節點之前完成。

## 指令碼完整性 （總和檢查）
<a name="cng-node-lifecycle-actions-configure-checksums"></a>

選擇性地在指令碼的 `checksum`中提供 SHA-256`scriptSource`，做為 64 個字元的十六進位字串。代理程式在下載時驗證它；不相符會被視為下載失敗並觸發 `onError`。我們建議生產的檢查總和，尤其是來自共用或外部來源的指令碼。

```
sha256sum mount-efs.sh   # use the 64-char hex hash as the checksum value
```

## 記錄和偵錯
<a name="cng-node-lifecycle-actions-configure-logging"></a>

每個指令碼都會寫入自己的日誌檔案，而代理程式會保留自己的操作日誌。

```
# agent: download, caching, checksum, orchestration
/var/log/amazon/pcs/lifecycle/actions/executor.log
# each script's stdout/stderr
/var/log/amazon/pcs/lifecycle/actions/<stage>/<script-name>.log
```

日誌檔案名稱會使用您定義的指令碼名稱。保留空間。例如，名為 的指令碼會`Mount EFS home directory`寫入 `Mount EFS home directory.log`。與 SSH 或 AWS Systems Manager Session Manager 連線以讀取它們，這兩者都可由`nodeBootstrapped`階段使用。由於`TERMINATE`取代了 故障的節點，因此請在終止後轉送日誌關閉執行個體以進行偵錯：新增節點引導指令碼，將 Amazon CloudWatch 代理程式設定為將生命週期日誌目錄傳送至 Amazon CloudWatch Logs。 AWS維護的`configure-cloudwatch-logs.sh`指令碼會執行此操作。如需詳細資訊，請參閱[在 AWS PCS AWS中為節點生命週期動作使用維護的指令碼](cng-node-lifecycle-actions-vetted-scripts.md)。