AWS CodeDeployのHookスクリプトでソースを弄りたいとき

Posted on
AWS CodeDeploy Hook Laravel shellscript

Hookスクリプトの実行場所

CodeDeployでソースをデプロイするときには、appspec.ymlでソースと実行するHookスクリプトを指定する。

version: 0.0
os: linux
files:
  - source: src
    destination: /tmp/project_root
hooks:
  AfterInstall:
    - location: hook/deploy.sh
      timeout: 300
      runas: root

ここで実行されるdeploy.shは、/tmp/project_root/hook/deploy.sh ではなく、/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive/hook/deploy.sh になる。

そのため、hookスクリプトはデプロイバンドルに含めること。というのはCodeDeployフックのベストプラクティスにも説明がある通り。

デプロイ後にソースをいじりたい場合

Laravelプロジェクトをデプロイ時にartisanでキャッシュクリアをしたり、独自のバッチコマンドを流したい場合の例を見てみる。また、追加の要件として、配置するソースは「src_202002031200」のようにバージョニングし、ドキュメントルートへのパスはシンボリックリンクにする。

appspec.ymlは先程のものを使用しているものとする。deploy.shは下記の通り。 (権限系はプロジェクトによって異なるため割愛)

#!/bin/sh

DOCUMENT_ROOT=/var/www/html
DATETIME=`date '+%Y%m%d-%H%M%S'`
SRC_PATH="${DOCUMENT_ROOT}/src_${DATETIME}"
# ファイル移動
mv "/tmp/project_root" "${SRC_PATH}"
# キャッシュクリア
cd "${SRC_PATH}"
rm bootstrap/cache/config.php
su - ec2-user -c "cd ${SRC_PATH};php artisan config:cache"
su - ec2-user -c "cd ${SRC_PATH};php artisan original_batch:exec"
# シンボリックリンク張替え
rm "${DOCUMENT_ROOT}/src"
ln -s "${SRC_PATH}" "${DOCUMENT_ROOT}/src"

このhookが実行されると、ソースコードが/var/www/html/src_{日付}配下に展開後、キャッシュクリア等をした後にシンボリックリンクが更新される。

このままだとバージョニングされたコードが無制限に溜まってしまうので、ローテートする処理も必要になる。もっとも、ソースコードをHookで色々いじるケースはそこまでないと思うが、ご参考まで。