

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

# 將 CodeDeploy 與 Amazon EC2 Auto Scaling 整合
<a name="integrations-aws-auto-scaling"></a>

CodeDeploy 支援 Amazon EC2 Auto Scaling，這項 AWS 服務會根據您定義的條件自動啟動 Amazon EC2 執行個體。這些條件可能包括 CPU 使用率、磁碟讀取或寫入，或傳入或傳出網路流量的指定時間間隔內超過的限制。Amazon EC2 Auto Scaling 會在不再需要執行個體時終止執行個體。如需詳細資訊，請參閱「Amazon EC2 Auto Scaling 使用者指南」**中的[什麼是 Amazon EC2 自動擴展？](https://docs.aws.amazon.com/autoscaling/latest/userguide/WhatIsAutoScaling.html)。

當新的 Amazon EC2 執行個體作為 Amazon EC2 Auto Scaling 群組的一部分啟動時，CodeDeploy 可以自動將您的修訂部署到新的執行個體。您也可以使用向 Elastic Load Balancing 負載平衡器註冊的 Amazon EC2 Auto Scaling 執行個體來協調 CodeDeploy 中的部署。如需詳細資訊，請參閱[將 CodeDeploy 與 Elastic Load Balancing 整合](integrations-aws-elastic-load-balancing.md)及[在 Elastic Load Balancing 中為 CodeDeploy Amazon EC2 部署設定負載平衡器](deployment-groups-create-load-balancer.md)。

**注意**  
如果您將多個部署群組與單一 Amazon EC2 Auto Scaling 群組建立關聯，則可能會遇到問題。如果部署失敗，例如，執行個體會開始關閉，但其他執行中的部署需要一個小時才會逾時。如需詳細資訊，請參閱 [避免將多個部署群組與單一 Amazon EC2 Auto Scaling 群組建立關聯](troubleshooting-auto-scaling.md#troubleshooting-multiple-depgroups)和 [幕後：CodeDeploy 和 Amazon EC2 Auto Scaling 整合](https://aws.amazon.com/blogs/devops/under-the-hood-aws-codedeploy-and-auto-scaling-integration/)。

**Topics**
+ [將 CodeDeploy 應用程式部署至 Amazon EC2 Auto Scaling 群組](#integrations-aws-auto-scaling-deploy)
+ [在 Auto Scaling 縮減事件期間啟用終止部署](#integrations-aws-auto-scaling-behaviors-hook-enable)
+ [Amazon EC2 Auto Scaling 如何與 CodeDeploy 搭配使用](#integrations-aws-auto-scaling-behaviors)
+ [搭配 CodeDeploy 和 Amazon EC2 Auto Scaling 使用自訂 AMI](#integrations-aws-auto-scaling-custom-ami)

## 將 CodeDeploy 應用程式部署至 Amazon EC2 Auto Scaling 群組
<a name="integrations-aws-auto-scaling-deploy"></a>

若要將 CodeDeploy 應用程式修訂版部署至 Amazon EC2 Auto Scaling 群組：

1. 建立或尋找允許 Amazon EC2 Auto Scaling 群組使用 Amazon S3 的 IAM 執行個體描述檔。如需詳細資訊，請參閱[步驟 4：為您的 Amazon EC2 執行個體建立 IAM 執行個體描述檔](getting-started-create-iam-instance-profile.md)。
**注意**  
您也可以使用 CodeDeploy 將修訂從 GitHub 儲存庫部署到 Amazon EC2 Auto Scaling 群組。雖然 Amazon EC2 執行個體仍需要 IAM 執行個體設定檔，但設定檔不需要任何其他許可，即可從 GitHub 儲存庫進行部署。

1. 建立或使用 Amazon EC2 Auto Scaling 群組，在啟動組態或範本中指定 IAM 執行個體描述檔。如需詳細資訊，請參閱[在 Amazon EC2 執行個體上執行之應用程式的 IAM 角色](https://docs.aws.amazon.com/autoscaling/ec2/userguide/us-iam-role.html)。

1. 建立或尋找允許 CodeDeploy 建立包含 Amazon EC2 Auto Scaling 群組的部署群組的服務角色。

1. 使用 CodeDeploy 建立部署群組，指定 Amazon EC2 Auto Scaling 群組名稱、服務角色和其他幾個選項。如需詳細資訊，請參閱 [建立就地部署的部署群組 （主控台）](deployment-groups-create-in-place.md) 或 [建立就地部署的部署群組 （主控台）](deployment-groups-create-in-place.md) 。

1. 使用 CodeDeploy 將您的修訂部署到包含 Amazon EC2 Auto Scaling 群組的部署群組。

如需詳細資訊，請參閱[教學課程：使用 CodeDeploy 將應用程式部署至 Auto Scaling 群組](tutorials-auto-scaling-group.md)。

## 在 Auto Scaling 縮減事件期間啟用終止部署
<a name="integrations-aws-auto-scaling-behaviors-hook-enable"></a>

*終止部署*是一種 CodeDeploy 部署，會在 Auto Scaling [縮減事件發生](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html#as-lifecycle-scale-in)時自動啟動。CodeDeploy 會在 Auto Scaling 服務終止執行個體之前執行終止部署。在終止部署期間，CodeDeploy 不會部署任何項目。相反地，它會產生生命週期事件，您可以連接到自己的指令碼來啟用自訂關閉功能。例如，您可以將`ApplicationStop`生命週期事件連接到指令碼，在執行個體終止之前正常關閉應用程式。

如需 CodeDeploy 在終止部署期間產生的生命週期事件清單，請參閱 [生命週期事件掛鉤可用性](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-availability)。

如果終止部署因任何原因失敗，CodeDeploy 將允許執行個體終止繼續。這表示即使 CodeDeploy 未執行生命週期事件的完整集合 （或任何） 以完成，執行個體也會關閉。

如果您未啟用終止部署，Auto Scaling 服務仍會在縮減事件發生時終止 Amazon EC2 執行個體，但 CodeDeploy 不會產生生命週期事件。

**注意**  
無論您是否啟用終止部署，如果 Auto Scaling 服務在 CodeDeploy 部署進行期間終止 Amazon EC2 執行個體，則 Auto Scaling 和 CodeDeploy 服務所產生的生命週期事件之間可能會發生競爭條件。例如，`Terminating`生命週期事件 （由 Auto Scaling 服務產生） 可能會覆寫`ApplicationStart`事件 （由 CodeDeploy 部署產生）。在此案例中，您可能會遇到 Amazon EC2 執行個體終止或 CodeDeploy 部署失敗。

**啟用 CodeDeploy 以執行終止部署**
+ 在建立或更新部署**群組時，選取將終止關聯新增至 Auto Scaling ** 群組核取方塊。如需說明，請參閱 [建立就地部署的部署群組 （主控台）](deployment-groups-create-in-place.md)或 [建立 EC2/現場部署藍/綠部署的部署群組 （主控台）](deployment-groups-create-blue-green.md)。

  啟用此核取方塊會導致 CodeDeploy 將 [Auto Scaling 生命週期掛](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)鉤安裝到您在建立或更新 CodeDeploy 部署群組時指定的 Auto Scaling 群組。此掛鉤稱為*終止掛*鉤，並啟用終止部署。

**安裝終止掛鉤後，向內擴展 （終止） 事件會展開，如下所示：**

1. Auto Scaling 服務 （或只是 Auto Scaling) 判斷需要發生縮減事件，並聯絡 EC2 服務以終止 EC2 執行個體。

1. EC2 服務會開始終止 EC2 執行個體。執行個體會移至 `Terminating` 狀態，然後進入 `Terminating:Wait` 狀態。

1. 在 期間`Terminating:Wait`，Auto Scaling 會執行連接到 Auto Scaling 群組的所有生命週期掛鉤，包括 CodeDeploy 安裝的終止掛鉤。

1. 終止關聯會將通知傳送至 CodeDeploy 輪詢的 [Amazon SQS 佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)。

1. 收到通知時，CodeDeploy 會剖析訊息、執行一些驗證，以及執行[終止部署](#integrations-aws-auto-scaling-behaviors-hook-enable)。

1. 當終止部署執行時，CodeDeploy 會每五分鐘將活動訊號傳送至 Auto Scaling，讓它知道執行個體仍在運作中。

1. 到目前為止，EC2 執行個體仍然處於 `Terminating:Wait` 狀態 （或可能是 `Warmed:Pending:Wait` 狀態，如果您已啟用 [Auto Scaling 群組暖集區](https://docs.aws.amazon.com/autoscaling/ec2/userguide/warm-pool-instance-lifecycle.html))。

1. 部署完成時，CodeDeploy `CONTINUE`會向 EC2 終止程序指示 Auto Scaling，無論終止部署是否成功。

## Amazon EC2 Auto Scaling 如何與 CodeDeploy 搭配使用
<a name="integrations-aws-auto-scaling-behaviors"></a>

當您建立或更新 CodeDeploy 部署群組以包含 Auto Scaling 群組時，CodeDeploy 會使用 CodeDeploy 服務角色存取 Auto Scaling 群組，然後將 [Auto Scaling 生命週期掛鉤](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)安裝到您的 Auto Scaling 群組。

**注意**  
*Auto Scaling 生命週期關聯*與 CodeDeploy 產生的*生命週期事件* （也稱為*生命週期事件關聯*) 不同，如本指南[AppSpec 'hooks' 區段](reference-appspec-file-structure-hooks.md)的 所述。

CodeDeploy 安裝的 Auto Scaling 生命週期關聯如下：
+ **啟動勾點** — 此勾點會通知 CodeDeploy 正在進行 Auto Scaling [向外擴展事件](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html#as-lifecycle-scale-out)，且 CodeDeploy 需要啟動啟動部署。

  在*啟動部署*期間，CodeDeploy：
  + 將應用程式的修訂部署到向外擴展的執行個體。
  + 產生生命週期事件以指出部署的進度。您可以將這些生命週期事件連接到您自己的指令碼，以啟用自訂啟動功能。如需詳細資訊，請參閱 中的 資料表[生命週期事件掛鉤可用性](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-availability)。

  啟動關聯和相關聯的啟動部署一律會啟用，且無法關閉。
+ **終止關聯** — 此選用關聯會通知 CodeDeploy Auto Scaling [縮減事件](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html#as-lifecycle-scale-in)正在進行中，且 CodeDeploy 需要啟動終止部署。

  在*終止部署*期間，CodeDeploy 會產生生命週期事件，以指出執行個體關閉的進度。如需詳細資訊，請參閱[在 Auto Scaling 縮減事件期間啟用終止部署](#integrations-aws-auto-scaling-behaviors-hook-enable)。

**Topics**
+ [CodeDeploy 安裝生命週期掛鉤後，如何使用它們？](#integrations-aws-auto-scaling-behaviors-hook-usage)
+ [CodeDeploy 如何命名 Amazon EC2 Auto Scaling 群組](#integrations-aws-auto-scaling-behaviors-naming)
+ [自訂生命週期關聯事件的執行順序](#integrations-aws-auto-scaling-behaviors-hook-order)
+ [部署期間的橫向擴展事件](#integrations-aws-auto-scaling-behaviors-mixed-environment)
+ [部署期間的縮減事件](#integrations-aws-auto-scaling-behaviors-scale-in)
+ [AWS CloudFormation cfn-init 指令碼中的事件順序](#integrations-aws-auto-scaling-behaviors-event-order)

### CodeDeploy 安裝生命週期掛鉤後，如何使用它們？
<a name="integrations-aws-auto-scaling-behaviors-hook-usage"></a>

安裝啟動和終止生命週期掛鉤後，CodeDeploy 會在 Auto Scaling 群組向外擴展和向內擴展事件期間分別使用這些掛鉤。

**向外擴展 （啟動） 事件展開方式如下：**

1. Auto Scaling 服務 （或只是 Auto Scaling) 判斷需要發生橫向擴展事件，並聯絡 EC2 服務以啟動新的 EC2 執行個體。

1. EC2 服務會啟動新的 EC2 執行個體。執行個體會移至 `Pending` 狀態，然後進入 `Pending:Wait` 狀態。

1. 在 期間`Pending:Wait`，Auto Scaling 會執行連接到 Auto Scaling 群組的所有生命週期掛鉤，包括 CodeDeploy 安裝的啟動掛鉤。

1. 啟動勾點會將通知傳送至 CodeDeploy 輪詢的 [Amazon SQS 佇列](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)。

1. 收到通知時，CodeDeploy 會剖析訊息、執行一些驗證，並啟動[啟動部署](#launch-deployment)。

1. 當啟動部署執行時，CodeDeploy 每五分鐘會將活動訊號傳送至 Auto Scaling，讓它知道執行個體仍在運作中。

1. 到目前為止，EC2 執行個體仍然處於 `Pending:Wait` 狀態。

1. 部署完成時，CodeDeploy 會指示 Auto Scaling 為 `CONTINUE`或 `ABANDON` EC2 啟動程序，取決於部署是否成功。
   + 如果 CodeDeploy 指出 `CONTINUE`，Auto Scaling 會繼續啟動程序，等待其他勾點完成，或將執行個體放入 `Pending:Proceed`，然後進入 `InService` 狀態。
   + 如果 CodeDeploy 指出 `ABANDON`，Auto Scaling 會終止 EC2 執行個體，並視需要重新啟動啟動程序，以符合 Auto Scaling **所需容量**設定中定義的所需執行個體數量。

**向內擴展 （終止） 事件展開方式如下：**

請參閱 [在 Auto Scaling 縮減事件期間啟用終止部署](#integrations-aws-auto-scaling-behaviors-hook-enable)。

### CodeDeploy 如何命名 Amazon EC2 Auto Scaling 群組
<a name="integrations-aws-auto-scaling-behaviors-naming"></a>

 

在 EC2/現場部署運算平台上的藍/綠部署期間，您有兩個選項可將執行個體新增至替代 （綠色） 環境：
+  使用您手動建立或現有的執行個體。
+  使用您指定的 Amazon EC2 Auto Scaling 群組中的設定，在新的 Amazon EC2 Auto Scaling 群組中定義和建立執行個體。

 如果您選擇第二個選項，CodeDeploy 會為您佈建新的 Amazon EC2 Auto Scaling 群組。它使用以下慣例來為群組命名：

```
CodeDeploy_deployment_group_name_deployment_id
```

例如，如果具有 ID `10` 的部署部署部署了名為 的部署群組`alpha-deployments`，則佈建的 Amazon EC2 Auto Scaling 群組會命名為 `CodeDeploy_alpha-deployments_10`。如需詳細資訊，請參閱 [建立 EC2/現場部署藍/綠部署的部署群組 （主控台）](deployment-groups-create-blue-green.md) 和 [GreenFleetProvisioningOption](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_GreenFleetProvisioningOption.html)。

### 自訂生命週期關聯事件的執行順序
<a name="integrations-aws-auto-scaling-behaviors-hook-order"></a>

您可以將自己的生命週期掛鉤新增至 CodeDeploy 部署的 Amazon EC2 Auto Scaling 群組。不過，就 CodeDeploy 預設部署生命週期事件而言，執行這些自訂生命週期關聯事件的順序無法預先決定。例如，如果您將名為 的自訂生命週期掛鉤`ReadyForSoftwareInstall`新增至 Amazon EC2 Auto Scaling 群組，則無法事先知道該掛鉤是在 CodeDeploy 預設部署生命週期事件的第一個之前或之後執行。

若要了解如何將自訂生命週期掛鉤新增至 Amazon EC2 Auto Scaling 群組，請參閱《*Amazon EC2 Auto Scaling 使用者指南*》中的[新增生命週期掛鉤](https://docs.aws.amazon.com/autoscaling/latest/userguide/lifecycle-hooks.html#adding-lifecycle-hooks)。

### 部署期間的橫向擴展事件
<a name="integrations-aws-auto-scaling-behaviors-mixed-environment"></a>

如果在部署進行時發生 Auto Scaling 橫向擴展事件，新的執行個體將使用先前部署的應用程式修訂版更新，而不是最新的應用程式修訂版。如果部署成功，舊執行個體和新向外擴展的執行個體將託管不同的應用程式修訂。為了讓舊版的執行個體保持最新狀態，CodeDeploy 會自動啟動後續部署 （緊接在第一個執行個體之後），以更新任何過期的執行個體。如果您想要變更此預設行為，讓過期的 EC2 執行個體保留在較舊的修訂版中，請參閱 [Automatic updates to outdated instances](deployment-groups-configure-advanced-options.md#auto-updates-outdated-instances)。

如果您想要在部署進行時暫停 Amazon EC2 Auto Scaling 向外擴展程序，您可以透過`common_functions.sh`指令碼中的設定來執行此操作，該設定用於與 CodeDeploy 進行負載平衡。如果 `HANDLE_PROCS=true`，下列 Auto Scaling 事件會在部署程序期間自動暫停：
+ AZRebalance
+ AlarmNotification
+ ScheduledActions
+ ReplaceUnhealthy

**重要**  
只有 CodeDeployDefault.OneAtATime 部署組態支援此功能。

如需使用 `HANDLE_PROCS=true`以避免使用 Amazon EC2 Auto Scaling 時發生部署問題的詳細資訊，請參閱 GitHub 上有關在 [aws-codedeploy-samples](https://github.com/awslabs/aws-codedeploy-samples) 中[處理 AutoScaling 程序的重要通知](https://github.com/awslabs/aws-codedeploy-samples/tree/master/load-balancing/elb#important-notice-about-handling-autoscaling-processes)。

### 部署期間的縮減事件
<a name="integrations-aws-auto-scaling-behaviors-scale-in"></a>

如果 Auto Scaling 群組在該 Auto Scaling 群組上正在進行 CodeDeploy 部署時開始擴展，則終止程序 （包括 CodeDeploy 終止部署生命週期事件） 與終止執行個體上的其他 CodeDeploy 生命週期事件之間可能會發生競爭條件。如果執行個體在所有 CodeDeploy 生命週期事件完成之前終止，則該特定執行個體上的部署可能會失敗。此外，整體 CodeDeploy 部署可能會失敗，也可能不會失敗，取決於您在部署組態中設定**最低運作狀態良好的主機**設定的方式。

### AWS CloudFormation cfn-init 指令碼中的事件順序
<a name="integrations-aws-auto-scaling-behaviors-event-order"></a>

如果您在最新佈建的 Linux-based 執行個體上使用 `cfn-init`​ (或 `cloud-init`​) 執行命令碼，您的部署可能失敗，除非您在執行個體啟動後嚴格控制事件發生順序。

這順序必須：

1. 新佈建的新執行個體啟動。

1. 所有 `cfn-init` 引導操作命令碼完成執行。

1. CodeDeploy 代理程式啟動。

1. 將最新的應用程式修訂版部署到執行個體中。

如果未仔細控制事件順序，CodeDeploy 代理程式可能會在所有指令碼完成執行之前開始部署。

若要控制事件的順序，請使用這些最佳實務：
+ 透過`cfn-init`指令碼安裝 CodeDeploy 代理程式，將其放置在所有其他指令碼之後。
+ 在自訂 AMI 中包含 CodeDeploy 代理程式，並使用`cfn-init`指令碼來啟動它，將它放在所有其他指令碼之後。

如需使用 的詳細資訊`cfn-init`，請參閱*AWS CloudFormation 《 使用者指南*》中的 [cfn-init](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html)。

## 搭配 CodeDeploy 和 Amazon EC2 Auto Scaling 使用自訂 AMI
<a name="integrations-aws-auto-scaling-custom-ami"></a>

在 Amazon EC2 Auto Scaling 群組中啟動新的 Amazon EC2 執行個體時，您有兩個選項可指定要使用的基本 AMI：
+ 您可以指定已安裝 CodeDeploy 代理程式的基本自訂 AMI。由於代理程式已安裝，此選項會比其他選項更快速地啟動新的 Amazon EC2 執行個體。不過，此選項提供更大的可能性，讓 Amazon EC2 執行個體的初始部署失敗，特別是在 CodeDeploy 代理程式過期時。如果您選擇此選項，我們建議您定期更新基本自訂 AMI 中的 CodeDeploy 代理程式。
+ 您可以指定未安裝 CodeDeploy 代理程式的基本 AMI，並在 Amazon EC2 Auto Scaling 群組中啟動每個新執行個體時安裝代理程式。雖然此選項啟動新的 Amazon EC2 執行個體的速度比其他選項慢，但執行個體初始部署成功的可能性更大。此選項使用最新版本的 CodeDeploy 代理程式。