科技美学

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

參考文章

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場景。

posted on 2024-11-04 13:47  chankuang  阅读(5)  评论(0编辑  收藏  举报