1.0 前言
交易項目,(1)快速開發 (2)快速部署。因此要部署DevOps管線,來絲滑整個「原型->開發->部署->更新」流程。
2.0 DevOps流水線
2.1 前置需求
2.1.1 知識前置需求
- 創建一台EC2服務器
- 已有Github帳戶,懂基本的Github Actions
- 會架設NGINX
- 懂基本的AWS服務,包括EC2,CodeDepoly,IAM
2.1.2 項目前置需求
先在Github上傳一個簡單的靜態網頁項目codedeploy.nginx.001。里面包括:
物件 | 位置 | 用途 |
index.html | ./ | 靜態網頁 |
圖片 ic_alana_002_20241022_a.jpg |
./icons | 顯示在靜態網頁上 |
appspec.yml | ./ | 編寫codeDeploy指令 |
application-stop.sh before-install.sh after-install.sh application-start.sh validate-service.sh |
./scripts | 編寫codeDeploy指令 |
appspec.yml | ./github/workflows | 編寫codeDeploy指令 |
另外,需要Github access tokens來配置codeDeploy權限。
Github -> Setting -> Developer Setting -> Tokens。新增一個Github access tokens。
2.2 創建IAM角色
良好的命名風格很重要,因隨著IAM角色愈來愈多,開發者會感到混亂。
AmazonSageMaker-ExecutionRole-20240805T101031 AmazonSagemakerCanvasBedrockRole-20240801T140683
{service}-{role}-{datetime}-{version}。AWS Bedrock和SageMaker自動生成的IAM命名風格。
AWSCodeDeployService-EC2AccessCodeDeployRole-20241024T000000 AWSCodeDeployService-DepolyEC2Role-20241024T000000 AWSCodeDeployService-GitAssumeRoleWithAction-20241024T000000
這是清晰的IAM命名風格,因此我們會按照這個官方IAM命名風格,分別為EC2 和 CodeDepoly 和 Github Actions 創建三個IAM角色。
2.2.1 AWSCodeDeployService-EC2AccessCodeDeployRole-20241024T000000
Use Case點選EC2。
AmazonEC2FullAccess AmazonEC2RoleforAWSCodeDeploy AmazonS3FullAccess AmazonSSMManagedInstanceCore AWSCodeDeployFullAccess AWSCodeDeployRole
分別配置AmazonEC2,AmazonS3,AWSCodeDeploy的權限。
2.2.2 AWSCodeDeployService-DepolyEC2Role-20241024T00000
Use Case點選CodeDeploy。
AWSCodeDeployFullAccess AWSCodeDeployRole
配置AWSCodeDeploy。
2.2.3 AWSCodeDeployService-GitAssumeRoleWithAction-20241024T000000
點選Access management -> Identity providers -> Add provider。
用來監聽Github Actions。
Provider URL: token.actions.githubusercontent.com
Audience: sts.amazonaws.com
然後,Github Identity Provider新增AWSCodeDeployService-GitAssumeRoleWithAction-20241024T000000角色。
點選Assign Role -> Web identity -> Github organization。
AmazonS3FullAccess AWSCodeDeployFullAccess
配置S3,AWSCodeDeploy的權限。
2.3 建立EC2
1. 填寫名稱ec2.cheaper.001
2. 點選Amazon Linux 2023 AMI
3. 點選t3a.nano
最後按"Launch instance"建立EC2。
2.3.1 Associate Elastic IP address
Associate Elastic IP address,配置静态IP给EC2。然后可以用route53配置专属域名。
1. 點選Elastic Ips
2. 點選“Allocate Elastic IP address”按鈕
1. 選擇剛建立EC2的名稱ec2.cheaper.001
2. 選擇預設的Private IP address
3. 點選"Associate"按鈕
2.3.2 Route53
1. 填寫sub-domain域名
2. 填寫EC2的
3. 點選"save"按鈕
成功設置好靜態域名和IP域名。
2.3.3 設置IAM角色
1. 點選Actions
2. 點選Security
3. 點選Mpdify IAM role
配置AWSCodeDeployService-EC2AccessCodeDeployRole-20241024T000000。
2.3.4 在EC2安裝CodeDeploy Agent
進入EC2終端。
1. 點選Connect
2. 點選EC2 Instance Connect
3. 點選Connect
成功登入EC2終端。
sudo apt update sudo yum install ruby sudo apt install wget cd /home/ec2-user wget https://aws-codedeploy-us-east-2.s3.us-east-2.amazonaws.com/latest/instal chmod +x ./install sudo ./install auto
安裝CodeDeploy Agent。
成功,CodeDeploy Agent正在運行中。
(Optional) 2.3.5 安裝GIT
如果想在EC2直接拉取git項目,請繼續以下步驟,否則可跳到2.3.7。
sudo yum install git-all git clone https://{YOUR_GITHUB_SECRET_ID}@github.com/{YOUR_GITHUB_ORGANIZATION_NAME}/{YOUR_GITHUB_PROJECT_NAME}.git git checkout . git pull origin main sudo chmod 777 -R PATH
安裝git,拉取項目到EC2。
(Optional) 2.3.6 安裝NGINX
sudo yum update sudo yum install nginx -y sudo service nginx start sudo service nginx status
安裝NGINX
sudo netstat -tunpl
顯示開放端口。這時NGINX已占用:80端口。
NGINX的預設主頁在/var/www/html/index.html。
確保Source和Destination是公開訪問,設置成0.0.0.0/0。
2.3.7 Appspec.yml
參考文章
- CodeDeploy AppSpec file reference
- (AWS DevOps Blog) Build and Deploy Docker Images to AWS using EC2 Image Builder
- (Github) Build and Deploy Docker Images to AWS using EC2 Image Builder
Appspec.yml是用指示codeDeploy的流程代碼。
Deployment主要分成了5個環節:(1) BeforeInstall -> (2) BeforeInstall -> (3) AfterInstall -> (4) ApplicationStart -> (5) ValidateService
在root目錄下新增./appspec.yml。
version: 0.0 os: linux files: - source: / destination: /usr/share/nginx/html hooks: ApplicationStop: - location: scripts/application-stop.sh timeout: 300 runas: root BeforeInstall: - location: scripts/before-install.sh timeout: 300 runas: root AfterInstall: - location: scripts/after-install.sh timeout: 300 runas: root ApplicationStart: - location: scripts/application-start.sh timeout: 300 runas: root ValidateService: - location: scripts/validate-service.sh timeout: 300 runas: root
source是github項目的根目錄。destination是拉取到EC2的項目。
另外,新增./scripts文件夾,在里面分別有5個xxxxxxx.sh。
application-stop.sh before-install.sh after-install.sh application-start.sh validate-service.sh
5個xxxxxxx.sh,分別是codeDeploy的5個環節。
(1) application-stop.sh
#!/bin/bash
空白。這次案例不需要停止應用。
(2) before-install.sh
#!/bin/bash
空白。這次案例不需要停止應用。
(3) after-install.sh
#!/bin/bash sudo yum update sudo yum install nginx -y
安裝NGINX
(4) application-start.sh
#!/bin/bash sudo service nginx start
啟動NGINX
(5) validate-service.sh
#!/bin/bash
空白。這次案例不需要停止應用。
2.3.8 靜態網站
新增./icons文件夾,里面是顯示網站圖片ic_alana_002_20241022_a.jpg。
另外,新增index.html網站主頁。
<html lang="en" data-bs-theme="dark"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.min.js" integrity="sha512-ykZ1QQr0Jy/4ZkvKuqWn4iF3lqPZyij9iRv6sGqLRdTPkY69YX6+7wvVGmsdBbiIfN/8OdsI7HABjvEok6ZopQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css" integrity="sha512-jnSuA4Ss2PkkikSOLtYs8BlYIeeIK1h99ty4YfvRPAlzr377vr3CXDb7sb7eEEBYjDtcYj+AjBH3FLv5uSJuXg==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <title>Alana Lam</title> </head> <body> <div class="container"> <div class="row"> <div class="col-12 mt-4 text-center"> <h1>CodeDeploy + Github Actions + EC2</h1> <img src="./icons/ic_alana_002_20241022_a.jpg" class="mt-4 rounded-circle" alt="Alana Lam" width="200" height="200"> <h5 class="mt-4">Alana Lam (AWS Builder Community Manager, Hong Kong)</h5> </div> </div> </div> </body> <html>
一個簡單的靜態網站,顯示文字和圖片。
如果是完成了"2.3.5 安裝GIT"和"2.3.6 安裝NGINX",可以在瀏覽器上輸入EC2 EIP,或你設置的域名,就可以看到網頁了。
2.4 建立codeDeploy
2.4.1 創建codeDeploy應用
1. 填寫Application name,test.codeDeploy.001
2. 點選EC2/On-premises
3. 點選"Create application"按鈕
2.4.2 創建codeDeploy Deployment Group
1. 點選"Create deployment group"按鈕。
1. 填寫Deployment group名稱,test.deploymentGroup.001。
2. 選擇IAM角色,AWSCodeDeployService-DepolyEC2Role-20241024T000000。
3. 剔除"Enable load balancing",因這次是最簡單的DevOps流水線案例,所以不需要額外的AWS服務。
2.4.3 創建codeDeploy Deployment
進入"test.deploymentGroup.001"。
點選"Create deployment"按鈕。
點選"My application is stored in GitHub"。
1. 填寫"Github token name"。
2. 填寫"Repository name"。codedeploy.nginx.001。
3. 填寫"Commit ID"。
4. 點選"Create deployment"按鈕。
2.4.4 成功執行codeDeploy
成功執行codeDeploy。
2.5 建立Gtihub Actions
參考文章
2.5.1 創立Github Actions workflow
1. 點選"New workflow"按鈕。
2. 點選"set yp a workflow yourself"連接。
3. 編寫完GitHub Actions指令後,按"Commit changes"按鈕。
2.5.2 設置GitHub Actions secrets and variables
1. 點選Settings Tab
2. 點選Serects and variables (Actions) Tab
3. 點選Secrets Tab
2.5.3 新增Github Actions secrets變量
1. 新增secrets變量,名命IAMROLE_GITHUB_ARN。
2. 賦值是IAM角色的ARN。值格式是arn:aws:iam::{xxxxxxxx}:role/AWSCodeDeployService-GitAssumeRoleWithAction-20241024T000000
3. 點選"Add secret"按鈕。
2.5.4 新增Github Actions variables變量
1. 點選Variables Tab
2. 新增4個Actions Variables
Variables | 值 | 內容 |
AWS_REGION | us-east-1 | 預設部署在US East (N. Virginia) |
CODEDEPLOY_APPLICATION_NAME | test.codeDeploy.001 | 2.4.1 創建codeDeploy應用 |
CODEDEPLOY_DEPLOYMENT_GROUP_NAME | test.deploymentGroup.001 | 2.4.2 創建codeDeploy Deployment Group |
IAMROLE_GITHUB_SESSION_NAME | AWSGitAssumeRoleWithAction | 2.2.3 AWSCodeDeployService-GitAssumeRoleWithAction-20241024T000000 |
3. 點選"New repository variable"按鈕
2.5.5 編寫GitHub Actions指令
.github/workflows/main.yml
name: Deploy on: workflow_dispatch: {} jobs: deploy: runs-on: ubuntu-latest environment: Prod permissions: id-token: write contents: read steps: - name: Git clone the repository uses: actions/checkout@v2 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: ${{ secrets.IAMROLE_GITHUB_ARN }} role-session-name: ${{ vars.IAMROLE_GITHUB_SESSION_NAME }} aws-region: ${{ vars.AWS_REGION }} - run: | commit_hash=`git rev-parse HEAD` aws deploy create-deployment --application-name ${{ vars.CODEDEPLOY_APPLICATION_NAME }} --deployment-group-name ${{ vars.CODEDEPLOY_DEPLOYMENT_GROUP_NAME }} --github-location repository=${{ github.repository }},commitId=${{ github.sha }} --ignore-application-stop-failures
一個基礎版的GitHub Actions指令。
2.5.6 運行GitHub Actions指令
1. 點選Actions Tab
2. 點選Deploy Tab
3. 點選"Run workflow"按鈕
2.5.7 成功運行GitHub Actions
成功運行完main.yml。
4.0 總結
Github Actions + CodeDepoly 是很強大的DevOps工具,來應用在快速上線的Startup場景。