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
【新機能】Auto Scalingのインスタンス起動/破棄時に初期処理/終了処理を追加 – 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についての調査メモ
調査した時のメモ
オートスケールの設定
LaunchConfigurationの設定をする
- S3へのアクセス権があるIAMロールを設定
- UserDataにCodeDeployをインストールする設定を行う(予めCodeDeployをインストールしたAMIを使っても恐らく問題はないと思われる)
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