概要
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.bat
とd.bat
が「e.txt
とf.txt
が既に存在する場合は再生成しない」
というロジックを含む場合、たとえ何度c.bat
とd.bat
が実行されても
e.txt
とf.txt
の古いバージョンは放置され続けます。
c.bat
とd.bat
には、新しいものを生成する前には毎回
e.txt
とf.txt
の古いバージョンをチェックして削除するロジックを加えるべきです。
まとめ
訳している本人にも最後の方はなんのこっちゃでしたが、要点は以下かと思います。
- CodeDeployはリビジョンを完全に元に戻す機能を提供しない
- cleanupファイルに記載されたファイルは次のデプロイで一度削除される
- Deployでの直接生成以外の方法で配置されたファイルが害になる
トリッキーな仕様なので、ある程度はhooksのスクリプトで調整が必要そうです。
こちらの記事などでファイルの上書き(overwrite)関連の機能が望まれており
GitHubのIssueにもあがっていましたが、実現には至っていないようです。