📖
【ハンズオン】はじめてのTerraform コード集
以下ハンズオンで使用したコード集です。
この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