延續前篇串好 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 給 Travis CI 去 Access S3 使用,參考 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 了也不用擔心,可以用 CLI 動態修改 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 裡面看到,或是進行 trigger 通知。
參考資料:
Milestone 5 Guide to Setting Up Amazon’s CodeDeploy Travis Integration