AWS CodeDeploy 佈屬你的網站,簡單又快速
AWS CodeDeploy-佈署你的網站,簡單又快速
DevOps在當今是個流行與受歡迎的角色與文化,大部份工程師或多或少也都會碰到架構與佈署的問題。而在佈署程式碼一定也聽過各式各樣的方式,尤其是在尚未建立完善的CI/CD流程時,像是直接上SERVER下git pull、利用rsync、甚至用ftp上傳、或是其他不同方式以及各種互相搭配等等。
而CodeDeploy是在AWS在佈署上提供的其中一種方案,且簡單使用,對於IT人員也較為直覺。
相關的服務還包括CodeCommit、CodePipline、CodeBulid等等,
以下本文及流程只會使用CodeDeploy來做說明。
流程與概念
CodeDeploy的概念就是為了讓使用者能夠編寫定義整個佈署所需的指令及流程甚至一些繁複的事務,定義完之後未來只需要只要把需要佈署的code放在github或aws codeCommit,或壓縮打包放上aws S3等等,再來簡單的一個指令,就能自動完成佈署。
而CodeDeploy會需要一個appspec.yml來定義這些佈署階段事件。
以下範例會用壓縮打包上S3的方式來說明,其他如從github拉code的方式相較更為簡單,只需在參數中加入github的repository及commit hash即可。
實作會需要包含如下:
- 定義appspec.yml
- 編寫appspec.yml中各階段事件的指令或shell script
- 打包佈署所需的檔案並壓縮為zip,
此壓縮檔中第一層需包含appspec.yml - 編寫打包以及下達aws deploy指令的script方便以後佈署
佈署開始時會依照以下事件階段進行:
定義appspec.yml
./appspec.yml範例
files字段是定義檔案及佈署的路徑
- source 表示的是zip檔內的路徑,例如/表示整個zip內資料
- destination 表示的是要把source丟到server機器的哪裡
hooks字段表示的就是各事件階段
version: 0.0
os: linux
files:
- source: /
destination: /var/www/html/
hooks:
BeforeInstall:
- location: scripts/docker_pull.sh
timeout: 300
runas: root
AfterInstall:
- location: scripts/clean_dirs.sh
timeout: 300
runas: root
ApplicationStart:
- location: scripts/docker_run.sh
timeout: 300
runas: root
ApplicationStop:
- location: scripts/docker_stop.sh
timeout: 300
runas: root
~
編寫appspec.yml中各階段的指令或shell script
./script/docker_run.sh範例
此處我們只提供ApplicationStart事件的定義,可以看到只需編寫所需執行的shell script即可
其他事件也是如此,請定義出自己需要的指令
而此處我們是直接使用command來執行docker run,當然也可以改為docker-compose up -d來使用定義好的docker-compose.yml執行docker。
<span class="token shebang important">#!/bin/bash</span>
docker run -d \
--name fpm \
--network<span class="token operator">=</span>magento \
-v /var/www/html:/app \
magento/magento-cloud-docker-php:7.0-fpm
docker run -d \
--name web \
--network<span class="token operator">=</span>magento \
-p 0.0.0.0:80:80/tcp \
-v /var/www/html:/app \
magento/magento-cloud-docker-nginx:latest
編寫打包以及下達aws deploy指令的script方便以後佈署
./aws-deploy.sh
<span class="token comment">#/bin/bash</span>
<span class="token comment"># go to magento web root </span>
<span class="token function">cd</span> /var/www/html
<span class="token comment"># put the date in the filename to make it unique filename=magento2-$(date '+%Y%m%d%H%M%S').tar.gz </span>
<span class="token comment"># make archive, exclude some stuff </span>
<span class="token function">tar</span> -Ipigz -cvf <span class="token punctuation">..</span>/<span class="token variable">${filename}</span> \
--exclude<span class="token operator">=</span><span class="token string">'pub/media'</span> \
--exclude<span class="token operator">=</span><span class="token string">'pub/static/_cache'</span> \
--exclude<span class="token operator">=</span><span class="token string">'var'</span> \
--exclude<span class="token operator">=</span><span class="token string">'.git'</span> \
--exclude<span class="token operator">=</span><span class="token string">'var/log'</span> \
--exclude<span class="token operator">=</span><span class="token string">'var/report'</span> \
<span class="token keyword">.</span>
<span class="token comment"># copy archive to s3 </span>
aws s3 <span class="token function">cp</span> <span class="token punctuation">..</span>/<span class="token variable">${filename}</span> s3://niuniu-production/
<span class="token comment"># create deployment</span>
aws deploy create-deployment \
--application-name magento2 \
--deployment-config-name CodeDeployDefault.OneAtATime \
--deployment-group-name magento2 \
--s3-location bucket<span class="token operator">=</span>niuniu-production,bundleType<span class="token operator">=</span>tgz,key<span class="token operator">=</span><span class="token variable">${filename}</span>
<span class="token comment"># cleanup </span>
<span class="token function">rm</span> <span class="token punctuation">..</span>/<span class="token variable">${filename}</span>
<span class="token function">cd</span> -
我要留言