AWSのCodeDeployは比較的便利で扱いやすいデプロイするサービスですが一つ問題があります。
それはshファイル内でエラーを出して終了してもCodeDeployのエラーにはならないこと。
結論
set -euo pipefail
をすればhookのshで死んだ時にCodeDeployも失敗してくれます。
検証
だいたいこんな感じでappspec.yml
を用意して
appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/appdir/
permissions:
- object: /home/ec2-user/appdir
owner: ec2-user
group: ec2-user
hooks:
AfterInstall:
- location: setup/codedeploy/01-ansible.sh
timeout: 1200
runas: root
bashの set -e
はperlの use strict
みたいなもので
失敗したらこけてくれると期待しますが、これが失敗しない。
「あれー?デプロイが反映されなくね?」と思ってCodeDeployのログを見に行くと
AnsibleがこけてるのにCodeDeployが成功になってるという感じでした。
01-ansible.sh
#!/bin/bash
set -eu
unset PYTHON_INSTALL_LAYOUT
cd /home/ec2-user/appdir/ansible
echo ####################
echo setup app with ansible..
echo ####################
/usr/local/bin/ansible-playbook -vv -i init.hosts init.yam 2>&1 | tee /tmp/codedeploy-ansible1.log
なので上記コードに pipefail
を加えて以下の通りにする。
すると、ansibleがこけたらCodeDeployも失敗するようになった。
01-ansible.sh
#!/bin/bash
set -euo pipefail
unset PYTHON_INSTALL_LAYOUT
cd /home/ec2-user/appdir/ansible
echo ####################
echo setup app with ansible..
echo ####################
/usr/local/bin/ansible-playbook -vv -i init.hosts init.yam 2>&1 | tee /tmp/codedeploy-ansible1.log