Study Notes - CodeDeploy Preparation


CodeDeploy 是 AWS Code[XXX] 系列之一,屬於給 Developer / DevOps / Operator 使用的服務,特別是 Continuous Deployment 部分。

整理使用 CodeDeploy 之前需要知道的事情,以及準備工作。

1. 基本介紹

1-1. 特色

  • 容易使用
  • 支援常見的部屬方法,像是 Blue/Green、Canary、A/B Test、Rolling
  • 支援 Rollback
  • 支援 Auto Scaling Group

1-2. 角色

使用 CodeDeploy 有四個主要的角色:

  • CodeDeploy Service: CodeDeploy Service,用來執行部屬的程序。需要有部署目標的相關權限,像是存取 EC2, S3
  • Source: 存放經過 CI - Build 好的成品 (Artifacts),通常是一包可以部署壓縮檔。來源可以是 S3 or Git
  • Target: 將要部署的目標機器,通常是 EC2 或者是 ECS 裡的 Container,這些部署目標需要先配置好 CodeDeploy Agent
  • Workstation or CI/CD Service: 驅動 CodeDeploy 動作的來源,可以是開發者自己的開發環境,或者是 CI/CD Service

重要觀念 :CI/CD Service 的設計要注意的是:所有的流程一定要在 Developer 的 Workstation 可以執行,同時可以進版控 (e.g., Git),如果被綁死在工具上,像是只能在 Jenkins 上執行,建議重新規劃流程以及重新開發 scripts. 簡言之,CI/CD 的重點是流程,再來才是工具。流程本身的程式碼,不可以被工具綁死。

1-3. 工作流程

1. Build Artifacts

透過 CI Service 或者是開發者 Local Workstation 發動 Build Artifacts 程序,詳細的流程如下圖:

Build Artifacts

此程序我定義有以下項目:

  1. Compile applications: 依照程式語言特性,Compile 或者打包需要的資料檔
    • 有些需要 third-parties 的 libraries / module
    • 打包不同的靜態資料,像是 css, js, images … etc.
    • 有些需要打包不同部署環境的配置檔
  2. Pack binary files for different targets
    • 依據不同的部署環境,打包不同的部署檔,像是部署到 ap-northeast-1 和 us-east-1 可能有一些差異,所以打包出兩個檔案。
  3. Store to S3
    • 將打包好的 artifacts 存到 s3, 記得 s3 bucket 要開啟 cross region replication,未來 DR 可以使用。
    • CodeDeploy 也支援 github
  4. Store build meta (LATEST.txt) to S3
    • 產生一個 build meta 資訊檔,裡面有最新的 image 的 Version Control 資訊,像是 version, buildId, branch, …etc.
    • 這個路徑是固定的,部署程式可以透過這個檔案取得最新資訊。這個方法也是現在很多 open source 的安裝方式,像是透過 curl <path> && run xxx 這樣的方式就可以快速安裝。

再次強調,這段流程需要開發、測試,同時 一定要可以 在開發人員的工作環境 (Workstation) 被執行,要有測試環境、 Log 、可以用任何的 CI Server 串接等。

這段流程不在 CodeDeploy 裡,而是依據程式語言特性自訂在 CI 流程裡面的。

2. Deploy using CodeDeploy

同樣的,可以透過 CI Services or Local Workstation 發動 Deploy,主要的程序流程如下圖:

Build Artifacts

  1. Trigger Deploy: 發動部署流程,可以透過 AWS CLI or SDK
    • 需要指定 Artifacts 路徑
  2. Download Artifacts: CodeDeploy Service 將指定的 artifact 透過 CodeDeploy Agent 下載到每台機器
  3. Run deployment according to appspec.yml: 依據 appspec.yml 的部署定義,開始部署流程

1-4. CodeDeploy 的使用情境

CodeDeploy 可以使用很多情境,除了常見的應用程部署,還有其他可以應用,整理以下:

1-5. 相關服務

  • Auto Scaling Group: CodeDeploy 的實作可能是透過 ASG Lifecyele Hook ,我透過 aws autoscaling describe-lifecycle-hooks 看到端倪。
  • S3: CodeDeploy 依賴 S3 ,所以要把 CI build 好的 artifact 放上去,建議要規範 artifact naming,同時放一個 LATEST 用來取得最新的資源。
  • EC2 Systems Manager - SSM: AWS 提供給 System Operator 使用的管理工具,主要是維護 EC2 上的 System Patch、或者管理工具,像是監控程式、Log 處理程序等。因為是類似於 Remote Proedure 的概念,所以 CodeDeploy 的流程理論上可以透過 SSM 實踐。

2. 準備與配置

  • 2-1. IAM Roles and Poilcies
  • 2-2. Install CodeDeploy Agent

2-1. IAM Roles and Policies

使用任何一個 AWS SaaS 之前,都要先配置好 IAM 權限。有以下角色要設定 IAM Permissions:

  • CodeDeploy Service Role: AWS SaaS,負責執行 Launcher 發動的工作
  • CodeDeploy Target Role: 部署的應用程式 EC2
  • CodeDeploy Launcher: 執行 CodeDeploy 發動點,通常是 CI Service or Local Workstation

關係如下圖:

CodeDeploy Service Role

這是個角色用來授權給 CodeDeploy Service 可以執行的動作,像是 AutoScaling 等。建立一個 IAM Role 叫 CodeDeploy_ServiceRole,Attach AWSCodeDeployRole Policy,如下圖:

這個 Service Role 預設允許每個 region 都可以使用 CodeDeploy,如果要個別允許,可以到 Trust Relationship 個別設定 Principal,詳細設定參考文件: Create a Service Role for AWS CodeDeploy

CodeDeploy Target Role

部署的目標機器,通常這些 EC2 只需要存取 S3 Objects,所以只需要開啟 s3:Get* 即可。

CodeDeploy Launcher

用來執行 CodeDeploy 的發動點,會是 CI Service or Local Workstatio,前者應該是 EC2 IAM Role,後者則是 IAM Programitic User

可以建立一個 IAM Policy,分別 attach 給這兩個角色使用。

2-2. 安裝 CodeDeploy Agent

在每台 EC2 安裝 CodeDeploy Agent,詳細步驟如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# run as root.
sudo su -
# ruby runtime is required by codedepoy-agent
apt-get install ruby2.0 -y
# install the latest codedeploy-agent
AWS_REGION=us-east-1
cd /tmp
wget https://aws-codedeploy-${AWS_REGION}.s3.amazonaws.com/latest/install
chmod +x ./install
./install auto
# Check codedeploy-agent status
service codedeploy-agent status

安裝好確認狀態 CodeDeploy Agent Log: /var/log/aws/codedeploy-agent/

這段流程可以綁定在 AMI 的建置流程,然後掛到 ASG.

Next …

基本的配置完成後,接下來介紹實際的使用案例。

延伸閱讀

參考資料


Comments