【问题标题】:Terragrunt v0.14.9, Terraform v0.11.7 reading AWS VPC ID from second environmentTerragrunt v0.14.9、Terraform v0.11.7 从第二个环境读取 AWS VPC ID
【发布时间】:2018-11-12 16:50:03
【问题描述】:

我使用 Terragrunt 来编排非默认 AWS VPC 的创建。 我有 S3/DynamoDB 状态管理,VPC 代码是一个模块。根据terragruntREADME.md,我将“VPC 环境”terraform.tfvars 代码签入第二个存储库。

我创建了第二个模块,该模块最终将在此 VPC 中创建主机,但目前仅用于输出其 ID。我为这个模块的实例化创建了一个单独的“主机环境”/terraform.tfvars

  1. 我在 VPC 环境目录中运行 terragrunt apply - VPC created
  2. 我在主机环境目录中第二次运行terragrunt apply - 输出指令不起作用(没有错误,但不正确,见下文)。

这是有一天在 VPC/hosts 环境目录的父目录中运行terragrunt apply-all 的前兆;我对文档的阅读建议使用terraform_remote_state 数据源来公开VPC ID,因此我在主机模块data.tf 文件中指定了这样的访问权限:

data "terraform_remote_state" "vpc" {
    backend = "s3"
    config {
        bucket  = "myBucket"
        key     = "keyToMy/vpcEnvironment.tfstate"
        region  = "stateRegion"
    }
}

然后,在主机模块 outputs.tf 中,我指定了一个输出来检查分配:

output "mon_vpc" {
    value = "${data.terraform_remote_state.vpc.id}"
}

当我运行上面的 (2) 时,它退出:

申请完成!资源:添加 0 个,更改 0 个,销毁 0 个。

输出:

mon_vpc = 2018-06-02 23:14:42.958848954 +0000 UTC

问题:

  1. 我在设置代码时出错,以便将主机 环境 配置为从已经存在的 VPC(terraform 状态文件)正确获取 VPC ID - 关于任何建议我们将不胜感激。

  2. 看起来我确实设法获取了 VPC 的创建日期而不是其 ID,鉴于代码令人困惑 - 有人知道为什么吗?

我没有使用社区模块 - 都是手工制作的。

编辑:作为对 Brandon Miller 的回应,这里还有更多内容。在我的 VPC 模块中,我有一个 output.tf,其中包含其他输出:

output "aws_vpc.mv.id-op" {
    value = "${aws_vpc.mv.id}"
}

并且 vpc.tf 包含

resource "aws_vpc" "mv" {
    cidr_block = "${var.vpcCidr}"
    enable_dns_support = true
    enable_dns_hostnames = true
    tags = {
        Name = "mv-vpc-${var.aws_region}"
    }
}

由于这个 cfg 导致创建了一个 vpc,并且由于大多数参数是 <computed>,我假设 state 将包含足够的数据供其他模块通过咨询 state 引用(我最初假设 terraform 使用 AWS引擎盖下的 API,而不是咨询不同的状态密钥)。

编辑 2:首先阅读 @brendan-miller 的所有答案并关注 cmets。 使用句点会导致问题,因为它会混淆 terraform(请参阅 Brendan 对以下规范格式的回答):

Error: output 'mon_vpc': unknown resource 'data.aws_vpc.mv-ds' referenced in variable data.aws_vpc.mv-ds.vpc.id

【问题讨论】:

  • 你如何在远程状态下为你的 vpc 声明输出?
  • @brandon-miller 我编辑了帖子以反映我的声明。如果这能回答您的问题,请告诉我。
  • 谢谢,希望我能帮上忙

标签: amazon-web-services terraform terraform-provider-aws terragrunt


【解决方案1】:

您将输出命名为aws_vpc.mv.id-op,但是当您检索它时,您检索的只是id。你可以试试

data.terraform_remote_state.vpc.aws_vpc.mv.id

但我不确定 Terraform 是否会抱怨额外的 .。但是格式应始终为

data.terraform_remote_state.<name of the remote state module>.<name of the output>

您提到希望能够使用 AWS API 获取此信息。这也可以通过使用aws_vpc 数据源来实现。他们的示例使用 id,但您也可以使用您在 vpc 上使用的任何标签。

像这样:

data "aws_vpc" "default" {
  filter {
    name   = "tag:Name"
    values = ["example-vpc-name"]
  }
}

然后你可以用这个作为id

${data.aws_vpc.default.id}

此外,这会检索所有标签集,例如:

${data.aws_vpc.default.tags.Name}

还有 cidr 块

${data.aws_vpc.default.cidr_block}

以及其他一些信息。这对于存储和检索有关您的 VPC 的内容非常有用。

【讨论】:

  • @brendan-miller 是的,我认为期间可能会导致问题,但它是使用 aws_vpc data source 过滤器赢得了它。克里斯!
  • 很高兴知道这些时期不会引起问题!
  • 不,抱歉,我应该分别测试两者。请参阅我的 EDIT2。
猜你喜欢
  • 2019-11-27
  • 1970-01-01
  • 2021-07-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2018-07-09
  • 2020-12-17
相关资源
最近更新 更多