Terraform:模块输出
Terraform : module output
我们在 app.terraform.io、
中有三个工作区
- 测试
- 开发
- 专业版
那些工作区有变量。
我得到了那个变量的值...
variable "environment" {}
我想使用这个变量来select加载什么资源或模块。
resource "aws_directory_service_directory" "ds" {
count = "${var.environment == "TEST" ? 0 : 1}"
name = "example.com"
short_name = "example"
password = "******"
type = "MicrosoftAD"
}
这有效但是...
此资源的通常输出是...
output id {
description = "The ID of the directory"
value = aws_directory_service_directory.ds.id
}
output access_url {
description = "The access URL for the directory"
value = aws_directory_service_directory.ds.access_url
}
output dns_ip_addresses {
description = "A list of IP addresses of the DNS servers for the directory or connector"
value = aws_directory_service_directory.ds.dns_ip_addresses
}
output security_group_id {
description = "The ID of the security group created by the directory"
value = aws_directory_service_directory.ds.security_group_id
}
但是如果我使用 count 属性,hte 输出会失败...
Because aws_directory_service_directory.ds has "count" set, its attributes
must be accessed on specific instances.
For example, to correlate with indices of a referring resource, use:
aws_directory_service_directory.ds[count.index]
mixture of literal strings and interpolations. This deprecation applies only
to templates that consist entirely of a single interpolation sequence.
Error: Missing resource instance key
on outputs.tf line 51, in output "security_group_id":
51: value = aws_directory_service_directory.ds.security_group_id
Because aws_directory_service_directory.ds has "count" set, its attributes
must be accessed on specific instances.
For example, to correlate with indices of a referring resource, use:
aws_directory_service_directory.ds[count.index]
正确的输出是什么?
我试过了:
output id {
description = "The ID of the directory"
value = aws_directory_service_directory.ds[0].id
}
和:
output id {
description = "The ID of the directory"
value = aws_directory_service_directory.ds[1].id
}
但不管用(都)
on outputs.tf line 36, in output "id":
36: value = aws_directory_service_directory.ds[0].id
|----------------
| aws_directory_service_directory.ds is empty tuple
The given key does not identify an element in this collection value.
Error: Invalid index
on outputs.tf line 36, in output "id":
36: value = aws_directory_service_directory.ds[1].id
|----------------
| aws_directory_service_directory.ds is tuple with 1 element
The given key does not identify an element in this collection value.
我试着看看它是怎么做成的,例如https://github.com/terraform-aws-modules/terraform-aws-vpc
output "vpc_id" {
description = "The ID of the VPC"
value = concat(aws_vpc.this.*.id, [""])[0]
}
所以...
output id {
description = "The ID of the directory"
value = concat(aws_directory_service_directory.*.id, [""])[0]
}
但是...
Error: Invalid reference
on outputs.tf line 36, in output "id":
36: value = concat(aws_directory_service_directory.*.id, [""])[0]
A reference to a resource type must be followed by at least one attribute
access, specifying the resource name.
没什么复杂的,只是输出正在寻找未创建的资源,因为 terraform 仍在引用该资源,因此它抛出错误。
虽然有多种方法可以解决此问题,但其中之一是一步将所有资源连接为列表,然后使用 terraform in-built 函数检索单个元素。
当您使用计数作为创建资源的条件时,您的输出应该是这样的。如果创建了资源,则输出将是资源的 ID。当计数为零时,输出将为空而不会出现任何错误。
output id {
description = "The ID of the directory"
value = element(concat(aws_directory_service_directory.ds.*.id, list("")), 0)
}
我们在 app.terraform.io、
中有三个工作区- 测试
- 开发
- 专业版
那些工作区有变量。
我得到了那个变量的值...
variable "environment" {}
我想使用这个变量来select加载什么资源或模块。
resource "aws_directory_service_directory" "ds" {
count = "${var.environment == "TEST" ? 0 : 1}"
name = "example.com"
short_name = "example"
password = "******"
type = "MicrosoftAD"
}
这有效但是...
此资源的通常输出是...
output id {
description = "The ID of the directory"
value = aws_directory_service_directory.ds.id
}
output access_url {
description = "The access URL for the directory"
value = aws_directory_service_directory.ds.access_url
}
output dns_ip_addresses {
description = "A list of IP addresses of the DNS servers for the directory or connector"
value = aws_directory_service_directory.ds.dns_ip_addresses
}
output security_group_id {
description = "The ID of the security group created by the directory"
value = aws_directory_service_directory.ds.security_group_id
}
但是如果我使用 count 属性,hte 输出会失败...
Because aws_directory_service_directory.ds has "count" set, its attributes
must be accessed on specific instances.
For example, to correlate with indices of a referring resource, use:
aws_directory_service_directory.ds[count.index]
mixture of literal strings and interpolations. This deprecation applies only
to templates that consist entirely of a single interpolation sequence.
Error: Missing resource instance key
on outputs.tf line 51, in output "security_group_id":
51: value = aws_directory_service_directory.ds.security_group_id
Because aws_directory_service_directory.ds has "count" set, its attributes
must be accessed on specific instances.
For example, to correlate with indices of a referring resource, use:
aws_directory_service_directory.ds[count.index]
正确的输出是什么?
我试过了:
output id {
description = "The ID of the directory"
value = aws_directory_service_directory.ds[0].id
}
和:
output id {
description = "The ID of the directory"
value = aws_directory_service_directory.ds[1].id
}
但不管用(都)
on outputs.tf line 36, in output "id":
36: value = aws_directory_service_directory.ds[0].id
|----------------
| aws_directory_service_directory.ds is empty tuple
The given key does not identify an element in this collection value.
Error: Invalid index
on outputs.tf line 36, in output "id":
36: value = aws_directory_service_directory.ds[1].id
|----------------
| aws_directory_service_directory.ds is tuple with 1 element
The given key does not identify an element in this collection value.
我试着看看它是怎么做成的,例如https://github.com/terraform-aws-modules/terraform-aws-vpc
output "vpc_id" {
description = "The ID of the VPC"
value = concat(aws_vpc.this.*.id, [""])[0]
}
所以...
output id {
description = "The ID of the directory"
value = concat(aws_directory_service_directory.*.id, [""])[0]
}
但是...
Error: Invalid reference
on outputs.tf line 36, in output "id":
36: value = concat(aws_directory_service_directory.*.id, [""])[0]
A reference to a resource type must be followed by at least one attribute
access, specifying the resource name.
没什么复杂的,只是输出正在寻找未创建的资源,因为 terraform 仍在引用该资源,因此它抛出错误。
虽然有多种方法可以解决此问题,但其中之一是一步将所有资源连接为列表,然后使用 terraform in-built 函数检索单个元素。
当您使用计数作为创建资源的条件时,您的输出应该是这样的。如果创建了资源,则输出将是资源的 ID。当计数为零时,输出将为空而不会出现任何错误。
output id {
description = "The ID of the directory"
value = element(concat(aws_directory_service_directory.ds.*.id, list("")), 0)
}