LoginSignup
19
18

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-22

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の設定

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
19
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18