AWS Copilot 提供便捷的命令列工具,讓開發者能快速佈署容器化應用程式至 Amazon ECS。透過 copilot init 命令,能輕鬆地將現有的 Dockerfile 佈署至 ECS,並自動組態負載平衡等必要資源。同時,文章也探討瞭如何使用 AWS CodeDeploy 執行藍綠佈署,以確保應用程式更新過程的穩定性和零停機時間。此外,文章也說明瞭如何利用 CloudWatch 指標設定自動擴充套件策略,根據 CPU 使用率等指標動態調整 ECS 服務的資源組態,以及如何透過 awslogs 驅動程式將容器日誌串流至 CloudWatch,方便日誌監控和分析。
使用 AWS Copilot 佈署容器化應用程式
問題描述
需要使用現有的 Dockerfile 快速佈署和管理負載平衡的 Web 服務,並遵循最佳實踐,在私有網路中執行。
解決方案
從 Dockerfile 開始,可以使用 AWS Copilot 快速佈署應用程式,其架構如圖 6-7 所示。
準備工作
- 確保已安裝 AWS Copilot CLI。
- 參考本章節程式碼倉函式庫中的步驟進行準備。
佈署步驟
檢查 ECS 服務連結角色是否存在:
aws iam list-roles --path-prefix /aws-service-role/ecs.amazonaws.com/如果角色已存在,則跳過下一步建立角色的步驟。
建立 ECS 服務連結角色(如果不存在):
aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com切換到本章節程式碼倉函式庫中的指定目錄:
cd 604-Deploy-Container-With-Copilot-CLI您可以使用自己的 Dockerfile 和內容替換範例內容,但需確保容器監聽 80/TCP 埠,或使用
copilot init命令組態其他埠。使用 AWS Copilot 佈署 NGINX Dockerfile 到 Amazon ECS:
copilot init --app web --name nginx --type 'Load Balanced Web Service' \ --dockerfile './Dockerfile' --port 80 --deploy如果未指定任何引數,
copilot init命令將引導您透過選單選擇佈署選項。驗證佈署結果: 佈署完成後,使用以下命令取得已佈署服務的資訊:
copilot svc show
清理資源
參考本章節程式碼倉函式庫中的步驟進行清理。
討論
AWS Copilot 提供了一個命令列介面,簡化了佈署到 Amazon ECS、AWS Fargate 和 AWS App Runner 的流程。它幫助簡化開發工作流程和佈署生命週期。
copilot init 命令在當前工作目錄中建立了一個名為 copilot 的目錄。您可以透過 manifest.yml 檔案檢視和自定義組態。
預設情況下,Copilot 建立了一個名為 test 的環境。您可以根據需要新增其他環境,並使用 copilot env init 命令保持環境之間的隔離。
Copilot 根據最佳實踐組態了所有必要的資源來託管容器在 Amazon ECS 上,例如佈署到多個可用區域、使用子網層級來分段流量,以及使用 AWS KMS 進行加密。
AWS Copilot 命令也可以嵌入到 CI/CD 管道中,以執行自動化佈署。事實上,Copilot 可以使用 copilot pipeline 命令協調 CI/CD 管道的建立和管理。
挑戰
重新組態您的負載平衡 Web 服務,以佈署到 AWS App Runner 而不是 Amazon ECS。
藍綠佈署更新容器
程式碼解析:
aws iam create-role --role-name ecsCodeDeployRole \
--assume-role-policy-document file://assume-role-policy.json
內容解密:
此命令用於建立一個名為 ecsCodeDeployRole 的 IAM 角色,並指定信任關係策略檔案 assume-role-policy.json。該角色將被 CodeDeploy 使用,以便與其他 AWS 服務互動,如 Amazon ECS。
aws iam create-role: 這是建立 IAM 角色的命令。--role-name ecsCodeDeployRole: 指定要建立的 IAM 角色名稱為ecsCodeDeployRole。--assume-role-policy-document file://assume-role-policy.json: 指定信任關係策略檔案的位置,該檔案定義了哪些服務可以擔任此角色。
aws iam attach-role-policy --role-name ecsCodeDeployRole \
--policy-arn arn:aws:iam::aws:policy/AWSCodeDeployRoleForECS
內容解密:
此命令將 AWSCodeDeployRoleForECS 策略附加到 ecsCodeDeployRole 角色,使其具有 CodeDeploy 操作 Amazon ECS 所需的許可權。
aws iam attach-role-policy: 將指定的策略附加到 IAM 角色的命令。--role-name ecsCodeDeployRole: 指定要附加策略的 IAM 角色名稱。--policy-arn arn:aws:iam::aws:policy/AWSCodeDeployRoleForECS: 指定要附加的策略 ARN,該策略是 AWS 管理的策略,提供了 CodeDeploy 操作 ECS 所需的許可權。
圖表說明:藍綠目標群組關聯
此圖示(圖 6-8)展示了藍綠佈署中目標群組的關聯情況。藍綠佈署是一種佈署策略,透過執行兩個相同的生產環境(藍色和綠色),並在它們之間切換流量,以實作零停機時間的更新和快速回復。
圖表解讀:
- 藍色環境:代表當前活躍的生產環境。
- 綠色環境:代表新版本的生產環境,在佈署過程中用於測試和驗證。
- 負載平衡器:負責將流量分配到藍色或綠色環境。
- 目標群組:用於將流量路由到特定的環境(藍色或綠色)。
透過這種方式,可以在不影響使用者經驗的情況下,安全地佈署新版本的應用程式,並在必要時快速回復到之前的版本。
使用 AWS CodeDeploy 進行藍綠佈署更新容器
在現代化的軟體開發流程中,持續整合和持續佈署(CI/CD)扮演著至關重要的角色。AWS 提供了一系列的服務來支援 CI/CD 實踐,其中 AWS CodeDeploy 是一項能夠自動化佈署應用程式到各種計算服務的工具。本文將重點介紹如何使用 AWS CodeDeploy 進行藍綠佈署,以更新容器化的應用程式。
藍綠佈署簡介
藍綠佈署是一種佈署策略,涉及兩個相同的生產環境,分別稱為「藍色」和「綠色」。在任何時候,其中一個環境是活躍的,處理所有生產流量,而另一個環境則是閒置的。當需要佈署新版本的應用程式時,新版本會被佈署到閒置的環境(例如,從藍色到綠色)。一旦新版本準備就緒,流量就會被切換到新的環境。這種方法可以最小化佈署新版本時的風險,因為如果新版本出現問題,可以快速將流量切換回舊版本。
使用 AWS CodeDeploy 進行藍綠佈署
AWS CodeDeploy 支援藍綠佈署策略,能夠與 Amazon ECS 和其他 AWS 服務無縫整合。下面是使用 AWS CodeDeploy 進行藍綠佈署的基本步驟:
建立目標群組:首先,為藍色和綠色環境分別建立目標群組。這可以透過 AWS CLI 命令
aws elbv2 create-target-group完成。aws elbv2 create-target-group --name "GreenTG" --port 80 --protocol HTTP --vpc-id $VPC_ID --target-type ip建立 CodeDeploy 應用程式和佈署群組:接下來,建立一個 CodeDeploy 應用程式和一個佈署群組。CodeDeploy 需要一些組態資訊,這些資訊可以透過一個範本檔案提供。
aws deploy create-application --application-name awscookbook-605 --compute-platform ECS準備 AppSpec 檔案:AppSpec 檔案包含了應用程式的資訊。使用
sed命令替換範本檔案中的變數,以產生最終的 AppSpec 檔案。sed -e "s|FargateTaskGreenArn|${FARGATE_TASK_GREEN_ARN}|g" appspec-template.yaml > appspec.yaml上傳 AppSpec 檔案到 S3:將 AppSpec 檔案上傳到 S3 儲存桶,以便 CodeDeploy 可以使用它。
aws s3 cp ./appspec.yaml s3://$BUCKET_NAME建立佈署組態和佈署:最後,建立一個佈署組態檔案,並使用它來建立一個新的佈署。
sed -e "s|S3BucketName|${BUCKET_NAME}|g" deployment-template.json > deployment.json aws deploy create-deployment --cli-input-json file://deployment.json
#### 內容解密:
aws elbv2 create-target-group:此命令用於建立一個新的目標群組,用於藍綠佈署中的綠色環境。aws deploy create-application:此命令建立了一個新的 CodeDeploy 應用程式。sed命令:用於替換範本檔案中的變數,產生最終的組態檔案。aws s3 cp:將 AppSpec 檔案上傳到 S3 儲存桶。aws deploy create-deployment:根據組態檔案建立一個新的佈署。
驗證和清理
在佈署完成後,可以透過 AWS 控制檯觀察佈署的狀態。驗證新版本應用程式是否正確執行,並且流量是否已經切換到新的環境。如果需要,可以觸發回復以還原到舊版本。
完成驗證後,請按照程式碼倉函式庫中的指示進行清理,以避免不必要的費用。
在 Amazon ECS 上自動擴充套件容器工作負載
自動擴充套件容器工作負載的重要性
在 AWS 上執行應用程式時,自動擴充套件是一項重要的機制,可以節省相關成本。它允許應用程式在負載增加時自動組態資源,並在應用程式閒置時移除資源。
實作步驟
- 建立 IAM 角色:首先,需要為自動擴充套件觸發器建立一個 IAM 角色。可以使用以下命令建立角色:
aws iam create-role –role-name AWSCookbook606ECS
–assume-role-policy-document file://task-execution-assume-role.json
然後,將必要的策略附加到該角色:
```bash
aws iam attach-role-policy --role-name AWSCookbook606ECS --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceAutoscaleRole
- 註冊可擴充套件目標:接下來,需要註冊一個可擴充套件目標:
aws application-autoscaling register-scalable-target
–service-namespace ecs
–scalable-dimension ecs:service:DesiredCount
–resource-id service/$ECS_CLUSTER_NAME/AWSCookbook606
–min-capacity 2
–max-capacity 4
3. **設定自動擴充套件策略**:使用範例組態檔案設定自動擴充套件策略,指定 50% 的平均 CPU 使用率作為目標:
```bash
aws application-autoscaling put-scaling-policy --service-namespace ecs \
--scalable-dimension ecs:service:DesiredCount \
--resource-id service/$ECS_CLUSTER_NAME/AWSCookbook606 \
--policy-name cpu50-awscookbook-606 --policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration file://scaling-policy.json
- 模擬高 CPU 負載:執行一個 curl 命令來模擬高 CPU 負載:
curl -v -m 3 $LOAD_BALANCER_DNS/cpu
此命令會超時,表明容器正在執行 CPU 密集型程式。
5. **驗證自動擴充套件結果**:等待約五分鐘後,登入 AWS 控制檯,檢視 ECS 服務的 Desired Count 是否增加到 4。同時,可以檢視 CPU 使用率的指標圖表,以確認自動擴充套件的效果。
### 自動擴充套件的原理和最佳實踐
- 自動擴充套件依賴於 CloudWatch 的指標資料。
- 常見的自動擴充套件指標包括網路 I/O、CPU 使用率、記憶體使用量和交易數量等。
- 應該根據應用程式的實際負載和指標資料,選擇合適的自動擴充套件指標和閾值。
### 挑戰
- 將提供的範例 CPU 負載應用程式替換為自己的容器化應用程式,並組態目標擴充套件策略以滿足需求。
## 使用 EventBridge 觸發 Fargate 容器任務
### 問題描述
需要在檔案上傳到 S3 時啟動容器任務來處理檔案。
### 解決方案
使用 Amazon EventBridge 在檔案上傳到 S3 時觸發 ECS 容器任務在 Fargate 上執行。
### 實作步驟
1. **組態 CloudTrail**:首先,需要組態 CloudTrail 以記錄 S3 儲存桶上的事件。
```bash
aws cloudtrail put-event-selectors --trail-name $CLOUD_TRAIL_ARN --event-selectors "[{ \"ReadWriteType\": \"WriteOnly\", \"IncludeManagementEvents\":false, \"DataResources\": [{ \"Type\": \"AWS::S3::Object\", \"Values\": [\"arn:aws:s3:::$BUCKET_NAME/input/\"] }], \"ExcludeManagementEventSources\": [] }]"
建立 IAM 角色和策略:建立一個 IAM 角色和必要的策略,以允許 EventBridge 觸發 ECS 任務。
建立 EventBridge 規則:建立一個 EventBridge 規則,以在 S3 上傳檔案時觸發 ECS 任務。
在 Amazon ECS 上執行容器並捕捉日誌
問題描述
您有一個應用程式執行在容器中,想要檢查應用程式的日誌。
解決方案
將容器日誌傳送到 Amazon CloudWatch。透過在 ECS 任務定義中指定 awslogs 驅動程式並提供允許容器寫入 CloudWatch 日誌的 IAM 角色,您可以將容器日誌串流到 Amazon CloudWatch 中的特定位置。圖 6-13 展示了此組態和流程的高階別檢視。
準備工作
按照本章節程式碼倉函式庫中本配方資料夾中的步驟進行。
步驟
- 建立任務執行假定角色 JSON 檔案
建立名為
task-execution-assume-role.json的檔案,內容如下:
{ “Version”: “2012-10-17”, “Statement”: [ { “Sid”: “”, “Effect”: “Allow”, “Principal”: { “Service”: “ecs-tasks.amazonaws.com” }, “Action”: “sts:AssumeRole” } ] }
本檔案已在本配方目錄的根目錄下的程式碼倉函式庫中提供。
2. **建立 IAM 角色**
使用前一步驟中的陳述式建立 IAM 角色:
```bash
aws iam create-role --role-name AWSCookbook608ECS \
--assume-role-policy-document file://task-execution-assume-role.json
內容解密:
- 此步驟使用 AWS CLI 建立了一個名為
AWSCookbook608ECS的 IAM 角色,並指定了假定角色策略檔案task-execution-assume-role.json。 ecs-tasks.amazonaws.com服務被允許假定此角色,允許 ECS 任務使用此角色的許可權。
- 附加 AWS 受管 IAM 策略
將 AWS 受管的 IAM 策略附加到剛才建立的 IAM 角色上:
aws iam attach-role-policy –role-name AWSCookbook608ECS –policy-arn
arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
#### 內容解密:
* 此步驟將 `AmazonECSTaskExecutionRolePolicy` 受管策略附加到 `AWSCookbook608ECS` 角色。
* 此策略允許 ECS 任務執行必要的操作,例如提取映像和寫入日誌到 CloudWatch。
4. **建立 CloudWatch 日誌群組**
建立一個 CloudWatch 日誌群組:
```bash
aws logs create-log-group --log-group-name AWSCookbook608ECS
內容解密:
- 此步驟在 CloudWatch 中建立了一個名為
AWSCookbook608ECS的日誌群組,用於儲存來自 ECS 容器的日誌。
- 建立任務定義 JSON 檔案
建立一個名為
taskdef.json的檔案,內容如下:
{ “networkMode”: “awsvpc”, “containerDefinitions”: [ { “portMappings”: [ { “hostPort”: 80, “containerPort”: 80, “protocol”: “tcp” } ], “essential”: true, “entryPoint”: [ “sh”, “-c” ], “logConfiguration”: { “logDriver”: “awslogs”, “options”: { “awslogs-group”: “AWSCookbook608ECS”, “awslogs-region”: “us-east-1”, “awslogs-stream-prefix”: “LogStream” } }, “name”: “awscookbook608”, “image”: “httpd:2.4”, “command”: [ “/bin/sh -c "echo ‘Hello AWS Cookbook Reader, this container is running on ECS!’ > /usr/local/apache2/htdocs/index.html && httpd-foreground"” ] } ], “family”: “awscookbook608”, “requiresCompatibilities”: [ “FARGATE” ], “cpu”: “256”, “memory”: “512” }
本檔案已在本配方目錄下的程式碼倉函式庫中提供。
#### 內容解密:
* 此任務定義指定了一個使用 `httpd:2.4` 映像的容器,並將容器的日誌組態為使用 `awslogs` 日誌驅動程式,將日誌傳送到 CloudWatch。
* `logConfiguration` 部分指定了日誌群組、日誌區域和日誌流字首。
* `command` 部分指定了容器啟動時執行的命令,在此案例中,建立了一個簡單的網頁伺服器。