はじめに
CI/CDの勉強をしている中でCodeDeploy
のBlue/Greenにチャレンジしました。
その中で、デプロイが終わらない事態が発生したのでまとめたいと思います。
ネットやTwitterにも同じ現象で悩んでいる人がいますが、解決策というような解決策の記事がまとめられていなかったので誰かの助けになればと思います。
問題
CodeDeployでBlue/Greenデプロイをすると上の状態で止まる。
本来であれば数分で終わるらしいので何かがおかしいと思い調べました。
ネットの記事にはtaskdef.json
が間違っていたというのもありますが、今回はそれに該当しなさそうでした。
また、検証もログが出力されないので難しいです。
解決方法
この問題は以下の2つの原因があるかと思われます。
1. コンテナに問題がある
コンテナが起動できない場合はそもそもデプロイに成功しないため待ち状態になってしまいます。
そこで、利用するイメージが正しく動くかをFargateのローリングアップなどで実際に起動してアクセスできるか確認してみてください。
また、Blue/Greenデプロイしている状態でもうまく立ち上がっていれば、2つのポート(80、8080)でコンテナが起動しているはずですので、プライベートIPからアクセスして確認することができます。
もし、ここでアクセスできない状態ならローリングアップなどで起動してCloudWatch
のログを見ながら修正していく必要があります。
taskdef.jsonで新しいタスクができていると思うので、それをローリングデプロイして確認します。私はそれでECRのURLが違うため起動できていないことに気づきました。
2. ロードバランサーが正しくアクセスできていない
以下の記事を見つけました。
AWS CodePipeline "An AppSpec file is required, but could not be found in the revision"
この記事によるとロードバランサーのHealth Check
が関係しているようでした。
そこでロードバランサーのターゲットグループのヘルスチェックを確認すると
Health check path: /
となっていました。しかし、私が作成したRailsアプリは/test
以外は404
になるように設定されていました。
ヘルスチェックをしたときに200 OK
が返ってこないのでロードバランサーがヘルスチェックで止まってしまっていたのが原因でした。
また、途中で止まって失敗したときにロールバック
を行わなかったことで余計なターゲットが追加されていたのも原因だったかもしれません。ヘルスチェックが正しい場合は、ロードバランサー、ターゲットグループ、ECSサービスのタスクを再度1から作成するのもよいかもしれないです。
追加
you permission to perform operations in the following aws service: amazon elasticloadbalancingv2. contact your aws administrator if you need help. if you are an aws administrator, you can grant permissions to your users or groups by creating iam policies.
というエラーが出て、allowtesttraffic
で失敗するというのが起きました。CodeDeployのロールにElasticLoadBalancingFullAccess
を追加したら成功しました。
おわりに
CodeDeployでRails(Docker)をBlue/Greenデプロイする (CI/CDまでの道⑨)
こちらの記事でCI/CDの方法については解説していますのであわせて参考にしてください。
やはりできる人が少ない分野になってくるとネットに情報がなくて原因を理解するのに時間がかかりますね。