如何在子模块中使用远程状态数据源

Posted

技术标签:

【中文标题】如何在子模块中使用远程状态数据源【英文标题】:How to use remote state data sources within child modules 【发布时间】:2019-11-29 14:24:25 【问题描述】:

我正在尝试从远程状态调用数据以引用网络 acl 的 vpc_id。当我运行计划/应用时,我收到错误“此对象没有参数、嵌套块或名为“vpc_id”的导出属性。”

我尝试过使用“data.terraform_remote_state.*.vpc_id”以及“$”语法。我尝试在 variables.tf 中为子模块和父模块定义 data.remote 信息。

我最终需要能够为不同的 VPC/子网动态调用此模块。

相关的 VPC 已经存在,所有模块都已初始化。

s3 bucket stage/network/vpc/terraform.tfstate:

"outputs": 
    "vpc_id": 
      "value": "vpc-1234567890",
      "type": "string"
    
  ,

enter code here

模块/网络/acl/main.tf:

data "terraform_remote_state" "stage-network" 
  backend = "s3"

  config = 
    bucket          = "bucket"
    key             = "stage/network/vpc/terraform.tfstate"
  


resource "aws_network_acl" "main" 
  vpc_id        = data.terraform_remote_state.stage-network.vpc_id
# acl variables here

stage/network/acl/main.tf:

data "terraform_remote_state" "stage-network" 
  backend = "s3"

  config = 
    bucket          = "bucket"
    key             = "stage/network/vpc/terraform.tfstate"
  


module "create_acl" 
  source              = "../../../modules/network/acl/"

vpc_id = var.vpc_id
# vpc_id = data.terraform_remote_state.stage-network.vpc_id
# vpc_id = "$data.terraform_remote_state.stage-network.vpc_id"
# vpc_id = var.data.terraform_remote_state.stage-network.vpc_id

我希望 acl 父模块能够关联到 VPC,并且子模块能够从那里配置变量。

【问题讨论】:

不要为此使用远程状态数据源,而是使用实际的aws_vpc 数据源,这样可以省去很多麻烦。 当我将文件更改为使用 aws_vpc 数据源时,我收到相同的错误消息(错误:不支持的属性 - 此对象没有参数、嵌套块或名为“vpc_id”的导出属性。)。这就是我更改它的方式:父 NACL 中的 main.tf:资源“aws_network_acl”“main” vpc_id = var.vpc_id #other variables variables.tf 在 NACL 父模块中:数据“aws_vpc”“vpc”id = data .aws_vpc.vpc.vpc_id variable "vpc_id" description = "(必填)关联 VPC 的 ID。" 抱歉这里的格式,不知道如何让代码部分在评论中看起来正确。 【参考方案1】:

这是 Terraform 0.12.X 版本引入的重大更改之一。

terraform_remote_state 数据源在 v0.12 版本中略有更改,以使所有远程状态输出都可作为单个地图值使用,而不是像以前版本中那样作为***属性。

在以前的版本中,对远程状态数据源导出的 vpc_id 输出的引用可能如下所示:

data.terraform_remote_state.vpc.vpc_id

现在必须通过新的输出属性访问此值:

data.terraform_remote_state.vpc.outputs.vpc_id

来源:https://www.terraform.io/upgrade-guides/0-12.html#remote-state-references

【讨论】:

【参考方案2】:

在第一个状态: .....

output "expose_vpc_id" 
  value = "$module.network.vpc_id"

在另一种状态下,在 terraform 配置之间共享:

data "terraform_remote_state" "remote" 
  backend = "s3"
  config = 
    bucket = "terraform-ex1"
    key    = "tera-ex1.tfstate"
    region = "us-east-1"
  


output "vpc_id" 
  value = "$data.terraform_remote_state.remote.outputs.expose_vpc_id"

【讨论】:

以上是关于如何在子模块中使用远程状态数据源的主要内容,如果未能解决你的问题,请参考以下文章

如何在子模块中停用 Maven 配置文件?

Play Framework [2.4.x] 如何在子模块的路由文件中处理公共资产

在子模块中使用来自导入模块的组件

在一个多模块的python项目中,如何在子模块中引用项目的根目录?

在子模块内添加 git 子模块(嵌套子模块)

指令在子模块中不起作用