听说有个叫Terragrunt的东西
关于这篇文章
这里所记录的全部内容都来自Terragrunt的官方文档。(我不知道是否有帮助,但我在GitHub上创建了一个沙箱。)
重点不在于如何使用,而是关注如何能够使用。
Terragrunt是什么?
总结
Terragrunt是一个官方支持的Terraform包装工具,它以DRY(Don’t Repeat Yourself)作为口号。
简而言之,就是让这个工具来完成Terraform中繁琐的任务!
支持的 Terraform 版本可以在公开的 Terraform 版本兼容表中找到。只要你有接触过 Terraform,就可以处理 terragrunt.hcl 文件。
可以像Terraform一样运行命令的工具是Terragrunt(apply | plan ….)。
对于导向的担忧
Considerations for CI/CD Pipelinesで触れられているように一般的なケースに現在対応できていない。回避策はあるが、余計なトイルが発生する気が。
Terraform Registryをモジュールとして利用する場合には問題ないが、プライベートGitリポジトリを利用する場合のガバナンスコストが未知。
既存のプロダクトに導入するにはメリットが少なすぎる。新規プロジェクトの方が導入する価値がある。
run-all …コマンドというのがあるがCI/CDの際にそれぞれの出力を取得したい場合、一工夫必要。
你能做什么?
这只是一个例子,但是可以通过Terragrunt实现一些DRY的方法如下所示。
后端
首先介绍一下。使用Terraform来配置后端相当繁琐对吧?
只需要在root的terragrunt.hcl中添加定义,就可以配置子后端的设置。
如果后端资源不存在(第一次创建时),Terraform会自动创建该后端资源。
假设以下为目录结构。
stage
├── terragrunt.hcl <- こいつ
├── frontend-app
│ ├── main.tf
│ └── terragrunt.hcl
└── mysql
├── main.tf
└── terragrunt.hcl
当terragrunt.hcl根目录配置如下时,会生成一个backend.tf文件,并根据目录结构创建tfstate的路径。
(例如,本例中将生成frontend-app/terraform.tfstate和mysql/terraform.tfstate)。
# stage/terragrunt.hcl
remote_state {
backend = "s3"
generate = {
path = "backend.tf"
if_exists = "overwrite_terragrunt"
}
config = {
bucket = "my-terraform-state"
key = "${path_relative_to_include()}/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "my-lock-table"
}
}
最终的目录结构如下所示。
stage
├── terragrunt.hcl
├── frontend-app
│ ├── main.tf
│ ├── backend.tf
│ └── terragrunt.hcl
└── mysql
├── main.tf
├── backend.tf
└── terragrunt.hcl
服务提供者 zhě)
使用Terraform时,指定提供程序也有点麻烦。像下面这样配置,并生成一个provider.tf给子模块。generate块很直观,所以不需要特别解释。
# stage/terragrunt.hcl
generate "provider" {
path = "provider.tf"
if_exists = "overwrite_terragrunt"
contents = <<EOF
provider "aws" {
assume_role {
role_arn = "arn:aws:iam::0123456789:role/terragrunt"
}
}
EOF
}
命令行参数
不必每次输入命令“-var-file=path”是很麻烦的!因此,我们可以让Terragrunt自动添加它。
在执行指定命令时,会自动为您指定参数。
# terragrunt.hcl
terraform {
extra_arguments "common_vars" {
commands = ["plan", "apply"]
arguments = [
"-var-file=../../common.tfvars",
"-var-file=../region.tfvars"
]
}
}
我个人想要介绍的功能和命令。
前后钩子
您可以指定在执行前后触发的命令。根据使用方式可能会非常方便。
terraform {
before_hook "before_hook" {
commands = ["apply", "plan"]
execute = ["echo", "Running Terraform"]
}
after_hook "after_hook" {
commands = ["apply", "plan"]
execute = ["echo", "Finished running Terraform"]
run_on_error = true
}
}
图依赖命令
可以通过运行`terragrunt graph-dependencies`来表示模块之间的依赖关系,类似于`terraform graph`或`inframap`。

依赖块
从概念上讲,它与Terraform的模块相同。
dependency "vpc" {
config_path = "../vpc"
}
inputs = {
vpc_id = dependency.vpc.outputs.vpc_id
}
请参考以下链接
Terragrunt 是一个用于管理 Terraform 环境的开源工具。
Translation: Terragrunt是用于管理Terraform环境的开源工具。