AWS CodeDeploy でデプロイしたときのhookスクリプトの場所

AWS CodeDeploy の hooks を使う際に直感と反する動きをする箇所があります。
その部分を予め理解しておかないと、罠にはまって悩みまくることになります。

CodeDeployのfilesセクションでコピーした後、コピー先のファイルを実行すると思いがちなのですが、そうではありません。
例えば以下のようなappspecを定義したとします。

version: 0.0
os: linux
files:
   – source: /
     destination: /home/ubuntu/hogeProject
hooks:
   ApplicationStart:
     – location: deploy.sh
       timeout: 180
       runas: ubuntu

この時に、「deploy.sh」は、「project-a」を暗黙的に期待します。
しかし、実際には、「/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive/deploy.sh」が実行されます。

これを図にすると下記になります。
「/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive」にzipの中身が展開され、そこから、「files」セクションの内容に沿ってファイルがコピーされます。
コピーされた後、「hooks」セクションは定義に沿ってイベントハンドルをしますが、そこで指定したファイルは、「/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive」配下のファイルが実行されます。

image

なので下記のような処理をdeploy.shに記載すると問題が発生します。

docker-compose build
docker-compose restart

この際に、読み込まれるdocker-compose.ymlは、「/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive/docker-compose.yml 」になります。
ファイルコピー先を読み込ませたい場合は、次のようにしないとだめです。

docker-compose -f /home/ubuntu/hogeProject/docker-compose.yml build
docker-compose -f /home/ubuntu/hogeProject/docker-compose.yml restart

このあたりの説明は、公式ドキュメントだと、次のように記載されています。

DownloadBundle – このデプロイライフサイクルイベント中に、CodeDeploy エージェントはアプリケーションリビジョンファイルを一時的な場所にコピーします。

Amazon Linux、Ubuntu Server、および RHEL Amazon EC2 インスタンスの /opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive フォルダ。

クラスメソッドさんのBlogを読まないと理解できない部分がありますね。

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください