

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

# CodeDeploy 執行個體運作狀態
<a name="instances-health"></a>

CodeDeploy 會監控部署群組中執行個體的運作狀態。如果正常運作的執行個體數目低於在部署期間針對部署群組所指定的最低正常運作執行個體數目，則它會讓部署失敗。例如，如果 85% 的執行個體在部署期間必須維持正常運作，而且部署群組包含 10 個執行個體，則部署至單一執行個體失敗時，整體部署就會失敗。原因是執行個體離線以安裝最新的應用程式修訂時，可用的正常運作執行個體計數已經降到 90%。失敗的執行個體加上另一個離線執行個體，表示只有 80% 的執行個體運作狀態良好且可用。CodeDeploy 將使整體部署失敗。

請務必記住，若要讓整體部署成功，必須符合下列條件：
+ CodeDeploy 能夠部署到部署中的每個執行個體。
+ 部署到至少一個執行個體必須成功。這表示即使最低正常運作主機值為 0，部署到至少一個執行個體還是必須成功 (也就是，至少有一個執行個體必須正常運作)，整體部署才會成功。

**Topics**
+ [運作狀態](#instances-health-status)
+ [關於運作狀態良好的執行個體數量下限](#minimum-healthy-hosts)
+ [每個可用區域的運作狀態良好執行個體數量下限](#minimum-healthy-hosts-az)

## 運作狀態
<a name="instances-health-status"></a>

CodeDeploy 為每個執行個體指派兩個運作狀態值：*修訂運作*狀態和*執行個體運作*狀態。

修訂版運作狀態  
修訂版運作狀況是根據目前在執行個體上安裝的應用程式修訂而定。它有下列的狀態數值：  
+ 目前：安裝在執行個體上的修訂版符合適用上一次成功部署中部署群組的修訂。
+ 舊版：安裝在執行個體上的修訂版符合較舊版本的應用程式。
+ 不明：應用程式修訂版尚未成功安裝在執行個體上。

執行個體運作狀態  
執行個體運作狀態是根據成功部署至執行個體的而定。其具有下列數值：  
+ 正常運作：上一次部署到執行個體成功。
+ 問題：嘗試部署修訂版到執行個體但失敗，或修訂版尚未部署到執行個體上。

CodeDeploy 使用修訂運作狀態和執行個體運作狀態，依下列順序排程部署至部署群組的執行個體：

1. 有問題的執行個體運作狀態。

1. 不明修訂版的運作狀態。

1. 舊修訂版的運作狀態。

1. 目前修訂版的運作狀態。

如果整體部署成功，會更新修訂版和部署群組的運作狀態數值，以反映最新的部署狀況。
+ 目前所有成功部署過的執行個體須保持為目前的狀態。否則，則會變成不名的狀態。
+ 所有成功部署過的舊執行個體與不明的執行個體，須變為目前的狀態。否則，則會繼續維持舊版或不明的狀態。
+ 目前所有成功部署過的正常運作執行個體，須保持正常運作狀態。否則，則會變成有問題狀態。
+ 所有成功部署過的有問題之執行個體都會變為正常運作。否則，則會繼續保持為有問題狀態。

如果整體部署失敗或停止：
+ CodeDeploy 嘗試部署應用程式修訂版的每個執行個體都會將其執行個體運作狀態設定為正常運作或運作狀態不佳，取決於該執行個體的部署嘗試是否成功。
+ CodeDeploy 未嘗試部署應用程式修訂版的每個執行個體都會保留其目前的執行個體運作狀態值。
+ 部署群組的修訂版保持不變。

## 關於運作狀態良好的執行個體數量下限
<a name="minimum-healthy-hosts"></a>

所需的最低正常運作執行個體數目定義為部署組態的一部分。

**重要**  
在藍/綠部署期間，部署組態和最低正常運作主機值會套用至替換環境中的執行個體，而不是原始環境中的執行個體。不過，從負載平衡器取消註冊原始環境中的執行個體時，如果無法成功取消註冊單一原始執行個體，則會將整體部署標示為 Failed (失敗)。

CodeDeploy 提供三種預設部署組態，這些組態具有常用的最低運作狀態良好主機值：


| 預設部署組態名稱 | 預先定義的最低正常運作主機值 | 
| --- | --- | 
| CodeDeployDefault.OneAtATime | 1 | 
| CodeDeployDefault.HalfAtATime | 50% | 
| CodeDeployDefault.AllAtOnce | 0 | 

如需預設部署組態的詳細資訊，請參閱[在 CodeDeploy 中使用部署組態](deployment-configurations.md)。

您可以在 CodeDeploy 中建立自訂部署組態，以定義您自己的運作狀態最低主機值。在使用以下操作時，您可以自行定義數值 (整數或百分比皆可)：
+ 當您在 中使用 [create-deployment-config](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-config.html) 命令`minimum-healthy-hosts`時 AWS CLI。
+ 如同 CodeDeploy API 中的 `Value` [MinimumHealthyHosts](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_MinimumHealthyHosts.html) 資料類型。
+ 當您在 CloudFormation 範本中使用 [AWS::CodeDeploy::DeploymentConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentconfig.html) `MinimumHealthyHosts`時。

CodeDeploy 可讓您為部署指定運作狀態良好的執行個體數目下限，以達成兩個主要目的：
+ 為判斷整體部署成功或失敗。如果應用程式修訂版成功部署最低數量的正常運作執行個體，則部署成功。
+ 為判斷部署階段中，正常運作執行個體的數量，以允許部署繼續作業。

您可以為您的部署群組指定最低數量的正常運作執行個體，做為執行個體總數量的一部分或的百分比。如果您指定百分比，則在部署開始時，CodeDeploy 會將百分比轉換為同等數量的執行個體，將任何小數執行個體四捨五入。

CodeDeploy 會在部署程序期間追蹤部署群組執行個體的運作狀態，並使用部署指定的運作狀態最低數量執行個體來決定是否繼續部署。基本原則是部署必須永遠不會使正常運作執行個體數量於您所指定的最小值。唯一例外是部署群組在起始時就擁有少於指定最低數量的執行個體。這種情況下，部署程序不會進一步減少任何正常運作執行個體。

**注意**  
CodeDeploy 會嘗試部署到部署群組中的所有執行個體，即使是目前處於已停止狀態的執行個體。在最低運作狀態良好的主機計算中，已停止的執行個體做為失敗的執行個體有相同的影響。若要解決因太多停止的執行個體導致部署失敗，請重新啟動執行個體，或變更其標籤，使其從部署群組中排除。

CodeDeploy 會嘗試將應用程式修訂版部署至部署群組運作狀態不佳的執行個體，以啟動部署程序。對於每個成功的部署，CodeDeploy 會將執行個體的運作狀態變更為正常運作，並將其新增至部署群組的運作狀態執行個體。CodeDeploy 接著會將目前運作狀態良好的執行個體數目與指定的運作狀態良好執行個體數目下限進行比較。
+ 如果運作狀態良好的執行個體數目小於或等於指定的運作狀態良好執行個體數目下限，CodeDeploy 會取消部署，以確保運作狀態良好的執行個體數目不會隨著更多部署而減少。
+ 如果運作狀態良好的執行個體數目至少大於指定的運作狀態良好執行個體數目下限，CodeDeploy 會將應用程式修訂版部署到原始運作狀態良好的執行個體集。

如果部署至運作狀態良好的執行個體失敗，CodeDeploy 會將該執行個體的運作狀態變更為運作狀態不佳。隨著部署進行，CodeDeploy 會更新目前運作狀態良好的執行個體數目，並將其與指定的運作狀態良好執行個體數目下限進行比較。如果運作狀態良好的執行個體數量在部署程序的任何時間點降至指定的最小數量，CodeDeploy 會停止部署。此舉可防止接下來可能會失敗的部署，以及防止數量低於指定最小值的正常運作執行個體發生。

**注意**  
請確定您指定的正常運作執行個體最小值低於部署群組中執行個體的總數。若您指定的是百分比，請記住系統就自動將數值進位。否則，當部署開始時，運作狀態良好的執行個體數目將已經小於或等於指定的運作狀態良好執行個體數目下限，而 CodeDeploy 將立即使整體部署失敗。

CodeDeploy 也會使用指定的運作狀態良好執行個體數目下限和運作狀態良好執行個體的實際數目，來判斷是否及如何將應用程式修訂版部署至多個執行個體。根據預設，CodeDeploy 會將應用程式修訂版部署到盡可能多的執行個體，而不會有任何讓運作狀態良好的執行個體數目低於指定運作狀態良好執行個體數目下限的風險。

為了判斷應該一次部署到 的執行個體數量，CodeDeploy 會使用下列計算：

```
[total-hosts] - [minimum-healthy-hosts] =
        [number-of-hosts-to-deploy-to-at-once]
```

例如：
+ 如果您的部署群組有 10 個執行個體，且您將運作狀態良好的執行個體數量下限設定為 9，則 CodeDeploy 會一次部署至 1 個執行個體。
+ 如果您的部署群組有 10 個執行個體，且您將運作狀態良好的執行個體數量下限設定為 3，則 CodeDeploy 會在第一個批次中同時部署到 7 個執行個體，然後在第二個批次中部署到剩餘的 3 個執行個體。
+ 如果您的部署群組有 10 個執行個體，且您將運作狀態良好的執行個體數量下限設定為 0，則 CodeDeploy 會同時部署到 10 個執行個體。

**範例**

以下範例假設部署群組有 10 個執行個體。

正常運作執行個體的最小值：95%  
CodeDeploy 會將運作狀態良好的執行個體數量下限四捨五入至 10 個執行個體，等於運作狀態良好的執行個體數量。在尚未部署修訂版至任何執行個體上，整體部署已立刻失敗。

正常運作執行個體的最小值：9  
CodeDeploy 一次將修訂部署至一個執行個體。如果部署到任何執行個體失敗，CodeDeploy 會立即失敗整體部署，因為運作狀態良好的執行個體數目等於運作狀態良好的執行個體數目下限。此規則的例外是若最後一個執行個體發生失敗，仍然可以成功部署。  
CodeDeploy 會繼續部署，一次一個執行個體，直到任何部署失敗或整體部署完成為止。如果所有 10 個部署皆成功，部署群組則會有 10 個正常運作執行個體。

正常運作執行個體的最小值：8  
CodeDeploy 一次將修訂部署到兩個執行個體。如果其中兩個部署失敗，CodeDeploy 會立即使整體部署失敗。此規則的例外是若最後一個執行個體是第二個發生失敗的，則仍然可以成功部署。

正常運作執行個體的最小值：0  
CodeDeploy 會一次將修訂版部署到整個部署群組。至少必須有一個部署到執行個體成功，則整體部署才會成功。如果 0 個執行個體正常運作，則部署會失敗。這是因為為了將整體部署標記為成功，即使運作狀態最低的執行個體值為 0，當整體部署完成時，至少有一個執行個體必須運作狀態良好。

## 每個可用區域的運作狀態良好執行個體數量下限
<a name="minimum-healthy-hosts-az"></a>

**注意**  
本節會交替使用*執行個體*和*主機*一詞來參考 Amazon EC2 執行個體。

如果您要部署到多個[可用區域中的](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-availability-zones)執行個體，您可以選擇啟用 [zonal configuration](deployment-configurations-create.md#zonal-config)功能，以允許 CodeDeploy 一次部署到一個可用區域。

啟用此功能時，CodeDeploy 會確保運作狀態良好的主機數量保持在「每個區域運作狀態良好的主機數量下限」*和*「運作狀態良好的主機數量下限」值以上。如果運作狀態良好的主機數量低於任一值，CodeDeploy 會失敗所有可用區域的部署。

為了計算要一次部署到 的主機數量，CodeDeploy 同時使用「每個區域運作狀態良好的主機下限」和「運作狀態良好的主機下限」值。CodeDeploy 將使用*較少*的計算`[A]`和 `[B]`，其中 `[A]`和 `[B]`為：

```
[A] = [total-hosts] - [min-healthy-hosts] =
        [number-of-hosts-to-deploy-to-at-once]
```

```
[B] = [total-hosts-per-AZ] - [min-healthy-hosts-per-AZ] =
        [number-of-hosts-to-deploy-to-at-once-per-AZ]
```

在決定要一次部署到 的主機數量之後，CodeDeploy 會以該數量的批次部署到主機，一次一個可用區域，並在區域之間選擇性暫停 （或「製作時間」)。

**範例**

如果您的部署設定如下：
+ `[total-hosts]` 是 `200`
+ `[minimum-healthy-hosts]` 是 `160`
+ `[total-hosts-per-AZ]` 是 `100` 
+ `[minimum-healthy-hosts-per-AZ]` 是 `50`

Then...
+ `[A]` = `200 - 160 = 40`
+ `[B]` = `100 - 50 = 50`
+ `40` 小於 `50`

因此，CodeDeploy 會一次部署到`40`主機。

在此案例中，部署展開方式如下：

1. CodeDeploy 部署到第一個可用區域：

   1. CodeDeploy 部署到第一個`40`主機。

   1. CodeDeploy 部署到下一個`40`主機。

   1. CodeDeploy 會部署到剩餘的`20`主機。

      第一個可用區域的部署現在已完成。

1. （選用） CodeDeploy 會在部署到第一個區域 'bakes' 時等待，如**監控持續時間**或**為第一個區域設定新增監控持續時間**所定義。如果沒有問題，CodeDeploy 會繼續。

1. CodeDeploy 部署到第二個可用區域：

   1. CodeDeploy 部署到第一個`40`主機。

   1. CodeDeploy 部署到下一個`40`主機。

   1. CodeDeploy 會部署到剩餘的`20`主機。

      第二個和最終可用區域的部署現在已完成。

若要了解區域組態功能，以及如何指定每個可用區域運作狀態良好的執行個體數目下限，請參閱 [zonal configuration](deployment-configurations-create.md#zonal-config)。