Posted at

CodeDeployにおける再デプロイとロールバック

More than 1 year has passed since last update.


概要

CodeDeployで、既にファイルがあるところにデプロイをした際に

File already exists at location的なエラーで失敗し

結局どういう挙動をしているのかさっぱりだったので、関連する箇所を読みました。

以降はこちらの記事の英訳:Redeployments and Deployment Rollbacks


再デプロイとデプロイのロールバック

CodeDeployは再デプロイを

「以前デプロイしたリビジョンの新しいデプロイ」として扱います。

リビジョンの再デプロイについてはDeploy a Revisionをご覧ください。

CodeDeployはデプロイのロールバックを直接的にサポートしていません。

というのも、既にデプロイされたファイルを完全に消去する手段ではなく

過去のリビジョンをデプロイグループに再デプロイする方法を提供しています。

しかし、過去のリビジョンを新しくデプロイすることによって

ロールバックのようなかたちを再現することはできます。

詳細についてはDeploy a Revisionをご覧ください。

たとえデプロイグループから何かを削除したいとしても

CodeDeployは既に配置されたものを消去するようなことはしません。

再デプロイやロールバック(のようなもの)を行う際に

まずCodeDeployは最後にデプロイが成功したときのファイルを削除します。

これはcleanupファイルをチェックすることにより行われます。

/opt/codedeploy-agent/deployment-root/deployment-instructions/deployment-group-ID-cleanup

C:\ProgramData\Amazon\CodeDeploy\deployment-instructions\deployment-group-ID-cleanup 

このファイルが存在する場合、CodeDeployは新しいデプロイを始める前に

ここに載っているすべてのファイルを削除します。

例えば、以下の最初の2つのテキストファイルとスクリプトファイルは

既にEC2上で動くWindowsサーバに既にデプロイされており

残りの2つのファイルはデプロイのライフサイクルイベントの間に作られたとします。

c:\temp\a.txt (previously deployed by AWS CodeDeploy)

c:\temp\b.txt (previously deployed by AWS CodeDeploy)
c:\temp\c.bat (previously deployed by AWS CodeDeploy)
c:\temp\d.bat (previously deployed by AWS CodeDeploy)
c:\temp\e.txt (previously created by c.bat)
c:\temp\f.txt (previously created by d.bat)

cleanupファイルには最初の4ファイルだけが載っています。

c:\temp\a.txt

c:\temp\b.txt
c:\temp\c.bat
c:\temp\d.bat

新しいデプロイの前に、CodeDeployはこれらのファイルを削除しますが

残り2つのテキストファイルは放置されます。

c:\temp\a.txt will be removed

c:\temp\b.txt will be removed
c:\temp\c.bat will be removed
c:\temp\d.bat will be removed
c:\temp\e.txt will remain
c:\temp\f.txt will remain

再デプロイやロールバックのプロセスにおいて

CodeDeployは過去のデプロイにおけるスクリプトで行われたアクションを

元に戻したり帳尻を合わせたりということをしません。

例えばc.batd.batが「e.txtf.txtが既に存在する場合は再生成しない」

というロジックを含む場合、たとえ何度c.batd.batが実行されても

e.txtf.txtの古いバージョンは放置され続けます。

c.batd.batには、新しいものを生成する前には毎回

e.txtf.txtの古いバージョンをチェックして削除するロジックを加えるべきです。


まとめ

訳している本人にも最後の方はなんのこっちゃでしたが、要点は以下かと思います。


  • CodeDeployはリビジョンを完全に元に戻す機能を提供しない

  • cleanupファイルに記載されたファイルは次のデプロイで一度削除される

  • Deployでの直接生成以外の方法で配置されたファイルが害になる

トリッキーな仕様なので、ある程度はhooksのスクリプトで調整が必要そうです。

こちらの記事などでファイルの上書き(overwrite)関連の機能が望まれており

GitHubのIssueにもあがっていましたが、実現には至っていないようです。