この記事について
CodePipelineによりあるアプリケーションのCI/CDパイプラインを実装していました。パイプラインのソースとしてCodeCommitを利用しており、指定したブランチへの変更をトリガーとしてCI/CDパイプラインが実行されるようになっています。ある時、トリガーの対象となるブランチを変更しました。新しくトリガーの対象となったブランチに変更を加えても、CI/CDパイプラインが実行されません。
なぜパイプラインが実行されなくなったのか、どうやって解決したのかについてこの記事にまとめます。
同じような事象に遭遇した人の助けになってくれたら、非常に嬉しいです。
構成
今回の構成を簡単に説明します。
- アプリケーションはECSにて稼働
- CodePipelineによりECSコンテナのイメージ作成、デプロイを実施
- CodeCommitの特定ブランチの変更をトリガーとしてCI/CDパイプラインが実行される
- CodePipelineとCodeCommitをはじめとした一連のAWSリソースはTerraformにより管理されている
- CodePipelineのソースアクションにおいて、検出オプションは「Amazon CloudWatch Events」を利用している
最後の2つが今回のミソになります。
今回発生した問題
パイプライン実行のトリガーとしていたCodeCommitのブランチを後から変更する必要がありました。
そこでTerraformのコードを変更して、terraform applyしました。
<br />resource "aws_codepipeline" "sample" { ... stage { name = "Source" action { version = "1" name = "Source" category = "Source" owner = "AWS" provider = "CodeCommit" configuration = { RepositoryName = "Sample-Repo" BranchName = "develop" OutputArtifactFormat = "CODE_ZIP" PollForSourceChanges = false } output_artifacts = ["SourceArtifact"] } } ... }
BranchName = "develop"
をBranchName = "main"
と変更しました。
その結果、mainブランチに変更があってもパイプラインが自動で実行されなくなりました。最初はちゃんとブランチの変更が設定されていないのか確認しましたが、CodePipeline上では変更されており、「変更をリリースする」による手動でのパイプライン実行は成功するため、ブランチの変更は正しく適用されていると思いました。
マネージメントコンソールから確認した結果、BranchNameが正しく変更されています。
結論
EventBridgeルールの更新が行われていなかった
CodePipelineのソースアクションにおいて、検出オプションに「Amazon CloudWatch Events」を指定している場合、EventBridgeルールが作成され、そのルールがCodeCommitの対象ブランチへの変更をキャッチして、パイプラインの実行に繋げます。
このEventBridgeルールですが、CodePipeline作成時に検出オプションを「Amazon CloudWatch Events」にしたら自動で作成されます。Terraformのaws_codepipelineリソースで作成した場合も同様に自動で作成されます。しかしこのEventBridgeルールはTerraformの管理の対象外になります。
つまりCodePipelineではmainブランチをトリガー対象のブランチして認識していますが、EventBridgeルールではdevelopブランチがトリガー対象として認識される状態になります。
なお、マネージメントコンソールからCodePipelineのトリガー対象のブランチを変更した場合ですが
このようにブランチを変更した際にAmazon CloudWatch Eventsルールも変更するかを問うダイアログが表示されます。「このソースアクションの変更にリソースの更新は必要ありません」にチェックを入れずに保存するをクリックしたら、EventBridgeのルールも更新されました。
Terraformによりトリガー対象のブランチを変更した場合、Cloudwatch Eventsのルールの対象となっているブランチが変更されません。
解決策
この問題の解決策としては以下の2つがあるかと思います。
- 1. EventBridgeのルールを手動で変更する
- 2. EventBridgeのルールをTerraformで管理する
1は手動でEventBridgeのルールを変更する方法です。EventBridgeルールがTerraformの管理対象外であることは変わりませんが、そもそもトリガー対象のブランチを変更すること自体そんなにあることではないです。そのため、私はこの方法を選びました。
2はTerraformにてEventBridgeルールの作成が必要になります。作成分の労力がかかりますが、Terraform管理外のリソースはなくなるため、もしトリガー対象のブランチを変更する機会が多い場合はこの方法がいいのではないかと思います。
最後に
今回の問題はTerraformによりCodePipelineを管理していたため、起きた事象でした。ただTerraformだけでなくマネージメントコンソール以外では同じように問題が発生すると思います。
マネージメントコンソールは便利で煩雑な作業を抽象化して、勝手にやってくれるという便利な一面もありますが、中で何が起きているかわかりにくいというデメリットもあります。
AWS CLIを利用して、中で何が行われているのかを理解するのも大切だと思いました。