开始使用Terragrunt
由于业务需求,我决定开始学习和使用Terragrunt,并计划将我的学习进程记录在文章中,以便更好地过程中的进展。
关于Terragrunt
引入Terragrunt的好处有很多,但主要归纳为以下两点。
-
- モジュール間の依存関係
- 複数環境での開発が楽になる
想要设定环境
-
- Docker上に構築したUbuntu 22.04.2 LTS
-
- Terraform 1.5.5
- Terragrunt 0.50.8
引入
获取所需版本的二进制文件,请从以下链接获取发布页面。
※此次我们将获取最新版本v.50.8。
https://github.com/gruntwork-io/terragrunt/releases
$ sudo curl -Ls https://github.com/gruntwork-io/terragrunt/releases/download/v0.50.8/terragrunt_linux_amd64 -o /usr/local/bin/terragrunt
$ sudo chmod a+x /usr/local/bin/terragrunt
$ terragrunt -v
目录结构
本次采用以下的目录结构。
envs
┣dev
┣s3
┣terragrunt.hcl
┣vpc
┣terragrunt.hcl
dev.hcl
terragrunt.hcl
modules
┣s3
┣main.tf
┣variables.tf
┣vpc
┣main.tf
┣variables.tf
.gitignore
目录结构解释
envs/terragrunt.hcl
remote_state {
backend = "s3"
config = {
region = "ap-northeast-1"
bucket = "terragrunt-example-tfstate-445605964569"
key = "${path_relative_to_include()}/terraform.tfstate"
encrypt = true
}
generate = {
path = "_backend.tf"
if_exists = "overwrite_terragrunt"
}
}
generate "provider" {
path = "provider.tf"
if_exists = "overwrite_terragrunt"
contents = <<EOF
terraform {
required_version = ">= 1.5.5"
required_providers {
aws = {
# See https://github.com/terraform-providers/terraform-provider-aws
version = "~> 5.1.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
EOF
}
在 terragrunt.hcl 文件中,我们将整体共享的配置进行记录。
-
- provider設定
-
- tf.stateファイルの設定
- など
envs/dev.hcl
locals {
env = "dev"
vpc_name = "dev-vpc"
cidr_block = "10.0.0.0/16"
private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
}
在dev.hcl文件中,我们定义了每个环境使用的资源参数。
如果想要创建类似生产环境等的环境,只需定义一个名为prod.hcl的文件,这样就可以重复使用模块了。
envs/vpc/terragrunt.hcl
# 環境の定義 (`dev.hcl`) を local.env.locals として参照できるようにする
locals {
env = read_terragrunt_config(find_in_parent_folders("dev.hcl"))
}
# 全環境の定義 (`envs/terragrunt.hcl`) をインクルードする
include "root" {
path = find_in_parent_folders()
}
# モジュールを参照する
terraform {
source = "../../../modules/vpc"
}
inputs = {
vpc_name = local.env.locals.vpc_name
cidr_block = local.env.locals.cidr_block
private_subnets = local.env.locals.private_subnets
public_subnets = local.env.locals.public_subnets
}
在dev/vpc/terragrunt.hcl文件中,我正在引用实际创建的Terraform资源。
在变量input中设置要传递给资源的参数。
modules/vpc/main.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = var.vpc_name
cidr = var.cidr_block
azs = ["ap-northeast-1a", "ap-northeast-1c"]
private_subnets = var.private_subnets
public_subnets = var.public_subnets
enable_nat_gateway = true
enable_vpn_gateway = false
tags = {
Terraform = "true"
Environment = "dev"
}
}
変数定義
modules/vpc/variables.tf
variable "vpc_name" { type = string }
variable "cidr_block" { type = string }
variable "private_subnets" { type = list(string) }
variable "public_subnets" { type = list(string) }
关于执行方法
在 envs/dev/vpc/ 目录下
terragrunt plan
terragrunt apply
执行。
基本上只是将 Terraform 更改为 Terragrunt,但需要注意的是
实际运行的目录将是包含hcl文件的位置。
这次就到这里吧!
请继续保持友好关系!!
最后,我会附上这次创建的代码。