CodeDeploy 與 Amazon EC2 Auto Scaling 集成 - AWS CodeDeploy

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

CodeDeploy 與 Amazon EC2 Auto Scaling 集成

CodeDeploy 支援 Amazon EC2 自 Auto Scaling,這是一項可根據您定義的條件自動啟動 Amazon EC2 執行個體的 AWS 服務。這些條件可能包括 CPU 使用率、磁碟讀取或寫入,或輸入或輸出網路流量的指定時間間隔內超過限制。Amazon EC2 Auto Scaling 會在不再需要執行個體時終止執行個體。如需詳細資訊,請參閱什麼是 Amazon EC2 Auto Scaling?Amazon EC2 Auto Scaling 用戶指南中。

當新的 Amazon EC2 執行個體作為 Amazon EC2 自動擴展群組的一部分啟動時, CodeDeploy 可以自動將您的修訂部署到新執行個體。您也可以 CodeDeploy使用使用 Elastic Load Balancing 負載平衡器註冊的 Amazon EC2 Auto Scaling 執行個體協調部署。如需詳細資訊,請參閱 Integrating CodeDeploy with Elastic Load Balancing在 Elastic Load Balancing 中為 CodeDeploy Amazon EC2 部署設定負載平衡器

注意

如果將多個部署群組與單一 Amazon EC2 Auto Scaling 群組建立關聯,可能會遇到問題。如果部署失敗,例如,執行個體會開始關閉,但其他執行中的部署需要一個小時才會逾時。如需詳細資訊,請參閱避免將多個部署群組與單一 Amazon EC2 Auto Scaling 群組建立關聯引擎蓋之下: CodeDeploy 和 Amazon EC2 Auto Scaling 整合

將 CodeDeploy 應用程式部署到 Amazon EC2 Auto Scaling 群組

若要將 CodeDeploy 應用程式修訂部署到 Amazon EC2 Auto Scaling 群組:

  1. 建立或尋找可讓 Amazon EC2 Auto Scaling 群組與 Amazon S3 搭配使用的 IAM 執行個體設定檔。如需詳細資訊,請參閱 步驟 4:為您的 Amazon EC2 執行個體建立 IAM 執行個體設定檔

    注意

    您也可以使用 CodeDeploy 將修訂從 GitHub 儲存庫部署到 Amazon EC2 Auto Scaling 群組。雖然 Amazon EC2 執行個體仍需要 IAM 執行個體設定檔,但設定檔不需要任何其他許可即可從 GitHub 儲存庫部署。

  2. 建立或使用 Amazon EC2 Auto Scaling 群組,並在啟動組態或範本中指定 IAM 執行個體設定檔。如需詳細資訊,請參閱在 Amazon EC2 執行個體上執行之應用程式的 IAM 角色

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

  4. 透過指定 Amazon EC2 Auto Scaling 群組名稱、服務角色和其他一些選項來建立部署群組。 CodeDeploy如需詳細資訊,請參閱 建立就地部署的部署群組 (主控台)建立就地部署的部署群組 (主控台)

  5. 用於 CodeDeploy 將修訂部署到包含 Amazon EC2 Auto Scaling 群組的部署群組。

如需詳細資訊,請參閱 教學課程:用 CodeDeploy 於將應用程式部署到 Auto Scaling 群組

在 Auto Scaling 擴充事件期間啟用終止部署

終止部署是一種部 CodeDeploy 署類型,會在發生 Auto Scaling 縮放事件時自動啟動。 CodeDeploy 在 Auto Scaling 服務終止執行個體之前,立即執行終止部署。在終止部署期間, CodeDeploy不會部署任何東西。相反地,它會產生生命週期事件,您可以連接到自己的指令碼,以啟用自訂關機功能。例如,您可以將ApplicationStop生命週期事件掛接到指令碼,該指令碼會在執行個體終止之前正常關閉應用程式。

若要取得終止部署期間 CodeDeploy 產生的生命週期事件清單,請參閱〈〉生命週期事件掛接可

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

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

注意

無論您是否啟用終止部署,如果 Auto Scaling 服務在 CodeDeploy 部署進行時終止 Amazon EC2 執行個體,則 Auto Scaling 產生的生命週期事件和 CodeDeploy 服務之間可能會出現競爭情形。例如,生命Terminating週期事件 (由 Auto Scaling 服務產生) 可能會覆寫ApplicationStart事件 (由部 CodeDeploy 署產生)。在這個案例中,您可能會遇到 Amazon EC2 執行個體終止或 CodeDeploy 部署失敗的情況。

啟用執行終止部署 CodeDeploy 的步驟

安裝終止勾點之後,縮放 (終止) 事件會展開如下:

  1. Auto Scaling 服務(或簡稱為 Auto Scaling)確定需要發生擴展事件,並聯繫 EC2 服務以終止 EC2 實例。

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

  3. 在期間Terminating:Wait,Auto Scaling 會執行附加至 Auto Scaling 群組的所有生命週期掛接,包括由安裝的終止勾點 CodeDeploy。

  4. 終止勾點會將通知傳送至由輪詢的 Amazon SQS 佇列。 CodeDeploy

  5. 收到通知後,會 CodeDeploy 剖析訊息、執行一些驗證,並執行終止部署。

  6. 執行終止部署時,每五分鐘會將活動訊號 CodeDeploy 傳送至 Auto Scaling,讓其知道執行個體仍在使用中。

  7. 到目前為止,EC2 實例仍處於狀Terminating:Wait態(如果啟用了 Auto Scaling 組暖池,則可能是Warmed:Pending:Wait狀態)。

  8. 部署完成時,無論終止部署是成功還是失敗,都會向 CONTINUE EC2 終止程序 CodeDeploy 指示 Auto Scaling。

亞馬遜 EC2 Auto Scaling 如何與 CodeDeploy

當您建立或更新 CodeDeploy 部署群組以包含 Auto Scaling 群組時,請使用 CodeDeploy 服務角色 CodeDeploy存取 Auto Scaling 群組,然後將 Auto Scaling 生命週期掛接安裝到 Auto Scaling 群組中。

注意

Auto Scaling 生命週期掛鉤 CodeDeploy 與本指南中所產生並說明AppSpec 「掛鉤」部分的生命週期事件 (也稱為生命週期事件掛接) 不同。

CodeDeploy 安裝的「Auto Scaling」生命週期掛鉤為:

  • 啟動勾點 — 此勾點通 CodeDeploy 知 Auto Scaling 向外延展事件正在進行中,且 CodeDeploy 需要啟動啟動部署。

    啟動部署期間, CodeDeploy:

    • 將應用程式的修訂版部署到向外延展的執行個體。

    • 產生生命週期事件以指示部署進度。您可以將這些生命週期事件連結至您自己的指令碼,以啟用自訂啟動功能。如需詳細資訊,請參閱中的表格生命週期事件掛接可

    啟動勾點和關聯的啟動部署永遠處於啟用狀態,且無法關閉。

  • 終止勾點 — 此選用勾點通 CodeDeploy 知 Auto Scaling 擴充事件正在進行中,且 CodeDeploy 需要啟動終止部署。

    終止部署期間, CodeDeploy 會產生生命週期事件以指出執行個體關閉的進度。如需詳細資訊,請參閱 在 Auto Scaling 擴充事件期間啟用終止部署

CodeDeploy安裝生命週期掛鉤後,如何使用它們?

安裝啟動和終止生命週期掛接後,它們會分別 CodeDeploy 在 Auto Scaling 群組向外延展和縮放事件期間使用。

向外延展 (啟動) 事件展開如下:

  1. Auto Scaling 服務(或簡稱為 Auto Scaling)確定需要發生向外擴展事件,並聯繫 EC2 服務以啟動新的 EC2 實例。

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

  3. 在期間Pending:Wait,Auto Scaling 會執行附加至 Auto Scaling 群組的所有生命週期掛鉤,包括由安裝的啟動掛接 CodeDeploy。

  4. 啟動勾點會將通知傳送至由輪詢的 Amazon SQS 佇列。 CodeDeploy

  5. 收到通知後,會 CodeDeploy 剖析訊息、執行一些驗證,然後啟動啟動部署

  6. 啟動部署正在執行時,每五分鐘會將活動訊號 CodeDeploy 傳送至 Auto Scaling,讓其知道執行個體仍在使用中。

  7. 到目前為止,EC2 實例仍處於狀Pending:Wait態。

  8. 部署完成時,根據部署成功還是CONTINUE失敗,向 Auto Scaling CodeDeploy 指示或 EC2 啟動程序。ABANDON

    • 如果 CodeDeploy 指示CONTINUE,Auto Scaling 會繼續啟動程序,或等待其他掛接程序完成,或是先將執行個體置於InService狀態。Pending:Proceed

    • 如果 CodeDeploy 指示ABANDON,Auto Scaling 會終止 EC2 執行個體,並在需要時重新啟動啟動程序以滿足所需的執行個體數量,如 Auto Scaling 所需容量設定中所定義。

縮放 (終止) 事件展開如下:

請參閱在 Auto Scaling 擴充事件期間啟用終止部署

如何 CodeDeploy 命名 Amazon EC2 Auto Scaling 組

在 EC2 /內部部署計算平台上進行藍/綠部署期間,您有兩個選項可將執行個體新增至替換 (綠色) 環境:

  • 使用您手動建立或現有的執行個體。

  • 使用您指定的 Amazon EC2 Auto Scaling 群組中的設定,在新的 Amazon EC2 Auto Scaling 群組中定義和建立執行個體。

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

CodeDeploy_deployment_group_name_deployment_id

例如,如果具有 ID 的部署部署名為的部署群組alpha-deployments,則10會命名為已佈建的 Amazon EC2 Auto Scaling 群組。CodeDeploy_alpha-deployments_10如需詳細資訊,請參閱 為EC2/內部部署藍/綠部署建立部署群組 (主控台)GreenFleetProvisioningOption

自訂生命週期掛接事件的執行順序

您可以將自己的生命週期掛鉤新增到 CodeDeploy 部署的 Amazon EC2 Auto Scaling 群組。但是,與預設部署生命週期事件相關的執行順序無法 CodeDeploy 預先確定這些自訂生命週期掛接事件的執行順序。例如,如果您將名為的自訂生命週期勾點新增ReadyForSoftwareInstall到 Amazon EC2 Auto Scaling 群組,您就無法事先知道它是要在第一個預設部署生命週期事件之前還是在最後一個 CodeDeploy預設部署生命週期事件之後執行。

若要了解如何將自訂生命週期勾點新增至 Amazon EC2 Auto Scaling 群組,請參閱 Amazon EC2 Auto Scaling 使用者指南中的新增生命週期勾點。

部署期間的向外延展事件

如果在部署進行時發生 Auto Scale-Out 擴充事件,則新執行個體將以先前部署的應用程式修訂版更新,而不是最新的應用程式修訂版本。如果部署成功,舊執行個體和新向外延展的執行個體將會裝載不同的應用程式修訂版本。若要使具有較舊版本的執行個體保持最新狀態,請 CodeDeploy自動啟動後續部署 (在第一個執行個體之後立即),以更新所有過期的執行個體。如果您想要變更此預設行為,讓過時的 EC2 執行個體保留在舊版本中,請參閱Automatic updates to outdated instances

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

  • AZRebalance

  • AlarmNotification

  • ScheduledActions

  • ReplaceUnhealthy

重要

只有 CodeDeployDefault. OneAtATIME 部署組態支援此功能。

有關在使用 Amazon EC2 Auto Scaling 時使用HANDLE_PROCS=true以避免部署問題的詳細資訊,請參閱(詳見)中有關處理 AutoScaling 程序的aws-codedeploy-samples重要注意事項 GitHub。

部署期間的擴充事件

如果 Auto Scaling 群組在該 Auto Scaling 群組上進行 CodeDeploy 部署時開始擴展,則終止程序 (包括終止部署生命週期事件) 與終止執行個體上的其他 CodeDeploy 生命週期事件之間可能會出現爭用情形。 CodeDeploy 如果在所有 CodeDeploy 生命週期事件完成之前終止執行個體,則該特定執行個體的部署可能會失敗。此外,整體 CodeDeploy 部署可能會失敗,也可能不會失敗,具體取決於您在部署組態中設定健全狀況最低主機設定的方式而定。

AWS CloudFormation cfn-init 腳本中的事件順序

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

這順序必須:

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

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

  3. CodeDeploy 代理程式會啟動。

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

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

若要控制事件的順序,請使用這些最佳實務:

  • 透過指cfn-init令碼安裝 CodeDeploy 代理程式,並將其置於所有其他指令碼之後。

  • 將 CodeDeploy 代理程式包含在自訂 AMI 中,並使用指cfn-init令碼啟動它,並將其置於所有其他指令碼之後。

若要取得有關使用的資訊cfn-init,請參閱《使AWS CloudFormation 用指南》中的 cfn-init

將自訂 AMI 與 CodeDeploy Amazon EC2 自 Auto Scaling 搭配使用

在 Amazon EC2 自動擴展群組中啟動新的 Amazon EC2 執行個體時,您有兩個選項可以指定要使用的基礎 AMI:

  • 您可以指定已安裝 CodeDeploy 代理程式的基本自訂 AMI。由於代理程式已安裝,因此此選項會比其他選項更快地啟動新的 Amazon EC2 執行個體。但是,此選項提供 Amazon EC2 執行個體初始部署失敗的可能性更大,尤其是在 CodeDeploy 代理程式過期的情況下。如果您選擇此選項,建議您定期更新基礎自訂 AMI 中的 CodeDeploy 代理程式。

  • 您可以指定未安裝 CodeDeploy 代理程式的基礎 AMI,並在 Amazon EC2 Auto Scaling 群組中啟動每個新執行個體時安裝代理程式。雖然此選項啟動新的 Amazon EC2 執行個體的速度比其他選項慢,但它提供了執行個體初始部署成功的可能性更大。此選項使用最新版本的 CodeDeploy代理程式。