TerraformでCodePipeline作成する時のオプション"PollForSourceChanges"の注意点。
ソースとなるCodeCommitの所定のブランチに変更がpushされたらパイプラインが走る、という前提。PollForSourceChangesは、ソースステージに対する変更をCodePipelineがポーリングするか or EventBridgeに検知させるかの定義。マネコンから作る場合は自動的に後者になる(関連リソースも自動で作成される)。Terraformの場合は明示的に指定する必要があり、EventBridgeに検知させるならfalseにしなければいけない。
以下は以前の投稿 Terraform loop処理の応用編(2) - CI/CD にも載せたソース一部。PollForSourceChangesの値だけ変えてる。前回はEventBridgeの設定抜きにしていたから、trueだった。
####################################
# CodePipeline
####################################
resource "aws_codepipeline" "pipeline" {
for_each = var.pipeline_param_list
name = lookup(each.value, "name")
role_arn = var.pipeline_role
artifact_store {
location = var.bucket
type = "S3"
}
stage {
name = "Source"
action {
category = "Source"
configuration = {
BranchName = "master"
PollForSourceChanges = "false" #ここに注意!
RepositoryName = lookup(each.value, "repository_name")
}
input_artifacts = []
name = "Source"
namespace = "SourceVariables"
output_artifacts = ["SourceArtifact"]
owner = "AWS"
provider = "CodeCommit"
region = var.region
run_order = 1
version = "1"
}
}
stage {
name = "Deploy"
action {
category = "Deploy"
configuration = {
ApplicationName = lookup(each.value, "app_name")
DeploymentGroupName = lookup(each.value, "deployment_group_name")
}
input_artifacts = ["SourceArtifact"]
name = "Deploy"
namespace = "DeployVariables"
output_artifacts = []
owner = "AWS"
provider = "CodeDeploy"
region = var.region
run_order = 1
version = "1"
}
}
}
EventBridgeでソースとなるブランチの変更検知の設定をしている状態で、PollForSourceChanges = "true"
だとどうなるか。二重にパイプラインが起動され、2回デプロイが走る。完全に無駄である。CloudWatchLogsでも、所定のブランチが存在しないとポーリング時にエラーとなり、延々とログに出力される。完全に無駄である…。(なんか変だなと思いつつ放置してた)
(追記)
もうひとつ注意点あり。PollForSourceChanges = "false"
にしてTerraformでパイプラインを作成した。これで二重実行はなくなるはずだ!と思いきや、そうではなかった。まだデプロイが重複している。パイプラインの履歴画面を見ると、同一のコミットに対してEventBridgeが二つ存在する。パラメータを変更したことにより、AWS側が勝手に判断してイベントルールを自動生成したのである。親切でやってるんだろうけどね…、このマネージドルールを削除後にデプロイしたところ、やっと期待値になった。(デプロイは一回のみ)
今書いてて思い出したけど、このマネージドルールに紐づくIAMロールも自動生成されるはず。そっちも削除する必要があるな。あぁ、面倒くさい。