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, S3Source
: 存放經過 CI - Build 好的成品 (Artifacts),通常是一包可以部署壓縮檔。來源可以是 S3 or GitTarget
: 將要部署的目標機器,通常是 EC2 或者是 ECS 裡的 Container,這些部署目標需要先配置好 CodeDeploy AgentWorkstation
orCI/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
程序,詳細的流程如下圖:
此程序我定義有以下項目:
Compile applications
: 依照程式語言特性,Compile 或者打包需要的資料檔
- 有些需要 third-parties 的 libraries / module
- 打包不同的靜態資料,像是 css, js, images … etc.
- 有些需要打包不同部署環境的配置檔
Pack binary files for different targets
- 依據不同的部署環境,打包不同的部署檔,像是部署到 ap-northeast-1 和 us-east-1 可能有一些差異,所以打包出兩個檔案。
Store to S3
- 將打包好的 artifacts 存到 s3, 記得 s3 bucket 要開啟 cross region replication,未來 DR 可以使用。
- CodeDeploy 也支援 github
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,主要的程序流程如下圖:
Trigger Deploy
: 發動部署流程,可以透過 AWS CLI or SDK
- 需要指定 Artifacts 路徑
Download Artifacts
: CodeDeploy Service 將指定的 artifact 透過 CodeDeploy Agent 下載到每台機器Run deployment according to appspec.yml
: 依據appspec.yml
的部署定義,開始部署流程
1-4. CodeDeploy 的使用情境
CodeDeploy 可以使用很多情境,除了常見的應用程部署,還有其他可以應用,整理以下:
- 使用動態的機器配置,像是 Auto Scaling Group 這種動態資源
- On-Prem 的資源部署
- 監控程式部署,像是部署 CloudWatch Log Driver (awslogs)
- 部署 Docker
1-5. 相關服務
- Auto Scaling Group: CodeDeploy 的實作可能是透過 ASG Lifecyele Hook ,我透過
aws Auto Scaling 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
: 部署的應用程式 EC2CodeDeploy Launcher
: 執行 CodeDeploy 發動點,通常是 CI Service or Local Workstation
關係如下圖:
CodeDeploy Service Role
這是個角色用來授權給 CodeDeploy Service 可以執行的動作,像是 Auto Scaling 等。建立一個 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 | # run as root. |
安裝好確認狀態 CodeDeploy Agent Log: /var/log/aws/codedeploy-agent/
這段流程可以綁定在 AMI 的建置流程,然後掛到 ASG.
Next …
基本的配置完成後,接下來介紹實際的使用案例。
延伸閱讀
AWS 相關
- Study Notes - EC2 Auto Scaling Group
- Study Notes - EC2 Auto Scaling Lifecycle and Hooks
- EC2 Run Command and SSM Agent
- Study Notes - CloudWatch
DevOps 概念
- Resource Provisioning and DevOps
- Version Control
- 導入 CI/CD 的第一步
- Artifacts Management
- 聊聊軟體交付的濫觴 談產出物管理 (Artifacts Management)
- 怎樣的 CI/CD 才夠 Quality?
- 需要專職的 Release Engineer?