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 文件读取,该文件也进行了计划验证。