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」配下のファイルが実行されます。
なので下記のような処理を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を読まないと理解できない部分がありますね。