CodeDeployで複数のリポジトリからデプロイするときの注意事項

AWS
この記事は約4分で読めます。
スポンサーリンク

CodeDeployはマルチリポジトリ用に設計されていない

まず、前提になるのですが、CodeDeployは1つのリポジトリからアプリケーションをデプロイする設計思想のようです。
複数のリポジトリからも「工夫」すればデプロイできるようになるのですが、AWSサポート問い合わせした時も繰り返し1つのリポジトリからデプロイするように案内されます。
まずは、1つのリポジトリで運用できないか検討した方が良いでしょう。

複数リポジトリ(アプリケーション)をデプロイする必要がある場合、リポジトリ統合やリポジトリ単位でEC2を分離するなどAWSの設計思想に合わせたほうが運用上便利になります。

マルチリポジトリ時の問題点(Agent側のキャッシュ)

問題点は3つあります。
1つ目はデプロイする際の動作です。
デプロイはファイルを上書きするのではなく「デプロイしたファイルの削除」→「アプリケーションのデプロイ」という順番で行われます。

CodeDeploy を使用してデプロイを再デプロイしてロールバックする

CodeDeploy は、まず、最後に正常にインストールされたすべてのファイルを各参加インスタンスから削除しようとします。CodeDeploy は、クリーンアップファイルをチェックすることでこれを行います。

/opt/codedeploy-agent/deployment-root/deployment-instructions/deployment-group-ID-cleanupファイル (Amazon Linux、Ubuntu サーバー、および RHEL インスタンスの場合)
C:\ProgramData\Amazon\CodeDeploy\deployment-instructions\deployment-group-ID-cleanupファイル (Windows サーバーインスタンス用)

存在する場合、CodeDeploy は、クリーンアップファイルを使用して、新しいデプロイを開始する前にリストされたすべてのファイルをインスタンスから削除します。

CodeDeployAgentは実行履歴を保持しているので、この動作が行われるのは2回目のデプロイからです。1回目のデプロイではは実行履歴が無いので事前の削除は行われません。
この実行履歴はリポジトリごとにに保持されません。
そのため、「リポジトリA」→「リポジトリB」をデプロイしようとすると以下のようになってしまいます。

・「リポジトリA」のファイルをデプロイ
・「リポジトリA」のファイルを削除
・「リポジトリB」のファイルをデプロイ

リポジトリBをデプロイしようとしたタイミングで前回デプロイしたリポジトリAのファイルを削除してしまいます。
そのため、リポジトリBのファイルだけが存在する状態になります。

この場合、Agent側の設定では回避することができません。
回避策としてはCodeDeployのデプロイグループを「リポジトリA用」「リポジトリB用」と分離する必要があります。
前回実行記録はデプロイグループ単位で作成されるようなので、デプロイグループを分けることにより前回実行結果を分離します。

マルチリポジトリ時の問題点(同時実行)

デプロイグループを分けることでキャッシュの問題は解決しました。
しかし、同時実行問題が残っています。
デプロイグループは2つになりましたが、DeployAgentは1つです。
2つのデプロイグループから同時にデプロイ指示が行われた場合はどうなるでしょうか?

AWS側の回答としては「わからない」でした。
そもそも、デプロイグループはデプロイ対象のEC2を分類するための機能であり、このような使い方をするものでは無いからです。
また、Agent側もこのような構成を想定していないので排他制御等を考慮していない模様です。

マルチリポジトリ時の問題点(Agent更新)

CodeDeployエージェントはデプロイグループ設定時にインストールをすることができます。
一般的にはここで定期実行するように設定すると思います。
これも、同時実行しないように設定しなければなりません。
エージェント更新タイミングは日単位でのみ設定可能なので、分かりやすくどちらかのデプロイグループだけで自動更新を行う必要があります。

これも、同時に2つのエージェント更新が実行された場合の動作は保証されていません。

タイトルとURLをコピーしました