使用 AWS Codedeploy 藍綠部署到 ec2

Gary Ng
17 min readFeb 26, 2022

--

https://www.google.com/url?sa=i&url=https%3A%2F%2Fblog.knoldus.com%2Fautomate-deployment-using-aws-codedeploy%2F&psig=AOvVaw3AUXSuqOFDTgcY-sEhAFZP&ust=1645964200544000&source=images&cd=vfe&ved=0CAsQjRxqFwoTCOi9ls-snfYCFQAAAAAdAAAAABAD

codedeploy 是 aws 提供的一個部署服務, 他可以做到 blue-green deployment 等。

首先在要部署的 ec2 instance 上先安裝 codedeploy agent

安裝 codedeploy agent

  1. cd /home/ubuntu
  2. 輸入以下命令
wget https://bucket-name.s3.region-identifier.amazonaws.com/latest/installbucuket-name => aws-codedeploy-<區域代號>
region-identifier => 區域代號
假如機器位於東京則代號為 ap-northeast-1
因此指令為
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install

3. 將下載下來的 install 給予執行權限

chmod +x install

4. 安裝最新版的 codedeploy agent

sudo ./install auto

5. 檢查 codedeploy 是否運行成功

sudo service codedeploy-agent status

ps: 如果要手動啟動 codedeploy agent 可以使用以下指令

sudo service codedeploy-agent start

建置手動的 blue-green deployment

創建 codedeploy deployment

  1. 我們將 deployment group 命名為 bluegreen-deploygroup, 且因為專案位於 github 而選取 My application is stored in github

2. 接著輸入 github token name 後點選 connected 予以授權

假如專案是屬於某個 orgnaization 的話, orgnaization 也要授權予許

3. 選擇 deployment type, 我們這邊選取 blue/green, 且選取 manually provision instance (手動選取要將 A instance 部署到哪台 instance)

4. 我們選擇部署到指定的 Origin 的 ec2 , 而哪些 ec2 instances 會作為 Origin 則使用 tag 去做比對, 將比對到的 ec2 instances 作為 Origin, 而這邊範例指定 Key 為 ec2, 而 value 為 blue-deployment

5. 而 deployment setting 有兩個選項 Reroute traffic immediately 以及 I will choose whether to reroute traffic 意思分別為

Reroute traffic immediately: 當新的機器部署完成後立馬 reroute 到新的機器上
I will choose whether to reroute traffic: 當新的機器部署完成後, 在限定的時間內手動切換, 否則此次會 stop,
而這次範例我們點定 Reroute traffic immediately

Deployment configuration 這邊設定 CodeDeployDefault.AllAtOnce 一次部署任意數量的 instances, 只要一個成功即為成功

CodeDeployDefault.AllAtOnceCodeDeployDefault.HalfAtATime
一次部署一半, 假如超過一半部署成功即為成功, 反之為失敗
CodeDeployDefault.OneAtATime
一次部署一台, 假如除了最後一個之外有任一個部署失敗則為失敗

6. 選擇 Terminate the original instances in the deployment group, 在新機器部署成功後終止 old instances, (這邊要手動點選 terminate)

ps: 點選 Terminate 後 origin instance 會消失!!!!

7. 選擇 Application Load Balancer, 選擇所建立的 ec2 application load balancer (建置步驟可以參考下面)

使用 codedeploy 的 ec2 需要設定 iam 以及 tag

  1. 可以參考 ec2 建置 iam role, 因為必須 attach role 給 ec2 instance 否則無法正常運行 codedeploy
  2. 設定 ec2 tag 為了讓 codedeploy 找到對應的 instance
  3. 假如程式的資源是放在 s3 的話此 iam 也必須給予 s3 的權限

建置 ec2 load balancer

  1. 選取 load balancer target group

2. 點選 create target group

3. Choose a target type 選擇 Instances

4. 輸入識別的 Target group name , 我們這邊輸入 bluegreen-tg, 而 Protocol 為了示範這邊先使用 HTTP 80, Protocol Version 為 HTPP 1

Target group name: 識別名稱
Protocol: Http 80 port
VPC: <Your instance VPC>
Protocol version: HTTP1

5. 設定 Healthy check

這邊我們設定指定打 80 port 以檢查 healthy status

6. 接著建立 target group 成功後,我們要給 target group register instance, 請點選 Targets 後接著點選 Register target 選取想要當 Origin 的 instance 加入至 target group

7. 新增 load balancer

2. load balancer type 選擇 application load balancer

3. 輸入識別的 load balancer name, Schema 為 Internet-facing, IP Address type 為 IPv4

4. Listeners and routing 這邊選擇剛剛建置的 target group

如何測試 code deploy

  1. 選取 applications

2. 選擇所建立的 application

3. 選擇建立的 deployment group

4. 點選 Create deployment (要部署到哪個 instance)

5. 選擇使用 github

6. envirnoment configuration 選擇 ec2 instances, 都設定好之後點選 Create deployment 後即開始部署

使用 ec2 auto scaling group 搭配 codedeploy

首先要先設定 ec2 launch template 安裝 nginx, 否則 health check 會失敗, 因為沒有 nginx 所以 80 port 請求會失敗

  1. 點選 ec2 dashboard 的 launch template

2. 點選 create luanch template

3. 輸入 launch template 的名稱以及描述

4. application and os image 選擇 ec2 install 要的作業系統, (我是使用 ubuntu 18.04 試做此範例)

5. 為了示範所以選擇 t1-mirco, 否得費用太高

6. 可以選擇已經存在的 key pair

7. subnet 以及 security group 要設定的跟 load balancer 相同

8. 設定 ssd 大小, 我們這邊設定成 8GB 就好

9. 可以為被使用 lauch template 創建的 ec2 設定 tag

10. 可以設置 ec2 在架設起來的時候執行什麼指令, 這邊因為 load balacner 會進行 http 80 port healthy check, 所以會安裝 nginx , 且因會搭配 codedeploy, 所以也得安裝 codedeploy agent

#!/bin/bash# 安裝 nginx
sudo apt-get update -y
sudo apt-get install nginx -y
sudo systemctl restart nginx

# 安裝 codedeploy agent
sudo apt install ruby-full -y
sudo apt install wget -y
cd /home/ubuntu && wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install && sudo chmod +x ./install && sudo ./install auto
# nginx 設定

11. 創建好之後接著設定 auto scaling group

設定 ec2 auto scaling group

在 ec2 dashboard 找到 auto scaling group

  1. 點選 create an auto scaling group

2. 設置 auto scaling group 名稱

3. 設定 auto scaling group 使用剛剛建置好的 launch template

4. 假如 laucnh template 的版本很多的話這邊也要確定是否選擇正確的版本

5. 選擇跟 load balancer 一樣的 zones

6. 因為我們已經有了 load balancer 所以選擇 attach to an existing load balancer, 然後選擇創建的 target groups

7. 看要不要勾選 healthy checks ELB, 會定時透過 elb 的 healthy check 去檢查 ec2 instance 的狀態, 假如狀態為 failed 的話會再創建新的 ec2 instace 直到成功, 所以假如有設定有問題的話會一直重複創建銷毀的動作, 所以在測試的時候可以先不勾選!

8. 設定 auto scaling 規則以及 instance 數量

9. 建置 auto scaling group 成功後會自動幫你創建 ec2 instances

codedeploy 搭配 ec2 auto scaling

  1. 重新創建一個新的 deployment group 且 environment configuration 選擇 auto scaling , 然後下拉選單選擇剛剛創建的 auto scaling , 後面的設定都跟手動部署雷同

參考資料

ec2 建置 iam role

ec2 load balancer

ec2 設定 codedeploy

設定 load balance 以及 target group

codedeploy 設定

其他:

--

--

Gary Ng
Gary Ng

Written by Gary Ng

軟體工程師、後端工程師

No responses yet