

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

# 部署政策和設定
<a name="using-features.rolling-version-deploy"></a>

AWS Elastic Beanstalk [針對部署](using-features.deploy-existing-version.md)的處理方式提供數個選項，包括部署政策 (*一次全部*、*滾動*、*使用額外批次滾動*、*不可分割*和*流量分割*)，以及可讓您在部署期間設定批次大小和運作狀態檢查行為的選項。您的環境預設設定為一次使用全部部署。如果您使用 EB CLI 建立環境，且該環境為自動擴展環境 (您未指定 `--single` 選項)，則該環境會使用滾動部署。

透過「滾動部署」**，Elastic Beanstalk 會將環境的 Amazon EC2 執行個體分割成批次，然後將應用程式的新版本一次部署到一個批次。其會將環境中的其餘執行個體維持在執行舊版本應用程式的狀態。在滾動部署期間，部分執行個體會以舊版應用程式處理要求，而批次已完成的執行個體將以新版本處理其他要求。如需詳細資訊，請參閱[滾動部署運作方式](#environments-cfg-rollingdeployments-method)。

若要在部署期間維持完整容量，您可以先將環境設為啟動新的執行個體批次，再從服務中移除執行個體。此選項稱為「以額外批次進行滾動部署」**。部署完成之後，Elastic Beanstalk 會終止額外的執行個體批次。

「不可變部署」**會執行[不可變的更新](environmentmgmt-updates-immutable.md)來啟動一組在不同 Auto Scaling 群組中執行新版本應用程式的完整新執行個體，並與執行舊版本應用程式的執行個體一同執行。不可變部署可避免滾動部署部分完成時所造成的問題。若新的執行個體未通過運作狀態檢查，Elastic Beanstalk 會將其終止，而原始執行個體保持不變。

「流量分割部署」**可讓您將 Canary 測試做為應用程式部署的一部分執行。在流量分割部署中，Elastic Beanstalk 會啟動一組完整的新執行個體，就像在不可變的部署期間一樣。之後，其會在指定的評估期間，將指定百分比的傳入用戶端流量轉送至新的應用程式版本。如果新的執行個體運作狀態保持良好，Elastic Beanstalk 會將所有流量轉送給這些新執行個體，並終止舊的執行個體。如果新的執行個體並未通過運作狀態檢查，或是您選擇中止部署，Elastic Beanstalk 會將流量移回舊的執行個體並終止新的執行個體。絕對不會發生任何服務中斷現象。如需詳細資訊，請參閱[流量分割部署的運作方式](#environments-cfg-trafficsplitting-method)。

**警告**  
部署或更新期間，部分原則會取代所有執行個體。這會造成所有的累計 [Amazon EC2 爆量餘額](https://docs.aws.amazon.com/AWSEC2/latest/DeveloperGuide/burstable-performance-instances.html)遺失。這發生的情況如下：  
執行個體更換啟用的受管平台更新
不可變更新
不可變更新或流量分割啟用的部署

若您的應用程式未通過所有運作狀態檢查，但仍能以較低等級的運作狀態正常運作，您可以修改 **Healthy threshold** (運作狀態閾值) 選項，藉此允許執行個體以較低等級的狀態 (如 `Warning`) 通過運作狀態檢查。若您的部署因運作狀態檢查未通過而失敗，而且無論運作狀態為何，您都需要強制進行更新，請指定 **Ignore health check (忽略運作狀態檢查)** 選項。

當您指定批次大小來進行滾動更新，Elastic Beanstalk 亦使用該值以滾動方式重新啟動應用程式。當您需要重新啟動環境中執行個體上執行的代理程式和應用程式伺服器，且不造成停機時間，請以滾動方式重新啟動。

## 設定應用程式部署
<a name="environments-cfg-rollingdeployments-console"></a>

請於[環境管理主控台](environments-console.md)中，透過編輯環境 **Configuration** (組態) 頁面上的 **Updates and Deployments** (更新和部署)，藉此啟用並設定以批次進行應用程式版本部署。

**欲設定部署 (主控台)**

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在導覽窗格中，選擇**組態**。

1. 在 **Rolling updates and deployments (滾動更新和部署)** 組態類別中，選擇 **Edit (編輯)**。

1. 在 **Application Deployments (應用程式部署)** 區段，請選擇 **Deployment policy (部署政策)**、批次設定和運作狀態檢查選項。

1. 若要儲存變更，請選擇頁面底部的**儲存變更**。

**Rolling updates and deployments** (滾動更新和部署) 頁面的 **Application deployments** (應用程式部署) 區段，含有以下應用程式部署選項：
+ **Deployment policy (部署政策)** - 自下列部署選項選擇：
  + **All at once (一次全部)** - 將新版本同時部署至所有執行個體。當部署開始後，您環境中的所有執行個體都將短暫停止服務。
  + **Rolling (滾動)** - 批次部署新的版本。各個批次將於部署階段自服務中移除，您環境的容量會減少一個批次的執行個體數量。
  + **Rolling with additional batch (以額外批次進行滾動)** - 批次部署新的版本，但會先啟動新的執行個體批次，藉此確保部署程序期間的完整容量。
  + **Immutable (不可變)** - 藉由執行[不可變的更新作業](environmentmgmt-updates-immutable.md)，將新版本部署至全新的執行個體群組。
  + **Traffic splitting (流量分割)** - 將新版本部署到全新的執行個體群組，並暫時分割現有應用程式版本和新版本之間的傳入用戶端流量。

針對 **Rolling (滾動)** 和 **Rolling with additional batch (以額外批次進行滾動)** 部署政策，您可以設定：
+ **Batch size (批次大小)** - 在每個批次中部署的一組執行個體的大小。

  選擇 **Percentage (百分比)** 設定 Auto Scaling 群組中 EC2 執行個體總數的百分比 (最多 100%)，或選擇 **Fixed (固定)** 設定固定數量的執行個體 (最多可達您環境的 Auto Scaling 組態最大執行個體計數)。

針對 **Traffic splitting (流量分割)** 部署政策，您可以設定以下內容：
+ **Traffic split (流量分割)** - Elastic Beanstalk 移動到執行您正在部署新應用程式版本環境執行個體的傳入用戶端流量初始百分比。
+ **Traffic splitting evaluation time (流量分割評估時間)** - 時間間隔 (以分鐘為單位)，Elastic Beanstalk 會在初始運作狀態良好的部署之後等待這段時間，再繼續將所有傳入用戶端流量移動到您正在部署的新應用程式版本。

![\[Elastic Beanstalk 應用程式部署組態頁面\]](http://docs.aws.amazon.com/zh_tw/elasticbeanstalk/latest/dg/images/environment-cfg-rollingdeployments.png)


**Deployment preferences (部署偏好設定)** 區段則包含關於運作狀態檢查的選項。
+ **Ignore health check (忽略運作狀態檢查)** - 當一個批次無法於 **Command timeout (命令逾時)** 內恢復良好狀態時，可避免部署還原。
+ **Healthy threshold (運作狀態閾值)** - 進行滾動部署、滾動更新及不可變更新時，若執行個體運作狀態良好，則可降低閾值。
+ **Command timeout (命令逾時)** - 在取消部署之前，執行個體恢復良好狀態的等待秒數；若已設定 **Ignore health check (忽略運作狀態檢查)**，則是繼續下一批次前的等待秒數。

![\[Elastic Beanstalk 應用程式部署組態頁面\]](http://docs.aws.amazon.com/zh_tw/elasticbeanstalk/latest/dg/images/environment-cfg-healthchecks.png)


## 滾動部署運作方式
<a name="environments-cfg-rollingdeployments-method"></a>

當一個批次正在處理時，Elastic Beanstalk 會將批次中的所有執行個體自負載平衡器分開，並部署新的應用程式版本，然後重新連接執行個體。若啟用[連接耗盡](environments-cfg-clb.md#using-features.managing.elb.draining)，Elastic Beanstalk 會將批次內 Amazon EC2 執行個體的現有連線耗盡，之後才進行部署。

Elastic Load Balancing 將批次內的執行個體重新連接至負載平衡器後，會等待它們通過最小數量的 Elastic Load Balancing 運作狀態檢查 (**Healthy check count threshold (運作狀態檢查計數閾值)**) 數值，然後開始將流量路由傳送至這些執行個體。若未設定[運作狀態檢查 URL](environments-cfg-clb.md#using-features.managing.elb.healthchecks)，此流程可能會十分快速，因為只要執行個體接受 TCP 連線，就會立刻通過運作狀態檢查。若已設定運作狀態檢查 URL，負載平衡器則不會將流量路由至已更新的執行個體，除非執行個體回傳 `200 OK` 狀態碼以回應運作狀態檢查 URL 的 `HTTP GET` 請求。

Elastic Beanstalk 會等到批次內所有執行個體皆正常運作，才會繼續下一批次。若採用[基礎型運作狀態報告](using-features.healthstatus.md)，執行個體運作狀態取決於 Elastic Load Balancing 運作狀態檢查狀態。當批次內所有執行個體皆通過足以讓 Elastic Load Balancing 視為良好運作的運作狀態檢查時，此批次就會完成。若啟用[增強型運作狀態報告](health-enhanced.md)，Elastic Beanstalk 會考量其他數個因素，包括傳入請求的結果。使用增強型運作狀態報告時，Web 伺服器環境的所有執行個體都必須在兩分鐘內通過 12 項連續運作狀態檢查並取得 [OK 狀態](health-enhanced-status.md#health-enhanced-status-ok)，而工作者環境則必須在 3 分鐘內通過 18 項運作狀態檢查。

若執行個體批次未於[命令逾時](#environments-cfg-rollingdeployments-console)期間內恢復正常運作，則部署會失敗。部署失敗後，[會檢查環境中執行個體的運作狀態](health-enhanced-console.md)，以了解失敗的原因。然後執行其他部署具備固定或已知良好版本的應用程式與復原。

在一個或多個批次順利完成後仍部署失敗，已完成的批次會執行應用程式的新版本，而待定批次會持續執行舊的版本。您可於主控台的[運作狀態頁面](health-enhanced-console.md#health-enhanced-console-healthpage)，辨識您環境執行個體執行的版本。此頁面會顯示您環境執行個體最近執行的部署 ID。若您因部署失敗而終止執行個體，Elastic Beanstalk 會將其取代為執行最近成功部署的應用程式版本之執行個體。

## 流量分割部署的運作方式
<a name="environments-cfg-trafficsplitting-method"></a>

流量分割部署可讓您執行 Canary 測試。您可以先將一部分傳入用戶端流量導向您的新應用程式版本，驗證應用程式的運作狀態，再遞交到新版本並將所有流量導向新版本。

在流量分割部署期間，Elastic Beanstalk 會在個別的暫時 Auto Scaling 群組中建立新的一組執行個體。Elastic Beanstalk 接著會指示負載平衡器將您環境傳入流量中特定百分比的流量導向新的執行個體。然後，Elastic Beanstalk 會依設定的時間長度，持續追蹤這組新執行個體的運作狀態。如果一切順利，Elastic Beanstalk 會將其餘流量移動到新的執行個體，並將這些執行個體連接到環境的原始 Auto Scaling 群組，取代舊的執行個體。然後 Elastic Beanstalk 會進行清理，即終止舊執行個體並移除暫時 Auto Scaling 群組。

**注意**  
在流量分割部署期間，環境的容量不會變更。Elastic Beanstalk 會在暫時的 Auto Scaling 群組中啟動執行個體，其數量與部署開始時原始 Auto Scaling 群組中的執行個體數相同。接著在部署的持續時間內，兩個 Auto Scaling 群組都維持固定的執行個體數。請在設定環境的流量分割評估時間時將此納入考量。

將部署轉返到先前的應用程式版本相當快速，且不會對服務用戶端流量造成影響。如果新的執行個體並未通過運作狀態檢查，或是您選擇中止部署，Elastic Beanstalk 會將流量移回舊的執行個體並終止新的執行個體。您可以使用 Elastic Beanstalk 主控台的環境概觀頁面，選擇 **Environment actions** (環境動作) 中的 **Abort current operation** (中止目前操作) 來中止任何部署。您也可以呼叫 [AbortEnvironmentUpdate](https://docs.aws.amazon.com/elasticbeanstalk/latest/api/API_AbortEnvironmentUpdate.html) API 或相等的 AWS CLI 命令。

流量分割部署需要 Application Load Balancer。Elastic Beanstalk 根據預設會在您使用 Elastic Beanstalk 主控台或 EB CLI 建立環境時使用此負載平衡器類型。

## 部署選項命名空間
<a name="environments-cfg-rollingdeployments-namespace"></a>

您可以使用 [`aws:elasticbeanstalk:command`](command-options-general.md#command-options-general-elasticbeanstalkcommand) 命名空間中的[組態選項](command-options.md)來設定您的部署。若您選擇流量分割政策，此政策的其他選項可在 [`aws:elasticbeanstalk:trafficsplitting`](command-options-general.md#command-options-general-elasticbeanstalktrafficsplitting) 命名空間中取得。

透過 `DeploymentPolicy` 選項設定部署類型，支援下列值：

 
+ `AllAtOnce` - 停用滾動部署，並一律同時部署至所有執行個體。
+ `Rolling` - 啟用標準滾動部署。
+ `RollingWithAdditionalBatch` - 啟動執行個體的額外批次，再啟動部署，以維持完整容量。
+ `Immutable` - 針對每個部署執行[不可變更新](environmentmgmt-updates-immutable.md)。
+ `TrafficSplitting` - 執行流量分割部署來針對您的應用程式部署進行 Canary 測試。

當您啟用滾動部署，請設定 `BatchSize` 和 `BatchSizeType` 選項，進行各個批次大小的設定。例如，若要在每個批次中部署 25% 的執行個體，請指定下列選項和值。

**Example .ebextensions/rolling-updates.config**  

```
option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: Rolling
    BatchSizeType: Percentage
    BatchSize: 25
```

無論執行中的執行個體數量為何，若要在每個批次中部署五個執行個體，並在從服務移除執行個體前安裝五個執行新版本的執行個體額外批次，請指定下列選項和值。

**Example .ebextensions/rolling-additionalbatch.config**  

```
option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: RollingWithAdditionalBatch
    BatchSizeType: Fixed
    BatchSize: 5
```

欲針對運作狀態檢查閾值為 **Warning (警告)** 的部署執行不可變動的更新作業，而且即使批次內執行個體未於 15 分鐘的逾時期間內通過運作狀態檢查，仍要繼續部署，請指定下列選項和值。

**Example .ebextensions/immutable-ignorehealth.config**  

```
option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: Immutable
    HealthCheckSuccessThreshold: Warning
    IgnoreHealthCheck: true
    Timeout: "900"
```

如要執行流量分割部署，請將用戶端流量的 15% 轉送至新的應用程式版本並評估運作狀態 10 分鐘，請遵循下列選項和值。

**Example .ebextensions/traffic-splitting.config**  

```
option_settings:
  aws:elasticbeanstalk:command:
    DeploymentPolicy: TrafficSplitting
  aws:elasticbeanstalk:trafficsplitting:
    NewVersionPercent: "15"
    EvaluationTime: "10"
```

EB CLI 和 Elastic Beanstalk 主控台會為前述選項套用建議的數值。若您想要使用組態檔進行相同的設定，您必須移除這些設定。如需詳細資訊，請參閱「[建議值](command-options.md#configuration-options-recommendedvalues)」。