如何使用 AWS CodePipeline 來更新 EC2 上面的代碼

一、背景介紹

假定我們有一個 PHP 的應用程序,代碼發佈不需要進行編譯,應用程序在 AWS 的 EC2 上面或者 On-Premises,在實現 CI/CD 的方式上面有很多方法,那我們如何利用 AWS 的 Develop Tooles 去實現呢?

在這裏,我首先介紹一下我們可能會用到的 AWS 服務:

  • IAM:配置 CodeDeploy,CodePipeline 相關的權限;
  • CodeCommit:應用程序代碼存儲庫;
  • CodeDeploy:EC2/On-premises 平臺的應用部署程序;
  • S3:CodePipeline 過程中文件的存儲位置,爲整個 pipeline 過程提供文件來源;
  • CodePipeline:管理整個 pipeline 過程。
  • Amazon EC2:應用程序存放的服務器。

二、配置 EC2

2.1、爲 EC2 創建 Service role

因爲在整個 CI/CD 過程中,EC2 服務器需要從 S3 獲取資源,我們這裏就索性給了AmazonS3FullAccess

https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/getting-started-create-iam-instance-profile.html#getting-started-create-iam-instance-profile-console

2.2、爲 EC2 安裝 CodeDeploy Agent

我們的 EC2 系統是 Amazon Linux 2,安裝過程如下:

sudo yum update -y
sudo yum install ruby -y
sudo yum install wget -y
cd /home/ec2-user
wget https://aws-codedeploy-us-east-2.s3.us-east-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status

如果是其他系統的安裝,大家可以參照官方文檔操作:

https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/codedeploy-agent-operations-install.html

2.3、安裝 nginx

yum install nginx -y

三、配置 CodeCommit

3.1、創建倉庫

選擇好我們的區域,打開 CodeCommit 控制檯,點擊創建代碼倉庫,對於 Java 程序,我們可以開啓代碼檢測功能。

image-20200318143906216

關於爲 CodeCommit 配置 IAM User,我這裏就不再說了,大家可以參加官方文檔:

https://docs.aws.amazon.com/zh_cn/codecommit/latest/userguide/setting-up-gc.html

3.2、提交代碼

只是爲了演示,第一步,我們創建一個 index.html 文件,寫上如下內容。

<h1>this is test one</h1>

然後上傳到倉庫中。

$ git add .

$ git commit -m "one"
[master (root-commit) 969e50f] one
 1 file changed, 1 insertion(+)
 create mode 100644 index.html

$ git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 230 bytes | 230.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://git-codecommit.us-east-2.amazonaws.com/v1/repos/www.wzlinux.com
 * [new branch]      master -> master

四、配置 CodeDeploy

CodeDeploy 是一項部署服務,可以向 Amazon EC2 實例、本地實例、無服務器 Lambda 函數或 Amazon ECS 服務自動執行應用程序部署,在 EC2 平臺上面的部署組件如下:

image-20200318162442827

部署工作流程如下:

image-20200318162607079

4.1、爲 CodeDeploy 創建 Service role

爲 CodeDeploy 創建的服務角色必須授予對您的計算平臺所需的權限,對於 EC2/本地 部署,附加 AWSCodeDeployRole 策略,請看我創建的角色:

image-20200318163454629

關於更新詳細的過程,大家請查看官方文檔:

https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/getting-started-create-service-role.html#getting-started-create-service-role-console

4.2、創建 Applications

配置實例後,必須先在 CodeDeploy 中創建應用程序,然後才能部署修訂(appspec.yaml)。應用程序 只是一個名稱或容器,CodeDeploy 使用此名稱或容器來確保在部署期間引用正確的修訂、部署配置和部署組。

image-20200318161740084

4.3、創建 Deployment groups

可以爲 CodeDeploy 應用程序指定一個或多個部署組。每個應用程序部署使用其中一個部署組。部署組包含在部署期間使用的設置和配置。大多數部署組設置取決於您的應用程序使用的計算平臺。可以爲任何計算平臺的部署組配置某些設置,例如回滾、觸發器和警報。

我們爲項目www.wzlinux.com創建一個部署組,我一般都是以訪問的域名進行命名:

image-20200318165746627

部署方式我們選擇就地部署,然後通過 tag 標籤選擇我們的目標服務器,我們這裏是 EC2,如果是 On-premises instances 的機器,我們需要先去註冊。

image-20200318170158430

我們這裏就不是有 ALB了,取消勾選,其他選項默認即可,我們點擊創建。

4.4、創建 Application Revisions

修訂包含 CodeDeploy 將部署到實例的源文件版本或者 CodeDeploy 將在實例上運行的腳本。

您規劃修訂、將 AppSpec file 添加到修訂,然後將修訂推送到 Amazon S3 或 GitHub。在推送修訂之後,您可以部署它,目前不支持從 CodeCommit 獲取修訂,但是我們可以利用 CodePipeline,後面我們再說。

如果沒有 AppSpec file,CodeDeploy 無法將應用程序修訂中的源文件映射到其目標,也無法爲您向 EC2/本地 計算平臺中進行的部署運行腳本。

1、規劃倉庫結構

現在我們要規劃一下倉庫代碼的結構了,結構如下:

├── appspec.yml
├── htdocs
│   └── index.html
└── scripts
    └── update.sh
  • appspec.yaml:用於部署的修訂文件;
  • htdocs:存放網站代碼的文件夾;
  • scripts:部署過程中需要的腳本文件存放文件夾。

2、創建 appspec.yml

我這裏簡單寫一個示例文件,如下:

version: 0.0
os: linux
files:
  - source: htdocs
    destination: /usr/share/nginx/html
hooks:
  AfterInstall:
    - location: scripts/update.sh
      timeout: 60

以遞歸方式將 htdocs 目錄中的所有文件複製到 /usr/share/nginx/html 目錄中。

運行位於 scripts/update.sh 中的腳本,超時時間爲 60 秒。

更多相關配置信息請參照官方文檔:

https://docs.aws.amazon.com/zh_cn/codedeploy/latest/userguide/application-revisions-appspec-file.html#add-appspec-file-server

3、創建 update.sh

腳本我就簡單寫了一個添加時間的記錄:

#!/bin/bash
echo Build time is $(date '+%Y-%m-%d %H:%M:%S') >> /usr/share/nginx/html/index.html

這樣每次頁面上都有部署的時間,大家有什麼需要可以根據自己需求進行填寫。

五、配置 CodePipeline

AWS CodePipeline 是一種持續交付服務,可用於建模、可視化和自動執行發佈軟件所需的步驟。您可以快速對軟件發佈過程的不同階段進行建模和配置。CodePipeline 會自動執行持續發佈軟件更改所需的步驟。

5.1、配置

服務角色我們選擇讓 Codepipeline 創建。

image-20200320173138503

5.2、添加數據源

我們這裏選擇 CodeCommit,pipeline 還支持 ECR、S3、Bitbucket、Github作爲數據源。

image-20200318182700535

5.3、添加部署

因爲我們我們是不需要編譯的文件,所以不需要 CodeBuild 這一階段。

image-20200318183050064

CodePipeline 還支持一下幾種部署程序:

  • CodeDeploy
  • AWS Elastic Beanstalk
  • AWS OpsWorks Stacks
  • AWS CloudFormation
  • Amazon ECS
  • Amazon ECS(藍/綠)
  • AWS Service Catalog
  • Alexa Skills Kit
  • Amazon S3

六、驗證

創建好了,我們就上傳代碼吧

image-20200318194530619

image-20200318194556464

歡迎大家掃碼關注,獲取更多信息

如何使用 AWS CodePipeline 來更新 EC2 上面的代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章