イフブロ

イフブロ

インフラエンジニアのブログ

Terraformに足りないArgumentをスクリプトで設定する

概要

Terraformで Codebuildプロジェクトを作ろうとしましたが、GUIAWS CLIでは設定できるけどTerraformでは設定できない項目があったので Terraformとうまく組み合わせながら実装してみました。

AWS: aws_codebuild_project - Terraform by HashiCorp

内容

↓の AWS Codebuild Webhookと Batch が Terraform Provider AWS v1.7.0 では設定ができない。デフォルト値はOffになっている。

f:id:umisora2:20180629144205p:plain

これをTerraformでセットアップ時には有効にしたい。

イデア

  1. Terraform実行後に手動でGUIで設定
  2. Terraform実行後にAWS CLIで設定
  3. Terraformのコードから COMMAND を実行して AWS CLIを呼び出す ← これを試す記事

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}

こんな感じで設定できました。 f:id:umisora2:20180629150203p:plain

補足

仕様を読む限りは Resourceを作ったタイミング で呼び出される様です。

resource の更新時には動かない事を確認しました。Tagの追加を行いました。