2017年1月22日日曜日

EC2(CentOS6) で CodeDeploy を試す

EC2(CentOS6)の構築を Terraform と Ansible でやってみる」で作ったEC2インスタンスで、CodeDeploy を試してみます。
EC2インスタンスには、CodeDeploy Agent をインストール済みです。
また、AdministratorAccess ポリシーを設定しています。

CodeDeploy の使用方法は、以下のページを参考にしました。
今回は、S3からアプリケーションをデプロイします。


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 にアップロード


上記のアプリケーションを 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

debug.log を見ると、/opt/codedeploy-agent 配下に s3 からダウンロードした zip ファイルが解凍されたみたい。
[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

CodeDeploy Agent のログは、以下にあります。
デプロイに失敗した場合は、これを参照
[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 を検知したら自動的にデプロイを実行するように設定します。
手順は、下記ページが参考になります。