建立 Amazon ECS 藍/綠部署
透過使用 Amazon ECS 藍/綠部署,您可以進行服務變更並加以測試,然後在生產環境中實作這些變更。
先決條件
開始藍/綠部署之前,請執行下列動作。
-
設定相應的許可。
-
如需有關 Elastic Load Balancing 許可的資訊,請參閱負載平衡器的 Amazon ECS 基礎結構 IAM 角色。
-
如需有關 Lambda 許可的資訊,請參閱 Amazon ECS 藍/綠部署中 Lambda 函式所需的許可
-
-
Amazon ECS 藍/綠部署要求服務使用下列其中一項功能:設定相應的資源。
-
Application Load Balancer – 如需詳細資訊,請參閱適用於藍/綠部署的 Application Load Balancer 資源。
-
Network Load Balancer – 如需詳細資訊,請參閱適用於 Amazon ECS 藍/綠部署的 Network Load Balancer 資源。
-
Service Connect – 如需詳細資訊,請參閱Amazon ECS 藍/綠部署的服務連線資源。
-
-
建立規則,將流量路由至綠色服務修訂版。如需詳細資訊,請參閱 Network Load Balancer User Guide 中的 Listener rules。
-
為綠色服務修訂版建立目標群組。為任務使用
awsvpc網路模式時,目標類型必須是ip。如需有關目標群組的資訊,請參閱 Network Load Balancer User Guide 中的 Target groups。 -
決定是否要為生命週期事件執行 Lambda 函式。
-
向上擴展前
-
向上擴展後
-
測試流量轉移
-
測試流量轉移後
-
生產流量轉移
-
生產流量轉移後
為每個生命週期事件建立 Lambda 函式。如需詳細資訊,請參閱 AWS Lambda Developer Guide 中的 Create a Lambda function with the console。
-
程序
您可以使用主控台或 AWS CLI 來建立 Amazon ECS 藍/綠服務。
- Console
-
開啟主控台,網址為 https://console.aws.amazon.com/ecs/v2
。 -
決定您要從中啟動服務的資源。
啟動服務的資源 步驟 叢集
-
在叢集頁面,選取您要在哪個叢集中建立服務。
「叢集詳細資訊」頁面隨即顯示。
-
在 Services (服務) 標籤上,選擇 Create (建立)。
任務定義 -
在任務定義頁面中選取任務定義。
-
從部署功能表中選擇建立服務。
建立服務頁面隨即顯示。
-
-
在服務詳細資訊下,執行下列動作:
-
在任務定義系列欄位中選擇要使用的任務定義。然後,在任務定義修訂版欄位中輸入要使用的修訂版。
-
針對 Service name (服務名稱),輸入服務的名稱。
-
-
若要在現有叢集中執行服務,請在現有叢集欄位中選擇叢集。若要在新叢集中執行服務,請選擇建立叢集
-
選擇任務在叢集基礎結構中的分佈方式。在運算組態下選擇選項。
運算選項 步驟 容量提供者策略
-
在 Compute options (運算選項) 下,選擇 Capacity provider strategy (容量提供者策略)。
-
選擇策略:
-
若要使用叢集的預設容量提供者策略,選擇使用叢集預設。
-
若您的叢集沒有預設容量提供者策略,或要使用自訂策略,選擇 Use custom (使用自訂)、Add capacity provider strategy (新增容量提供者策略),然後透過指定 Base (基礎)、Capacity provider (容量提供者) 和 Weight (權重) 來定義您的自訂容量提供者策略。
-
注意
若要在策略中使用容量提供者,容量提供者必須與叢集相關聯。
啟動類型 -
在運算選項區段中,選取啟動類型。
-
針對 啟動類型,選擇啟動類型。
-
(選用) 當指定 Fargate 時,請在平台版本欄位中指定要使用的平台版本。如果未指定平台版本,將使用
LATEST平台版本。
-
-
在部署組態下,執行下列動作:
-
在服務類型欄位中選擇複本。
-
針對 Desired tasks (所需任務),輸入要在服務中啟動並維護的任務數。
-
若要讓 Amazon ECS 監控可用區域間的任務分佈,並在出現不平衡時重新分佈,請在可用區域服務重新平衡下,選取可用區域服務重新平衡。
-
在運作狀態檢查寬限期欄位中,輸入時間 (以秒為單位),這是服務排程器在任務首次啟動後忽略運作狀態不良的 Elastic Load Balancing、VPC Lattice 與容器運作狀態檢查的時間。如果您未指定運作狀態檢查寬限期間值,則會使用預設值 0。
-
-
-
在封裝時間欄位中,輸入在藍色修訂版終止之前,藍色與綠色服務修訂版將同時執行的分鐘數。這為驗證與測試提供了時間。
-
(選用) 執行要在部署的特定階段執行的 Lambda 函式。在部署 lifecycle hook 下,選取要執行 lifecycle hook 的階段。
若要新增 lifecycle hook:
-
選擇新增。
-
在 Lambda 函式欄位中,輸入函式名稱或 ARN。
-
在角色欄位中,選取具有調用 Lambda 函式許可的 IAM 角色。
-
在生命週期階段欄位中,選取 Lambda 函式應執行的階段。
-
-
-
若要設定 Amazon ECS 如何偵測並處理部署失敗,請展開 Deployment failure detection (部署失敗偵測),然後選擇您的選項。
-
若要在任務無法啟動時停止部署,請選取 Use the Amazon ECS deployment circuit breaker (使用 Amazon ECS 部署斷路器)。
在部署斷路器將部署設定為失敗狀態時,若要讓軟體自動將部署復原至上次完成的部署狀態,請選取失敗時復原。
-
若要根據應用程式指標停止部署,請選取使用 CloudWatch 警示。然後,從CloudWatch 警示名稱欄位中選擇警示。要建立新的警示,請前往 CloudWatch 主控台。
在 CloudWatch 警示將部署設定為失敗狀態時,若要讓軟體自動將部署復原至上次完成的部署狀態,請選取失敗時復原。
-
-
(選用) 若要使用 Service Connect 與服務互連,請展開 Service Connect 區段,然後指定下列項目:
-
選取開啟 Service Connect。
-
在 Service Connect configuration (Service Connect 組態) 下,指定用戶端模式。
-
如果服務執行的網路用戶端應用程式只需要連線至命名空間中的其他服務,請選擇僅用戶端。
-
如果服務執行的是網路或 Web 服務應用程式,且需要為此服務提供端點,並連線至命名空間中的其他服務,請選擇 Client and server (用戶端和伺服器)。
-
-
若要使用非預設叢集命名空間的命名空間,請在 Namespace (命名空間) 欄位中選擇服務命名空間。這可以是在 AWS 帳戶中同一 AWS 區域中單獨建立的命名空間,也可以是使用 AWS Resource Access Manager (AWS RAM) 與帳戶共用的同一區域中的命名空間。如需有關共用 AWS Cloud Map 命名空間的詳細資訊,請參閱 AWS Cloud Map Developer Guide 中的 Cross-account AWS Cloud Map namespace sharing。
-
(選用) 設定藍/綠部署的測試流量標頭規則。在測試流量路由下,指定下列項目:
-
選取啟用測試流量標頭規則,以在測試期間將特定請求路由至綠色服務修訂版。
-
在標頭比對規則欄位中,設定路由測試流量的條件:
-
標頭名稱:輸入要比對的 HTTP 標頭名稱 (例如
X-Test-Version或User-Agent)。 -
比對類型:選擇比對條件:
-
完全相符:標頭值與指定值完全相符的路由請求
-
標頭存在:包含指定標頭的路由請求,無論其值為何
-
模式比對:標頭值與指定模式相符的路由請求
-
-
標頭值 (如果使用「完全相符」或「模式相符」):輸入要比對的值或模式。
您可以新增多個標頭比對規則來建立複雜的路由邏輯。符合任何已設定規則的請求將路由至綠色服務修訂版進行測試。
-
-
選擇新增標頭規則以設定其他標頭比對條件。
注意
測試流量標頭規則讓您可以在完成完整部署之前,使用受控流量驗證新功能。這允許您使用特定請求 (例如來自內部測試工具或 Beta 版使用者的請求) 測試綠色服務修訂版,同時維持流向藍色服務修訂版的正常流量流程。
-
-
(選用) 指定日誌組態。選取使用日誌收集。預設選項會將容器日誌傳送至 CloudWatch 日誌。其他日誌驅動程式選項會使用 AWS FireLens 來設定。如需更多詳細資訊,請參閱 將 Amazon ECS 日誌傳送至 AWS 服務或 AWS Partner。
下方更詳細地描述了每個容器日誌目的地。
-
Amazon CloudWatch – 將任務設定為將容器日誌傳送至 CloudWatch Logs。系統會提供預設日誌驅動程式選項,用來代表您建立 CloudWatch 日誌群組。若要指定不同的日誌群組名稱,請變更驅動程式選項值。
-
Amazon Data Firehose – 將任務設定為將容器日誌傳送至 Firehose。系統會提供預設日誌驅動程式選項,用來將日誌傳送至 Firehose 傳送串流。若要指定不同的交付串流名稱,請變更驅動程式選項值。
-
Amazon Kinesis Data Streams – 將任務設定為將容器日誌傳送至 Amazon Kinesis Data Streams。系統會提供預設日誌驅動程式選項,用來將日誌傳送至 Kinesis Data Streams 串流。若要指定不同的串流名稱,請變更驅動程式選項值。
-
Amazon OpenSearch Service – 將任務設定為將容器日誌傳送至 OpenSearch Service 網域。務必提供日誌驅動程式選項。
-
Amazon S3:將任務設定為將容器日誌傳送至 Amazon S3 儲存貯體。系統會提供預設日誌驅動程式選項,但您必須指定有效的 Amazon S3 儲存貯體名稱。
-
-
-
(選用) 設定藍/綠部署的負載平衡。
Elastic Load Balancing 類型 步驟 Application Load Balancer
-
在負載平衡器類型欄位中選擇 Application Load Balancer。
-
選擇 Create a new load balancer (建立新的負載平衡器) 以建立新的 Application Load Balancer,或者 Use an existing load balancer (使用現有負載平衡器) 以選擇現有的 Application Load Balancer。
-
在容器欄位中選擇託管服務的容器。
-
針對 Load balancer name (負載平衡器名稱),輸入不重複的名稱。
-
針對 Listener (接聽程式),為 Application Load Balancer 輸入連接埠和協定,以偵聽連接請求。根據預設,負載平衡器將被設定為使用連接埠 80 和 HTTP。
-
在生產規則欄位中,輸入規則的評估順序與路徑模式。
此規則適用於生產 (藍色) 服務修訂版流量。
-
在測試規則欄位中,輸入規則的評估順序與路徑模式。
此規則適用於測試 (綠色) 服務修訂版流量。
-
-
在目標群組欄位中設定下列項目:
-
針對 Target group name (目標群組名稱),為目標群組輸入名稱和協定,Application Load Balancer 會將請求路由至該群組。
-
在通訊協定欄位中,選擇 Application Load Balancer 向其路由請求之目標群組的通訊協定。根據預設,目標群組會將請求路由至您的任務定義中定義的第一個容器。
-
在取消註冊延遲欄位中,輸入負載平衡器將目標狀態變更為
UNUSED的秒數。預設為 300 秒。 -
針對 Health check path (運作狀態檢查路徑),輸入容器中的現有路徑,Application Load Balancer 會在該容器中定期傳送請求,以驗證 Application Load Balancer 和容器之間的連接狀態。預設使用根目錄 (
/)。 -
在替代群組名稱欄位中,輸入測試 (綠色) 服務修訂版的目標群組名稱。
-
Network Load Balancer -
針對 Load balancer type (負載平衡器類型),選取 Network Load Balancer。
-
針對 Load Balancer (負載平衡器),選擇現有的 Network Load Balancer。
-
針對 Choose container to load balance (選擇進行負載平衡的容器),選擇託管服務的容器。
-
在生產接聽程式欄位中,選擇生產接聽程式連接埠與生產接聽程式通訊協定。
這是用於生產 (藍色) 服務修訂版流量的接聽程式。
-
在測試接聽程式欄位中,選擇測試接聽程式連接埠與測試接聽程式通訊協定。
這是用於測試 (綠色) 服務修訂版流量的接聽程式。
-
在目標群組欄位中設定下列項目:
-
針對 Target group name (目標群組名稱),為目標群組輸入名稱和協定,Network Load Balancer 會將請求路由至該群組。
-
在通訊協定欄位中,選擇 Network Load Balancer 向其路由請求之目標群組的通訊協定。根據預設,目標群組會將請求路由至您的任務定義中定義的第一個容器。
-
在取消註冊延遲欄位中,輸入負載平衡器將目標狀態變更為
UNUSED的秒數。預設為 300 秒。 -
針對 Health check path (運作狀態檢查路徑),輸入容器中的現有路徑,Application Load Balancer 會在該容器中定期傳送請求,以驗證 Application Load Balancer 和容器之間的連接狀態。預設使用根目錄 (
/)。 -
在替代群組名稱欄位中,輸入測試 (綠色) 服務修訂版的目標群組名稱。
-
-
-
(選用) 為協助識別您的服務和任務,請展開 Tags (標籤) 區段,然後設定標籤。
若要讓 Amazon ECS 使用叢集名稱和任務定義標籤,自動標記所有新啟動的任務,請選取 Turn on Amazon ECS managed tags (開啟 Amazon ECS 受管標籤),然後針對 Propagate tags from (傳播標籤來源),選取 Task definitions (任務定義)。
若要讓 Amazon ECS 使用叢集名稱和服務標籤,自動標記所有新啟動的任務,請選取 Turn on Amazon ECS managed tags (開啟 Amazon ECS 受管標籤),然後針對 Propagate tags from (傳播標籤來源),選取 Service (服務)。
新增或移除標籤。
-
[新增標籤] 選擇新增標籤,然後執行下列操作︰
-
在索引鍵中,輸入索引鍵名稱。
-
在值中,進入索引鍵值。
-
-
[移除標籤] 在標籤旁邊,選擇移除標籤。
-
-
選擇建立。
- AWS CLI
-
-
建立名為
service-definition.json且具有下列內容的檔案。將
user-input取代為實際值。{ "serviceName": "myBlueGreenService", "cluster": "arn:aws:ecs:us-west-2:123456789012:cluster/sample-fargate-cluster", "taskDefinition": "sample-fargate:1", "desiredCount": 5, "launchType": "FARGATE", "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-09ce6e74c116a2299", "subnet-00bb3bd7a73526788", "subnet-0048a611aaec65477" ], "securityGroups": [ "sg-09d45005497daa123" ], "assignPublicIp": "ENABLED" } }, "deploymentController": { "type": "ECS" }, "deploymentConfiguration": { "strategy": "BLUE_GREEN", "maximumPercent": 200, "minimumHealthyPercent": 100, "bakeTimeInMinutes": 2, "alarms": { "alarmNames": [ "myAlarm" ], "rollback": true, "enable": true }, "lifecycleHooks": [ { "hookTargetArn": "arn:aws:lambda:us-west-2:7123456789012:function:checkExample", "roleArn": "arn:aws:iam::123456789012:role/ECSLifecycleHookInvoke", "lifecycleStages": [ "PRE_SCALE_UP" ] } ] }, "loadBalancers": [ { "targetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/blue-target-group/54402ff563af1197", "containerName": "fargate-app", "containerPort": 80, "advancedConfiguration": { "alternateTargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/green-target-group/cad10a56f5843199", "productionListenerRule": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-blue-green-demo/32e0e4f946c3c05b/9cfa8c482e204f7d/831dbaf72edb911", "roleArn": "arn:aws:iam::123456789012:role/LoadBalancerManagementforECS" } } ] } -
執行
create-service。將
user-input取代為實際值。aws ecs create-service --cli-input-json file://service-definition.json或者,您可以使用下列範例來建立具有負載平衡器組態的藍/綠部署服務:
aws ecs create-service \ --cluster "arn:aws:ecs:us-west-2:123456789012:cluster/MyCluster" \ --service-name "blue-green-example-service" \ --task-definition "nginxServer:1" \ --launch-type "FARGATE" \ --network-configuration "awsvpcConfiguration={subnets=[subnet-12345,subnet-67890,subnet-abcdef,subnet-fedcba],securityGroups=[sg-12345],assignPublicIp=ENABLED}" \ --desired-count 3 \ --deployment-controller "type=ECS" \ --deployment-configuration "strategy=BLUE_GREEN,maximumPercent=200,minimumHealthyPercent=100,bakeTimeInMinutes=0" \ --load-balancers "targetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/MyBGtg1/abcdef1234567890,containerName=nginx,containerPort=80,advancedConfiguration={alternateTargetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/MyBGtg2/0987654321fedcba,productionListenerRule=arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/MyLB/1234567890abcdef/1234567890abcdef,roleArn=arn:aws:iam::123456789012:role/ELBManagementRole}"
-
後續步驟
更新服務以開始部署。如需更多詳細資訊,請參閱 更新 Amazon ECS 服務。
-
監控部署程序,確保其遵循藍/綠模式:
-
綠色服務修訂版已建立並向上擴展
-
測試流量會路由至綠色修訂版 (若已設定)
-
生產流量會轉移至綠色修訂版
-
封裝時間過期後,藍色修訂版會終止
-