オートスケール時のCodeDeployとUserDataの実行順番について

CodeDeployではオートスケールと連携することができ、新規にインスタンス起動時にアプリをデプロイすることができます。

それは分かったでもそれって具体的にいつでUserDataに書いたものとどっちが早いのかとか分からなかったのでメモ。

# 結論

UserData（Cloud-initか普通にbashスクリプトどちらでも）よりあとにCodeDeployは実行されます。以下それぞれのタイミングで `date` の結果を出力した場合の結果。

```
BootCmd: Fri Aug 21 06:49:05 UTC 2015
Per-Once: Fri Aug 21 06:49:36 UTC 2015
Per-Boot: Fri Aug 21 06:49:39 UTC 2015
Per-Instance: Fri Aug 21 06:49:42 UTC 2015
User-Data: Fri Aug 21 06:49:45 UTC 2015
RunCmd: Fri Aug 21 06:49:57 UTC 2015
CodeDeploy: Fri Aug 21 06:49:59 UTC 2015
```

下記にあるようにCodeDeployはオートスケールのライフサイクルを利用しているからのようです。

[AWS CodeDeployでAuto Scaling Lifecycleを手軽に利用する #cmdevio](http://dev.classmethod.jp/cloud/sds-integrates-as-lifecycle/)

[【新機能】Auto Scalingのインスタンス起動/破棄時に初期処理/終了処理を追加 – LifeCycleHook機能のご紹介](http://dev.classmethod.jp/cloud/aws/autoscaling-lifecyclehook/)

なので、以下のようにUserDataでCodeDeployAgentのインストールをするのはOKで、正しくCodeDeployも動きます。

```
#!/bin/bash

# install CodeDeploy agent
yum update -y
yum install ruby -y
yum install aws-cli -y
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1 
chmod +x ./install
./install auto
```

Cloud-init自体の調査した話は以前に書きました。

[AmazonLinuxのcloud-initについての調査メモ](http://qiita.com/toshihirock/items/81d6612511f0d1f5db77)

#  調査した時のメモ

## オートスケールの設定

LaunchConfigurationの設定をする

+ S3へのアクセス権があるIAMロールを設定
+ UserDataにCodeDeployをインストールする設定を行う(予めCodeDeployをインストールしたAMIを使っても恐らく問題はないと思われる)

## UserDataの設定

```lang:UserData
Content-Type: multipart/mixed; boundary="===============1993995897=="
MIME-Version: 1.0
 
--===============1993995897==
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="bash.txt"
 
#!/bin/bash
 
echo "User-Data:" `date` >> /var/tmp/test.txt
sleep 3s

# install CodeDeploy agent
yum update
yum install ruby
yum install aws-cli
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-ap-northeast-1/latest/install . --region ap-northeast-1 
chmod +x ./install
./install auto

exit
 
--===============1993995897==
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
 
#cloud-config
write_files:
 - content: |
      #!/bin/sh
      echo "Per-Once:" `date` >> /var/tmp/test.txt
      sleep 3s
   owner: root:root
   path: /var/lib/cloud/scripts/per-once/once.sh
   permissions: '0755'
 - content: |
      #!/bin/sh
      echo "Per-Boot:" `date` >> /var/tmp/test.txt
      sleep 3s
   owner: root:root
   path: /var/lib/cloud/scripts/per-boot/boot.sh
   permissions: '0755'
 - content: |
      #!/bin/sh
      echo "Per-Instance:" `date` >> /var/tmp/test.txt
      sleep 3s
   owner: root:root
   path: /var/lib/cloud/scripts/per-instance/instance.sh
   permissions: '0755'
 
bootcmd:
 - echo "BootCmd:" `date` >> /var/tmp/test.txt
 - sleep 3s
 
runcmd:
 - echo "RunCmd:" `date` >> /var/tmp/test.txt
 - sleep 3s
--===============1993995897==--
```

## CodeDeployの設定

以下のいずれかのスクリプトに`echo "CodeDeploy:" `date` >> /var/tmp/test.txt`を追加

```
# confirm
$tree demo
demo
├── appspec.yml
├── index.html
└── scripts
    ├── change_permissions.sh
    ├── start_server.sh
    └── stop_server.sh

1 directory, 5 files

# create zip
$cd demo
$zip -r demo.zip *

#create S3 bucket
$aws s3 mb s3:toshihirock-codedeploy

# upload zip
$aws s3 cp demo.zip s3://toshihirock-codedeploy/

# confirm
$aws s3 ls s3://toshihirock-codedeploy/
2015-08-21 10:37:28       1546 demo.zip

# create application
$aws deploy create-application --application-name SimpleDemoApp

# create deployment-group
$aws deploy create-deployment-group \
  --application-name SimpleDemoApp \
  --auto-scaling-groups CodeDeployASGroup \
  --deployment-group-name SimpleDemoDG \
  --deployment-config-name CodeDeployDefault.OneAtATime \
  --service-role-arn arn:aws:iam::11111111:role/CodeDeployDemo

# let's deploy!
$aws deploy create-deployment \
  --application-name SimpleDemoApp \
  --deployment-config-name CodeDeployDefault.OneAtATime \
  --deployment-group-name SimpleDemoDG \
  --s3-location bucket=toshihirock-codedeploy,bundleType=zip,key=demo.zip \
  --description "First Deployment!"
```

## 結果

```
$cat /var/tmp/test.txt
BootCmd: Fri Aug 21 06:49:05 UTC 2015
Per-Once: Fri Aug 21 06:49:36 UTC 2015
Per-Boot: Fri Aug 21 06:49:39 UTC 2015
Per-Instance: Fri Aug 21 06:49:42 UTC 2015
User-Data: Fri Aug 21 06:49:45 UTC 2015
RunCmd: Fri Aug 21 06:49:57 UTC 2015
CodeDeploy: Fri Aug 21 06:49:59 UTC 2015
```

## Agentログ

```
/var/log/aws/codedeploy-agent/codedeploy-agent.log
```