Terraformに足りないArgumentをスクリプトで設定する
概要
Terraformで Codebuildプロジェクトを作ろうとしましたが、GUIやAWS CLIでは設定できるけどTerraformでは設定できない項目があったので Terraformとうまく組み合わせながら実装してみました。
AWS: aws_codebuild_project - Terraform by HashiCorp
内容
↓の AWS Codebuild Webhookと Batch が Terraform Provider AWS v1.7.0 では設定ができない。デフォルト値はOffになっている。
これをTerraformでセットアップ時には有効にしたい。
アイデア
terraform local-exec
そこでこちらです。
Provisioner: local-exec - Terraform by HashiCorp
以下のサンプルみたいに resource
Blockの最後の方に provisioner
Blockを追加する事でコマンドやスクリプトを呼び出すことができます。
仕様を読む限りは Resourceを作ったタイミング
で呼び出される様です。
resource "aws_codebuild_project" "codebuild" { name = "codebuild" build_timeout = "5" service_role = "${aws_iam_role.codebuild_role.arn}" artifacts { type = "NO_ARTIFACTS" } environment { compute_type = "BUILD_GENERAL1_SMALL" image = "aws/codebuild/ruby:2.5.1" type = "LINUX_CONTAINER" } source { type = "GITHUB" location = "https://github.com/org/repo.git" } tags { "env" = "${terraform.workspace}" } provisioner "local-exec" { command = "sh ../script/aws_codebuild_project.codebuild.local-exec.sh ${var.profile} ${aws_codebuild_project.name}" } }
肝心の呼び出されるスクリプトはこんな感じです。
冪等になる様に実装が必要です。 aws cli
は同じ設定を二度投げる(例えば create-webhook
) とErrorを返してくる場合もあるので注意。
#!/usr/bin/env sh profile=$1 project_name=$2 target_branch="master" project_setting_json=`aws codebuild batch-get-projects --names ${project_name} --profile ${profile}` if echo ${project_setting_json} | grep 'webhook' > /dev/null then #すでに存在する場合は一度削除する echo "Delete exist Webhook" aws codebuild delete-webhook --project-name ${project_name} --profile ${profile} fi echo "Set Webhook" aws codebuild create-webhook --project-name ${project_name} --branch-filter ${target_branch} --profile ${profile} echo "Set Batch" aws codebuild update-project --name ${project_name} --badge-enabled --profile ${profile}
こんな感じで設定できました。
補足
仕様を読む限りは
Resourceを作ったタイミング
で呼び出される様です。
resource
の更新時には動かない事を確認しました。Tagの追加を行いました。