CodeDeployにおいて、特定のEC2へのデプロイが失敗した時の対処方法

2023.03.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

EC2インスタンス内で稼働中のDocker コンテナへのCICD環境を構築すべく、CodeDeployでデプロイ環境を構築中です。
デプロイ先のEC2インスタンスのうち、片方へのデプロイは成功しています。
CodeDeployのデプロイメントが失敗する原因と対応方法を知りたいので、教えて下さい。
 
* エラー内容は下記となります。
stop_server.shにて、appspec.ymlのfilesセクションで設定したファイルへアクセスしようとしたところ、エラーが発生してデプロイが失敗しました。
AWSコンソールのデプロイメントイベントログには以下のように表示されていました。
[stderr].FileNotFoundError: [Errno 2] No such file or directory: ‘./docker-compose.yml’

どう対応すればいいの?

CLI コマンドで --ignore-application-stop-failures オプションを付与してデプロイを実行して下さい。

本事象は最後に成功したデプロイ ID d-***でデプロイしたリビジョンに含まれる Infrastructure/codedeploy/stop_server.sh が ./docker-compose.yml を見つけられないために発生していると考えられます。

CodeDeploy エージェントは ApplicationStop, BeforeBlockTraffic および AfterBlockTraffic フェーズにおいて、最後に成功したデプロイに含まれる appspec ファイルに記述されたスクリプトを実行します。 デプロイメントグループにおいて最後に成功したデプロイ ID は d-***でしたので、この際にデプロイしたリビジョンに含まれる Infrastructure/codedeploy/stop_server.sh が相対パス ./docker-compose.yml を見つけられていない状況と考えられます。

よって、--ignore-application-stop-failures オプションを付与してデプロイいただけますと、ApplicationStop フェーズにおけるエラーを無視してデプロイを続行しますので、お試しください。

■ 補足

弊社ブログにも参考記事が載っていましたので、あわせてご確認下さい。

CodeDeployのApplicationStopイベントフックはどう実行される?

参考資料

EC2/オンプレミスのデプロイに関する問題のトラブルシューティング

失敗した ApplicationStop BeforeBlockTraffic、 AfterBlockTraffic またはデプロイライフサイクルイベントのトラブルシューティング

  • CodeDeploy コンソールを使用してデプロイを作成します。[デプロイの作成] ページの [ApplicationStop ライフサイクルイベントの失敗] で、[インスタンスのこのライフサイクルイベントが失敗しても、インスタンスへのデプロイを失敗させない] を選択します。
  • AWS CLI を使用して create-deployment コマンドを呼び出し、--ignore-application-stop-failures オプションを含めます。

create-deployment

--ignore-application-stop-failures | --no-ignore-application-stop-failures (boolean) If true, then if an ApplicationStop , BeforeBlockTraffic , or AfterBlockTraffic deployment lifecycle event to an instance fails, then the deployment continues to the next deployment lifecycle event.

AppSpec 「hooks」セクション