CodebuildでTerraformを実行できる環境構築してみた
こんばんは。久しぶりのブログになります。少しバタバタしていて、ブログをかけていませんでした。ということで、今回もTerraform について書いていきます。
今回はTerraform で自分一人で開発するときはローカルでapply したりすると思うのですが、開発人数などが増えてくると同じ環境で実行したいというのが出てくるかもしれません。なので、今回はAWS Codebuild でTerraform の実行環境を作成しました。
以前初心者向けのブログも書きましたので、よかったら読んでみてください。
http://blog.dev-tansanken.com/terraform-beginner-guide-setup/
今回の環境
Terraform をCodebuild で実行できるようにする構成です。ソースはGithub から取得することを前提に書いています。
今回はTerraform を実行する環境をTerraform で作成しました。少しややこしいですが、ご留意ください!
今回のソースコード
ここにソースコードを置いているので、良かったら参考にしてください。
https://github.com/kentaindeed/terraform-ci
追加でSecret manager から環境変数を取得する実装が必要になるので、その点ご留意ください。buildspec.yml の事情になります。
今回の実装について
今回の実装のポイントをいくつか紹介します。
Terraform のバージョンについて
使用したTerraform バージョンは、Terraform v1.6.0 になります。バージョンはtenv で管理しています。
バックエンドについて
S3 で管理しています。バージョン管理ができるように、バージョニングは有効にしています。
resource "aws_s3_bucket" "backend" {
bucket = "${local.name_prefix}-tf-backend"
tags = {
Name = "${local.name_prefix}-tf-backend"
Environment = var.env
}
}
resource "aws_s3_bucket_versioning" "backend" {
bucket = aws_s3_bucket.backend.id
versioning_configuration {
status = "Enabled"
}
}
タグについて
Local.tf にCreatedAt の日付が変数で入るようになっています。その関係でTerraform plan を2回目から実行する際にCreatedAt の部分のせいで、差分として表示されます。
locals {
common_variables = {
region = "ap-northeast-1"
profile = "default"
}
common_tags = {
Project = "terraform-ci"
Owner = "kentaindeed"
CreatedBy = "terraform"
CreatedAt = formatdate("YYYY-MM-DD", timeadd(timestamp(), "9h")) # JST
}
availability_zones = [
"ap-northeast-1a",
"ap-northeast-1d",
"ap-northeast-1c"
]
name_prefix = "${var.env}-${local.common_tags.Project}"
}
これを防止するために、ignore changed をいれて変更を無視するようにしています。
lifecycle {
ignore_changes = [tags["CreatedAt"]]
}
Buildspec の実装について
その環境ごとにbuildspec.yml を実装するかもしれませんが、チームで使うことを想定して、Codebuild で直書きするような実装にしています。
なので、template ファイルとしてbuildspec を呼び出すように実装しています。template を使うので、tpl の拡張子で保存しています。これをすることによって、環境ごとにbuildspec.yml を作成する必要がなく、共通のものとして使用できそうです。
source {
type = "GITHUB"
location = "https://github.com/${var.github_owner}/${var.github_repo}.git"
git_clone_depth = 1
buildspec = templatefile("${path.module}/templates/buildspec.yml.tpl", {
TF_VERSION = var.TF_VERSION
env = var.env
})
まとめ
今回はTerraform をAWS 上のCodebuild で実行できる環境をIaC を使って構築してみました。Terragrunt でも同じようなことができるようにも作成していきたいと思います。
GitHub Actions でも同じようなことができるとは思いつつ、AWS に慣れているエンジニアの場合はCodebuild がとっつきやすいように思いますので、自分にあった環境を作ってみてください。
参考サイト
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/codebuild_project