Terragrunt v0.14.9、Terraform v0.11.7 从第二个环境读取 AWS VPC ID
Terragrunt v0.14.9, Terraform v0.11.7 reading AWS VPC ID from second environment
我已经使用 Terrag运行t 来协调非默认 AWS VPC 的创建。
我有 S3/DynamoDB state mgmt,VPC 代码是一个模块。我已根据 terragrunt
README.md.
将 'VPC environment' terraform.tfvars
代码检查到第二个回购协议中
我创建了第二个模块,它最终将在此 VPC 中创建主机,但现在只是为了输出其 ID。我为这个模块的实例化创建了一个单独的 'hosts environment' / terraform.tfvars
。
- 我运行
terragrunt apply
在VPC环境目录-创建VPC
- 我 运行
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) 时,它退出:
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
mon_vpc = 2018-06-02 23:14:42.958848954 +0000 UTC
问题:
我在设置代码时出错,因此主机 environment 被配置为正确地从已经存在的 VPC (terraform state 文件)- 任何有关此处更改内容的建议都将不胜感激。
看起来我确实设法获取了 VPC 的创建日期而不是它的 ID,考虑到代码令人费解 - 有人知道为什么吗?
我没有使用社区模块 - 都是手工制作的。
编辑:为了回应 Brandon Miller,这里有更多内容。在我的 VPC 模块中,我有一个 outputs.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>
,我假设状态将包含足够的数据供其他模块通过咨询状态来引用(我起初假设terraform 在引擎盖下为此使用了 AWS API,而不是咨询不同的状态密钥)。
编辑 2:首先阅读@brendan-miller 的所有回答和以下评论。
使用句点会导致问题,因为它会混淆 terraform(请参阅 Brendan 对以下规范格式的回答):
Error: output 'mon_vpc': unknown resource 'data.aws_vpc.mv-ds' referenced in variable data.aws_vpc.mv-ds.vpc.id
您将输出命名为 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 的信息非常有用。
我已经使用 Terrag运行t 来协调非默认 AWS VPC 的创建。
我有 S3/DynamoDB state mgmt,VPC 代码是一个模块。我已根据 terragrunt
README.md.
terraform.tfvars
代码检查到第二个回购协议中
我创建了第二个模块,它最终将在此 VPC 中创建主机,但现在只是为了输出其 ID。我为这个模块的实例化创建了一个单独的 'hosts environment' / terraform.tfvars
。
- 我运行
terragrunt apply
在VPC环境目录-创建VPC - 我 运行
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) 时,它退出:
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
mon_vpc = 2018-06-02 23:14:42.958848954 +0000 UTC
问题:
我在设置代码时出错,因此主机 environment 被配置为正确地从已经存在的 VPC (terraform state 文件)- 任何有关此处更改内容的建议都将不胜感激。
看起来我确实设法获取了 VPC 的创建日期而不是它的 ID,考虑到代码令人费解 - 有人知道为什么吗?
我没有使用社区模块 - 都是手工制作的。
编辑:为了回应 Brandon Miller,这里有更多内容。在我的 VPC 模块中,我有一个 outputs.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>
,我假设状态将包含足够的数据供其他模块通过咨询状态来引用(我起初假设terraform 在引擎盖下为此使用了 AWS API,而不是咨询不同的状态密钥)。
编辑 2:首先阅读@brendan-miller 的所有回答和以下评论。 使用句点会导致问题,因为它会混淆 terraform(请参阅 Brendan 对以下规范格式的回答):
Error: output 'mon_vpc': unknown resource 'data.aws_vpc.mv-ds' referenced in variable data.aws_vpc.mv-ds.vpc.id
您将输出命名为 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 的信息非常有用。