Terragrunt 最佳实践:模块之间的依赖关系
Terragrunt Best practice: dependencies between modules
我有一个像这样的 terragrunt 项目
├── common_vars.hcl
├── envs
│ ├── dev
│ │ ├── env_vars.hcl
│ │ ├── rds-aurora
│ │ │ └── terragrunt.hcl
│ │ ├── rds-sg
│ │ │ └── terragrunt.hcl
│ │ └── vpc
│ │ └── terragrunt.hcl
│ └── prod
│ ├── env_vars.hcl
│ ├── rds-sg
│ │ └── terragrunt.hcl
│ └── vpc
│ └── terragrunt.hcl
├── modules
│ ├── aws-data
│ │ ├── main.tf
│ │ └── outputs.tf
│ ├── rds-aurora
│ │ └── main.tf
│ ├── rds-sg
│ │ └── main.tf
│ └── vpc
│ └── main.tf
└── terragrunt.hcl
rds-sg是依赖vpc的安全组。
dev和prod下的terragrunt.hcl也是这样的代码
terraform {
source = format("%s/modules//%s", get_parent_terragrunt_dir(), path_relative_to_include())
}
include {
path = find_in_parent_folders()
}
dependencies {
paths = ["../vpc"] # not dry
}
dependency "vpc" {
config_path = "../vpc" # not dry
}
inputs = {
vpc_id = dependency.vpc.outputs.vpc_id # if something changes or we need more inputs
}
如评论中所述,有些代码不是那么干。如果我想改变一些东西比如改变到另一个vpc或者添加更多的输入,那么我需要到处修改这个文件。
所以我想要模块main.tf下的东西
module "rds-sg" {
source = "terraform-aws-modules/security-group/aws//modules/mysql"
name = "${var.name_prefix}-db-sg"
description = "Security group for mysql 3306 port open within VPC"
vpc_id = ""
# I want something like
# vpc_id = dependency.vpc.outputs.vpc_id
}
这可能吗?或一些更好的做法来解决这个问题?
非常感谢。
也许使用 terraform_remote_state 可以解决这个问题。有更好的主意吗?
这条评论可以更好地解释这个问题。
https://github.com/gruntwork-io/terragrunt/issues/759#issuecomment-687610130
我会使用数据源读取任何资源的任何 ID:
将其添加到使用 VPC ID 的模块中。
data "aws_vpc" "this" {
filter {
name = "tag:Name"
values = [var.name]
}
}
...
vpc_id = data.aws_vpc.this.id
通过这种方式,您可以确保从 AWS API 而不是从 State 文件读取,该文件也进行了计划验证。
我有一个像这样的 terragrunt 项目
├── common_vars.hcl
├── envs
│ ├── dev
│ │ ├── env_vars.hcl
│ │ ├── rds-aurora
│ │ │ └── terragrunt.hcl
│ │ ├── rds-sg
│ │ │ └── terragrunt.hcl
│ │ └── vpc
│ │ └── terragrunt.hcl
│ └── prod
│ ├── env_vars.hcl
│ ├── rds-sg
│ │ └── terragrunt.hcl
│ └── vpc
│ └── terragrunt.hcl
├── modules
│ ├── aws-data
│ │ ├── main.tf
│ │ └── outputs.tf
│ ├── rds-aurora
│ │ └── main.tf
│ ├── rds-sg
│ │ └── main.tf
│ └── vpc
│ └── main.tf
└── terragrunt.hcl
rds-sg是依赖vpc的安全组。 dev和prod下的terragrunt.hcl也是这样的代码
terraform {
source = format("%s/modules//%s", get_parent_terragrunt_dir(), path_relative_to_include())
}
include {
path = find_in_parent_folders()
}
dependencies {
paths = ["../vpc"] # not dry
}
dependency "vpc" {
config_path = "../vpc" # not dry
}
inputs = {
vpc_id = dependency.vpc.outputs.vpc_id # if something changes or we need more inputs
}
如评论中所述,有些代码不是那么干。如果我想改变一些东西比如改变到另一个vpc或者添加更多的输入,那么我需要到处修改这个文件。
所以我想要模块main.tf下的东西
module "rds-sg" {
source = "terraform-aws-modules/security-group/aws//modules/mysql"
name = "${var.name_prefix}-db-sg"
description = "Security group for mysql 3306 port open within VPC"
vpc_id = ""
# I want something like
# vpc_id = dependency.vpc.outputs.vpc_id
}
这可能吗?或一些更好的做法来解决这个问题? 非常感谢。
也许使用 terraform_remote_state 可以解决这个问题。有更好的主意吗?
这条评论可以更好地解释这个问题。 https://github.com/gruntwork-io/terragrunt/issues/759#issuecomment-687610130
我会使用数据源读取任何资源的任何 ID: 将其添加到使用 VPC ID 的模块中。
data "aws_vpc" "this" {
filter {
name = "tag:Name"
values = [var.name]
}
}
...
vpc_id = data.aws_vpc.this.id
通过这种方式,您可以确保从 AWS API 而不是从 State 文件读取,该文件也进行了计划验证。