AWS CodeDeployのクセ

こんにちはtsunodaです。
リモートMTGの時に部屋見られちゃうと思ってカメラon躊躇します。
警察がいると別に悪いことしてないのにソワソワするアレに近い気持ちです。

AWSのCodeDeployを使っていて、
これはクセだなーと思った事を紹介しようと思います。

CodeDeployとは

CodeDeployとは、Amazon EC2 インスタンスやオンプレミスインスタンス、サーバーレス Lambda 関数、または Amazon ECS サービスに対するアプリケーションのデプロイを自動化するデプロイメントサービスです。
デプロイを自動化できるので便利!

今回は、CodeCommitでgitを同期、CodeDeployでdeployを設定、CodePipelineを設定し、
CodeCommitが同期した段階で自動的にEC2インスタンスへdeployするような設定をして検証してみました。
この辺の設定はまた今度紹介しようと思います。

クセ1 deployの挙動

最初のdeployの際に、対象のdirが既にdeploy先に存在すると、失敗します。
CodeCommitにgitを同期、

CodeDeployを設定、
CodePipeline設定

deploy先のCodeCommitと同様のgitが置かれているdirへdeploy開始!

deploy先: /usr/local/test/sample
$ ls /usr/local/test/sample
test sample-dir

するとdeployが失敗します。

初めてのdeployの際に、対象のdirが既にdeploy先に存在すると、コケます。
初めて会うのになんで私のこと知ってるの!? えーむりむり!!
とCodeDeployが思うわけです。
なので、初めてdeployするなら、空にしてからdeployが良いです。
初めましてこんにちはです。

rm -rf /usr/local/test/sample
mkdir /usr/local/test/sample

できた。

ちゃんとdeployされています。

クセ2 appspec.ymlに書くhookスクリプトの場所

deployの際にpermissionや実行するスクリプトなどをappspec.ymlに書く事で設定できます。
例えば以下のようにappspec.ymlに書くとします。

version: 0.0
os: linux
files:
  - source: /
    destination: /usr/local/test/sample
permissions:
  - object: /
    owner: daemon
    group: daemon
hooks:
  AfterInstall:
    - location: deploy.sh
      timeout: 180

そしてdeploy.shの中で以下のように書いてあるとします。

yarn install --production=false
yarn run build

これは期待通りに動いてくれません。
スクリプト自体はdeploy先の /usr/local/test/sample/ 直下にdeployされてます。
ですが実際に実行される場所は、
/opt/codedeploy-agent/deployment-root/${deployment-group-id}/deployment-id/deployment-archive/deploy.sh
になります。 なので、上記のスクリプトの場合は、

cd /usr/local/test/sample && \
yarn install --production=false && \
yarn run build

という風に場所を指定しないと意図した通りには動いてくれないのです。

クセがすごい

これを知らないと指定したスクリプトがうまいこと機能せずにハマることになるやもしれません。。
公式ドキュメントにもそれらしい事は書いてありますが、

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

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

正直分かりづらす。。

クセ3 codedeploy-agentディレクトリの容量

deployする内容にもよりますが、クセ2にあるように、
/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive
こちらに一時的にコピーされます。
内容によっては容量食います。 結構な容量のリポジトリだったりすると、diskを圧迫します。
なのでdeployする容量がデカい場合には /opt/codedeploy-agent はsymlinkにしといてattach-diskに逃すとかした方が良さげです。
これは別にクセじゃなかった。

まとめ

deploy先に既に対象のdirがあると初めはコケたり、
appspec.ymlで設定したhookスクリプトがうまく動いてくれなかったり、
初めて触るときは色々と調べながらになるかと思います。
ただ、自動でdeployしてくれるしクセを掴めば便利です。
失敗、成功もログが出るし、deployで失敗したのか、appspec.ymlに記載したスクリプトが失敗したのか、
どのインスタンスで失敗したのかなど、ログもちゃんと出てくれるので便利です。

参考URL:
CodeDeploy agent Install
appspeckを読み解く
hookスクリプトの場所