LoginSignup
2
0

More than 5 years have passed since last update.

codedeployのhook失敗時に何が何でも気合いでCodeDeployを失敗するようにする

Last updated at Posted at 2017-02-06

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

参照

2
0
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
2
0