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ロールも自動生成されるはず。そっちも削除する必要があるな。あぁ、面倒くさい。

 

Travel


関連がありそうな記事