2017年2月11日 星期六

一條龍佈署 CI/CD 從 Github 跑 Travis 到 AWS CodeDeploy - Travis 到 CodeDeploy

延續前篇串好 Github 到 Travis 後,在這篇要開始寫 Travis -> CodeDeploy

 

CodeDeploy 簡介

CodeDeploy 本身是一個 Server/Client 的架構,由 AWS 提供的 CodeDeploy (Server) 服務,在 EC2 上安裝 CodeDeploy agent (Client) 去 S3 抓 Travis CI 放的 latest.zip 檔案。

 

由 CodeDeploy 的運作方式,AWS 文件開好以下權限:

  • IAM user for Travis:

    • 從 Travis 上傳到 S3 的權限 (AmazonEC2RoleforAWSCodeDeploy)。

    • 讓 Travis 可以呼叫 CodeDeploy 的權限 (AWSCodeDeployDeployerAccess)



  • Role for EC2:機器要可以存取 S3 (AmazonS3FullAccess)。

  • Role for CodeDeploy:給 AWS CodeDeploy 的服務本身用 (AWSCodeDeployRole)。




 

建立存放 Source Code 的 S3 bucket

到 Service → S3 → Create bucket,填上你的 bucket name,Region 記得要和你的 EC2 一樣啊!!!



其他設定就先略過直接 Next 就建好了。

 

建立 IAM 使用者權限給 Travis 

到 Services → IAM → User → Add user 出現以下畫面,然後 Access type 選擇 『Programmatlc access』,之後會拿產生的 access key / secret key 給 Travis CI 驗證用。



 

然後選擇 『Attach existing policies directly』,需要 CodeDeploy 和 S3 的權限,CodeDeploy 就使用 AWS 提供的『AWSCodeDeployDeployerAccess』,但 S3 的部份因為 『AmazonEC2RoleforAWSCodeDeploy』 的權限太大,所以在這邊建立一個 Policy 給 CodeDeploy 使用,參考 gslin



 

用『Policy Generator』來產生。



Effect:Allow

AWS Services 選 AWS S3

Actions 選 All actions

Amazon Resource Name 填上你 S3 的 bucket ARN:arn:aws:s3:::travis-codedeploy/*



和『AmazonEC2RoleforAWSCodeDeploy』的差別是鎖定了 bucket name。

 

把剛剛建立的 S3 Policy 和『AWSCodeDeployDeployerAccess』都勾選建立使用者,最後你的使用者權限的部份會有這些



這邊 Travis CI 在 AWS Deploy 權限就建好了。

 

建立 IAM Role 權限給 EC2 

EC2 需要有 S3 的權限。

到 Services → IAM → Roles → Create New Roles,輸入 Role Name:Role-EC2-bucketname

  • Role Type 請選 Amazon EC2


但是第一次建立你會沒辦法自訂 Policy,所以只能先選『AmazonS3FullAccess』

 

建好後,點選建好的 Role,點選 Create Role Policy 把權限縮小。



 

一樣用 Policy Generator 來產生,也是針對 bucket 鎖,基本上給 "s3:GetObject", "s3:GetObjectVersion", "s3:ListBucket" 權限就可以了。



建好後記得把原本的『AmazonS3FullAccess』刪除。

這樣就搞定 EC2 存取 S3 的權限了。

 

 

建立 IAM Role 權限給 CodeDeploy

CodeDeploy 也需要有 Role 權限,不過建立就和 "建立 IAM Role 權限給 EC2" 這邊一樣,直接給『AWSCodeDeployRole』權限即可。

 

請記得 EC2 必須套用 "IAM Role for EC2",如果你的 EC2 先建好了而沒有套用 Role 就悲劇了,代表你必須重建 EC2 去套用 Role。

 

建立 CodeDeploy 的佈署計畫

到 Services → CodeDeploy → Create application

填上必填的 Application name

  • Deployment group name 群組的概念,可以設計多個 CodeDeploy 方式。

  • Deployment type 分為 In-place、Blue/green 的方式佈署,官方有介紹兩種方式的差別,可以自行斟酌。

  • Search by tags:選擇 EC2,Key 使用 name,Value 可以用 puppet-server-* 的方式表示符合所有 tag 的機器都會被 CodeDeploy 應用,也驗證了 CD 在 AWS autoscaling 的精神。


 



 

在 EC2 安裝 CodeDeploy Agent

CodeDeploy Agent 會定時向 CodeDeploy Server access 詢問是否有更新資料

示範使用 Ubuntu 16.04
$ sudo apt-get update 
$ sudo apt-get -y install ruby wget
$ cd /tmp
$ wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
$ sudo chmod +x install
$ sudo ./install auto

必須注意 https://ap-northeast-1.s3.amazonaws.com/latest/install 這個 URL 是指定 bucket 地區,而我這邊是在 Tokyo 所以是 ap-northeast-1
aws-codedeploy-ap-northeast-1 for instances in the Asia Pacific (Tokyo) region

 

啟動驗證一下 CodeDeploy Agent 有正常啟動。
$ sudo service codedeploy-agent status

 

 

Travis Deploy 到 AWS CodeDeploy

Travis 的 Deploy 一樣是靠 .travis.yml 來設定,設定前參考官方 CodeDeploy 文件

會用到 before_deploy, deploy 這兩個 setting:
# example .travis.yml 

language: ruby
before_deploy:
- zip -r latest *
- test -d dpl_cd_upload || mkdir dpl_cd_upload
- mv latest.zip dpl_cd_upload/latest.zip
deploy:
- provider: s3
access_key_id: AKIAI7TSPFIJ4XKYYBRQ
secret_access_key:
secure: "eoc801hNb8XHQI0SqqXuOopZXF2wrnhcf9RflV4k+8yNPAkDF8oYuFAqLqrvFZrnsOydohr1QXEEFSLT4jSiJlcEUv//Yxe3FmU5H+PxQnSjHRWn+aLxtWAlt6p+IHM+y/N5ZLxsMsQvoJ72eyE18fZsJD1n9DG3B5PIrDAveP1U1AaGowHPTBqZ9zDeZmchx28fIyUcHBjjz5iUJZzZKSgxyk6enUV0906JEUPmD/eofLnS2zymILUJz5MeUszlrU3PliLFeQSEPUzpqkZ34ZssCjcE0CzWlCXsX8vboc5vnNc5RnlOwOk9EM+CYqxyaHioKXUGJUYgAmmMUbHdKIKkdkhaAZ2DJIg5Sbqn3Jk5Z"
local_dir: dpl_cd_upload
skip_cleanup: true
on:
branch: master
bucket: "travis-codedeploy"
- provider: codedeploy
access_key_id: AKIAI7TSPFIJ4XKYYBRQ
secret_access_key:
secure: "eoc801hNb8XHQI0SqqXuOopZXF2wrnhcf9RflV4k+8yNPAkDF8oYuFAqLqrvFZrnsOydohr1QXEEFSLT4jSiJlcEUv//Yxe3FmU5H+PxQnSjHRWn+aLxtWAlt6p+IHM+y/N5ZLxsMsQvoJ72eyE18fZsJD1n9DG3B5PIrDAveP1U1AaGowHPTBqZ9zDeZmchx28fIyUcHBjjz5iUJZzZKSgxyk6enUV0906JEUPmD/eofLnS2zymILUJz5MeUszlrU3PliLFeQSEPUzpqkZ34ZssCjcE0CzWlCXsX8vboc5vnNc5RnlOwOk9EM+CYqxyaHioKXUGJUYgAmmMUbHdKIKkdkhaAZ2DJIg5Sbqn3Jk5Z"
bucket: "travis-codedeploy"
key: latest.zip
application: travis-codedeploy-master
deployment_group: master
region: ap-northeast-1
on:
branch: master

 

產生 Travis to S3 User 的 Access key 和 secret key



點選 Create access key 後會跳出 Access key 和 secret key,Access key 就填入 "access_key_id" 這個欄位,但是 secret key 請務必務必加密後在填上 "secret_access_key"
$ sudo apt-get install travis 
$ cd gitrepo
$ travis encrypt secretkey

Please add the following to your .travis.yml file:

secure: "KL7PMwfYBVODgnoeTwSWRqejQk8yLAcQeNhLM2y2aN3/8azS4s3SMuOnSw255Zxd/oejA8cNK0MSLhN07O22uzJK6wmeUZMFUApXW1zvUkgQLMJKu1slciHvOqh+k3tGOTBNqWcuJiVUhzbLzXTsBuFEFc1WAFUAjsPax7pQDd2i+aVKjBNkyXoaiPngJOhU0DusIe0bhJc2Iq2CeS/Mi2lHhd2iLYOFnCkYBIzALRfYQWW1/jpuGXvy1ojhIdxK+465qPfkuHckwpuT98mZxB1srg4eZgbgEUgU9HALhrxhrxQFt9t0r4MTtPiOKS1/tmihfBjuvxIf80gdk+hF63bb+4Je7jkxWLkMitAaj5+YlihHO4JnyiTc83uSfZIkPis9MRT+UHEKnc0D4bCKHzcGkGHFABo7hxMdzfzMKRTajlounwNSRLsUU7v+gA2bW8p4Ma80dObs+cnmrxdxOtfKfN4oEYpC2jg4JLmKS8jbCsjZfhh2EfeGRRTs1jQ3czWkG8BXmjNQG4Ehi6y3+xmcC6E6ksU2EY1OJRAuBiyUZz4FiQyuAjNRhmObVUWaJdg1/H8a6ng73KiHHrF5Pojw89sqj8m1SL78rVWY77GagD+09FOtha1g0ZTXekLCK3JlvZ+H+lZvGOWIKkEhh3wBIfosWGvda/U="

要使用 travis 必須在 github repository 裡面才能執行,然後把 secret key 拿來加密過。

 

如果不幸你拿到的 secret key 有特殊符號,travis 則會提醒你使用 file 的形式,用 --add 引入,避免錯誤。
WARNING: The name of the repository is now passed to the command with the -r option:
travis encrypt [...] -r IsLAH8NEc/G3WdAUrYOYC+NlfRbE0m
If you tried to pass the name of the repository as the first argument, you
probably won't get the results you wanted.

 

  • before_deploy:在部署前先把檔案 zip 成 latest.zip。

  • deploy S3:將檔案上傳到 S3,需要 accesskey, secretkey

    • bucket:s3 bucket name

    • branch:指定 master branch 佈署



  • deploy codedeply:Call CodeDeploy API 更新

    • application:CodeDeploy 的 "Application name"

    • deployment_group:CodeDeploy 的 "Deployment group name"

    • region:AWS 的地區。




 

驗證

都弄好之後就從 Github 上面 Push 一個版本

Travis CI 上面會自動 run unit test



如果最後 deploy 的部份 Done with 0 就代表有成功上到 S3 !!

 

然後在來從 EC2 這邊查看 Agent log 也會直接 access 到更新資料到 S3 抓 source code,如果這步有錯可以在 agent log 裡面看,或是將 CodeDeploy Server Log 匯出。

 

 

 

參考資料:

Milestone 5 Guide to Setting Up Amazon's CodeDeploy Travis Integration

gslin: CodeDeploy 的權限設定

Orignal From: 一條龍佈署 CI/CD 從 Github 跑 Travis 到 AWS CodeDeploy - Travis 到 CodeDeploy

沒有留言:

張貼留言