📖

【ハンズオン】はじめてのTerraform コード集

2021/07/25に公開

以下ハンズオンで使用したコード集です。

https://connpass.com/event/219609/

https://connpass.com/event/220212/

このZennでの記事に関してはコードの置き場所として利用させてもらっているだけなので、記事を読んでもハンズオンができるわけではありません。悪しからず。

3.3 .gitignore の作成

.gitignore
**/.terraform/*
*.tfstate
*.tfstate.*
*.tfvars

3.5 .terraform-version の作成

envs/prod/.terraform-version
1.0.0

3.7 backend の設定

envs/prod/app/foobar/backend.tf
terraform {
  backend "s3" {
    bucket  = "tfstate保存用のS3バケット名"
    key     = "example/prod/app/foobar_v1.0.0.tfstate"
    region  = "ap-northeast-1"
  }
}

3.9 プロバイダーの設定

envs/prod/provider.tf
provider "aws" {
  region = "ap-northeast-1"
}

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "3.42.0"
    }
  }
}

3.10 terraform バージョンの固定

envs/prod/provider.tf
provider "aws" {
  region = "ap-northeast-1"
}

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "3.42.0"
    }
  }

  required_version = "1.0.0" # この行を追加
}

3.11 デフォルトのタグ設定

envs/prod/provider.tf
provider "aws" {
  region = "ap-northeast-1"

  default_tags { # このブロックを追加
    tags = {
      Env    = "prod"
      System = "example"
    }
  }
}

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "3.42.0"
    }
  }

  required_version = "1.0.0"
}

3.14 ECR 用の tf ファイルの作成

envs/prod/app/foobar/ecr.tf
resource "aws_ecr_repository" "nginx" {
  name = "example-prod-foobar-nginx"

  tags = {
    Name = "example-prod-foobar-nginx"
  }
}

3.19 aws_ecr_lifecycle_policy の作成

envs/prod/app/foobar/ecr.tf
resource "aws_ecr_repository" "nginx" {
  name = "example-prod-foobar-nginx"

  tags = {
    Name = "example-prod-foobar-nginx"
  }
}
# ここから下の行を追加
resource "aws_ecr_lifecycle_policy" "nginx" {
  policy = jsonencode(
    {
      "rules": [
        {
          "rulePriority": 1,
          "description": "Hold only 10 images, expire all others",
	  "selection": {
            "tagStatus": "any",
            "countType": "imageCountMoreThan",
            "countNumber": 10
          },
          "action": {
            "type": "expire"
          }
        }
      ]
    }
  )

  repository = aws_ecr_repository.nginx.name
}

3.20 モジュール

3.20.2 main.tf の編集

modules/ecr/main.tf
resource "aws_ecr_repository" "this" {
  name = var.name

  tags = {
    Name = var.name
  }
}

resource "aws_ecr_lifecycle_policy" "this" {
  policy = jsonencode(
    {
      "rules": [
        {
          "rulePriority": 1,
          "description": "Hold only ${var.holding_count} images, expire all others",
	  "selection": {
            "tagStatus": "any",
            "countType": "imageCountMoreThan",
            "countNumber": var.holding_count
          },
          "action": {
            "type": "expire"
          }
        }
      ]
    }
  )

  repository = aws_ecr_repository.this.name
}

3.20.3 variables.tf の編集

modules/ecr/variables.tf
variable "name" {
  type = string
}

variable "holding_count" {
  type    = number
  default = 10
}

3.20.4 モジュールの呼び出し

envs/prod/app/foobar/ecr.tf
// ここから上の行はいったん残したままにして、下の行を追加

module "nginx" {
  source = "../../../../modules/ecr"
  
  name = "example-prod-foobar-nginx"
}

3.21 terraform state mv

3.21.1 terraform state mv の実行

$ terraform state mv aws_ecr_repository.nginx module.nginx.aws_ecr_repository.this
$ terraform state mv aws_ecr_lifecycle_policy.nginx module.nginx.aws_ecr_lifecycle_policy.this

3.21.2 不要コードの削除

envs/prod/app/foobar/ecr.tf
// ここから上の行をすべて削除

module "nginx" {
  source = "../../../../modules/ecr"
  
  name = "example-prod-foobar-nginx"
}

3.22 PHP 用 ECR の作成

envs/prod/app/foobar/ecr.tf
module "nginx" {
  source = "../../../../modules/ecr"
  
  name = "example-prod-foobar-nginx"
}
# ここから下の行を追加
module "php" {
  source = "../../../../modules/ecr"
  
  name = "example-prod-foobar-php"
}

Discussion