开始使用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文件的位置。


 

这次就到这里吧!

请继续保持友好关系!!


最后,我会附上这次创建的代码。

 

bannerAds