EC2インスタンスには、CodeDeploy Agent をインストール済みです。
また、AdministratorAccess ポリシーを設定しています。
CodeDeploy の使用方法は、以下のページを参考にしました。
- http://blog.serverworks.co.jp/tech/2016/07/21/code3brother-part3/
- http://www.ryuzee.com/contents/blog/7022
1. IAM ロールの作成
CodeDeploy 用にIAMロールを作成します。
管理ポリシーに AWSCodeDeployRole を割り当てました。
信頼関係も修正します。
us-east-1 で CodeDeploy を使用するので、"codedeploy.us-east-1.amazonaws.com" を指定しています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "codedeploy.us-east-1.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
2. アプリケーションの登録
デプロイするアプリケーションを登録します。
[カスタムプロパティ]を選択して、[ウォークスルーのスキップ]ボタンをクリックします。
[アプリケーション名]、[デプロイグループ名] を入力します。
[アプリケーション名]は、s3 にファイルをアップロードするときに使用します。
デプロイ先のEC2インスタンスを指定します。
今回は、Nameタグが centos6 のサーバにデプロイします。
デプロイ設定は、デフォルト値を使用します。
トリガーと警報は、今回、使用しないので、設定しません。
ロールバックは、[デプロイが失敗したときロールバックする] を選択します。
サービスロールは、上記で作成したIAMロールを選択し、[アプリケーションの作成]ボタンをクリックします。
アプリケーションの作成に成功したら、下図のように表示されます。
3. S3バケットの作成
デプロイするファイルをアップロードする S3バケットを用意します。
今回は、バケット名を blue21-deploy にしました。
4. デプロイの実施
上記でAWSの準備ができたので、デプロイを実施します。
4.1. アプリケーションの用意
お試し用のアプリケーションを用意します。
[root@centos0702 codedeploy]# tree -F demo_v1 demo_v1 ├── appspec.yml ├── conf/ │ ├── 012.conf │ ├── 345.conf │ ├── abc.conf │ └── def.conf ├── sample01.txt ├── sample02.txt └── scripts/ ├── after_install.sh* ├── start.sh* └── stop.sh* 2 directories, 10 files [root@centos0702 codedeploy]# ls -Rl demo_v1/ demo_v1/: 合計 12 -rw-r--r-- 1 root root 1016 1月 19 10:13 appspec.yml drwxr-xr-x 2 root root 66 1月 19 09:01 conf -rw-r--r-- 1 root root 9 1月 18 15:06 sample01.txt -rw-r--r-- 1 root root 9 1月 18 15:06 sample02.txt drwxr-xr-x 2 root root 58 1月 19 09:36 scripts demo_v1/conf: 合計 16 -rw-r--r-- 1 root root 4 1月 19 08:49 012.conf -rw-r--r-- 1 root root 4 1月 19 08:49 345.conf -rw-r--r-- 1 root root 4 1月 19 08:49 abc.conf -rw-r--r-- 1 root root 4 1月 19 08:49 def.conf demo_v1/scripts: 合計 12 -rwxr-xr-x 1 root root 195 1月 19 09:36 after_install.sh -rwxr-xr-x 1 root root 195 1月 19 09:36 start.sh -rwxr-xr-x 1 root root 195 1月 19 09:36 stop.sh
appspec.yml の書き方は、下記ページが参考になります。
今回は、以下のようにしました。
[root@centos0702 codedeploy]# cat demo_v1/appspec.yml version: 0.0 os: linux files: - source: /sample01.txt destination: /opt/sample - source: /sample02.txt destination: /opt/sample - source: /conf destination: /opt/sample/conf permissions: # 拡張子が ".txt" のファイル - object: /opt/sample pattern: "*.txt" owner: centos group: centos mode: 644 type: - file # conf ディレクトリ - object: /opt/sample pattern: "conf" owner: centos group: centos mode: 755 type: - directory # conf ディレクトリの abc.conf, def.conf を除くファイル - object: /opt/sample/conf pattern: "**" except: [abc.conf,def.conf] owner: centos group: centos mode: 400 type: - file hooks: ApplicationStop: - location: scripts/stop.sh timeout: 300 runas: root AfterInstall: - location: scripts/after_install.sh timeout: 300 runas: root ApplicationStart: - location: scripts/start.sh timeout: 300 runas: root
今回は、実行されたのを確認したいだけなので、
パスと実行時間、/opt/sample のls結果を /tmp/debug.log に出力します。
[root@centos0702 codedeploy]# cat demo_v1/scripts/stop.sh #!/bin/bash LOG=/tmp/debug.log DIR=/opt/sample echo "$0" >> ${LOG} date >> ${LOG} if [ -d ${DIR} ]; then ls -Rl ${DIR} >> ${LOG} else echo "${DIR} directory not found." >> ${LOG} fi
4.2. アプリケーションを s3 にアップロード
アップロードに成功すると、デプロイの実行方法が表示されます。
[root@centos0702 codedeploy]# aws deploy push --application-nam demo_v1 --s3-location s3://blue21-deploy/demo_v1.zip --source ./demo_v1/ To deploy with this revision, run: aws deploy create-deployment --application-name demo_v1 --s3-location bucket=blue21-deploy,key=demo_v1.zip,bundleType=zip,eTag=d3a7dd6fb72f89f207aa1b7762da0a43 --deployment-group-name <deployment-group-name> --deployment-config-name <deployment-config-name> --description <description>
このコマンドを実行すると、自動的に zip 形式にアーカイブされ、s3 にアップロードされます。
awscliコマンドの結果を、AWSコンソールで確認してみます。
アップロードしたファイルは、[CodeDeploy] > [アプリケーション] > [demo_v1] > [リビジョン] に表示されます。
[リビジョン]の初期状態は、下図のように何も表示されていません。
awscliコマンドを実行してアップロードに成功すると、下図のように[リビジョン]にS3のファイルが表示されます。
s3 には、アップロードしたファイルが格納されています。
4.3. デプロイの実行
[リビジョン]が登録できたので、デプロイを実行できます。
AWSコンソールの[リビジョン]からでもデプロイできますが、今回は、awscli で実施します。
[root@centos0702 codedeploy]# aws deploy create-deployment --application-name demo_v1 --s3-location bucket=blue21-deploy,key=demo_v1.zip,bundleType=zip,eTag=d3a7dd6fb72f89f207aa1b7762da0a43 --deployment-group-name demo --description "デモ" { "deploymentId": "d-0P2O9RD8K" }
AWSコンソールからデプロイしたい場合は、[リビジョン] の [このリビジョンのデプロイ] ボタンをクリックします。
4.4. デプロイの確認
デプロイの進行状況をAWSコンソールで確認すると、下図のとおり。
上記の awscli コマンドを実行すると、ステータスが "進行中" になります。
デプロイが正常終了すると、ステータスが "正常" になります。
メニューで [デプロイ] を選択すると、下図のように詳細を確認できます。
エラーの場合は、ここで、メッセージを確認できます。
4.5. サーバの確認
サーバにログインして、デプロイ内容を確認してみます。
デプロイ先の /opt/sample を見ると、以下のとおり。
存在しないディレクトリは作成してくれました。
[root@ip-10-0-10-133 ~]# ls -alR /opt/sample /opt/sample: total 20 drwxr-xr-x 3 root root 4096 2017-01-19 10:49 . drwxr-xr-x. 5 root root 4096 2017-01-19 10:49 .. drwxr-xr-x 2 centos centos 4096 2017-01-19 10:49 conf -rw-r--r-- 1 centos centos 9 2017-01-19 10:49 sample01.txt -rw-r--r-- 1 centos centos 9 2017-01-19 10:49 sample02.txt /opt/sample/conf: total 24 drwxr-xr-x 2 centos centos 4096 2017-01-19 10:49 . drwxr-xr-x 3 root root 4096 2017-01-19 10:49 .. -r-------- 1 centos centos 4 2017-01-19 10:49 012.conf -r-------- 1 centos centos 4 2017-01-19 10:49 345.conf -rw-r--r-- 1 root root 4 2017-01-19 10:49 abc.conf -rw-r--r-- 1 root root 4 2017-01-19 10:49 def.conf
[root@ip-10-0-10-133 ~]# cat /tmp/debug.log /opt/codedeploy-agent/deployment-root/b32cea05-5b83-4c32-9afb-de20014b4882/d-GP5DVXR8K/deployment-archive/scripts/stop.sh 2017年 1月 19日 木曜日 10:49:02 JST /opt/sample directory not found. /opt/codedeploy-agent/deployment-root/b32cea05-5b83-4c32-9afb-de20014b4882/d-Q5868AP8K/deployment-archive/scripts/after_install.sh 2017年 1月 19日 木曜日 10:49:08 JST /opt/sample: total 12 drwxr-xr-x 2 centos centos 4096 2017-01-19 10:49 conf -rw-r--r-- 1 centos centos 9 2017-01-19 10:49 sample01.txt -rw-r--r-- 1 centos centos 9 2017-01-19 10:49 sample02.txt /opt/sample/conf: total 16 -r-------- 1 centos centos 4 2017-01-19 10:49 012.conf -r-------- 1 centos centos 4 2017-01-19 10:49 345.conf -rw-r--r-- 1 root root 4 2017-01-19 10:49 abc.conf -rw-r--r-- 1 root root 4 2017-01-19 10:49 def.conf /opt/codedeploy-agent/deployment-root/b32cea05-5b83-4c32-9afb-de20014b4882/d-Q5868AP8K/deployment-archive/scripts/start.sh 2017年 1月 19日 木曜日 10:49:10 JST /opt/sample: total 12 drwxr-xr-x 2 centos centos 4096 2017-01-19 10:49 conf -rw-r--r-- 1 centos centos 9 2017-01-19 10:49 sample01.txt -rw-r--r-- 1 centos centos 9 2017-01-19 10:49 sample02.txt /opt/sample/conf: total 16 -r-------- 1 centos centos 4 2017-01-19 10:49 012.conf -r-------- 1 centos centos 4 2017-01-19 10:49 345.conf -rw-r--r-- 1 root root 4 2017-01-19 10:49 abc.conf -rw-r--r-- 1 root root 4 2017-01-19 10:49 def.conf
デプロイに失敗した場合は、これを参照
[root@ip-10-0-10-133 ~]# ls /var/log/aws/codedeploy-agent/ codedeploy-agent.log codedeploy-agent.log.age
5. デプロイの自動化
S3に push したら (上記の4.2)、自動的に デプロイが実行されるようにもできるようです。
CodePipeline を使って、S3への push を検知したら自動的にデプロイを実行するように設定します。
手順は、下記ページが参考になります。