Amazon web services 在terraform中,如何输出aws_route53_记录别名值?

Amazon web services 在terraform中,如何输出aws_route53_记录别名值?,amazon-web-services,terraform,terraform-provider-aws,Amazon Web Services,Terraform,Terraform Provider Aws,地形v0.12.x 我正在创建一个AWS Route53记录,就像这样,而且创建时没有任何问题 data "aws_route53_zone" "zone" { name = "my.domain.com." private_zone = true } resource "aws_route53_record" "record" { zone_id = data.aw

地形v0.12.x

我正在创建一个AWS Route53记录,就像这样,而且创建时没有任何问题

data "aws_route53_zone" "zone" {
  name         = "my.domain.com."
  private_zone = true
}

resource "aws_route53_record" "record" {
  zone_id = data.aws_route53_zone.zone.zone_id
  name    = "${var.record_name}.${data.aws_route53_zone.zone.name}"
  type    = "A"
  alias {
    name                   = var.alias_record
    zone_id                = var.alias_zone_id
    evaluate_target_health = false
  }
}
现在我想输出别名的值,我尝试了

output "alias_name" {
  value = aws_route53_record.record.alias.name
}

但是,我得到了错误

Block type "alias" is represented by a set of objects, and set elements do not
have addressable keys. To find elements matching specific criteria, use a
"for" expression with an "if" clause.
正确的语法是什么?

别名是一组对象和集合:

没有任何辅助标识符或顺序的唯一值的集合

所以你不能给它们编索引。因此,在您的情况下,要输出别名值,您可以使用:

output "alias_name" {
  value = aws_route53_record.record.alias.*.name
}

# or

output "alias_name2" {
  value = aws_route53_record.record.alias[*].name
}
别名是一组对象和集合:

没有任何辅助标识符或顺序的唯一值的集合

所以你不能给它们编索引。因此,在您的情况下,要输出别名值,您可以使用:

output "alias_name" {
  value = aws_route53_record.record.alias.*.name
}

# or

output "alias_name2" {
  value = aws_route53_record.record.alias[*].name
}

此处返回的错误消息Terraform是它为表示为一组对象的所有块类型返回的通用消息,因此它为您提供了一些基于其值或嵌套值选择集合元素的一般建议。例如:

output "example" {
  # Select the first element from the
  # set whose name is "foo".
  value = [
    for a in aws_route53_record.record.alias : a
    if a.name == "foo"
  ][0]
}
该建议实际上不适合您在这里遇到的特定问题,因为您没有找到与特定条件匹配的元素,而只是尝试选择您知道自己编写的一个元素,因为您只静态定义了一个alias块,所以您知道它将始终存在并且始终是正确的

为此,一个选项是使用显式地将集合转换为列表。文档警告说,生成的元素不会以任何特定顺序排列,但如果只有一个元素,则该元素只能有一个顺序,因此这是安全的:

output "example" {
  # Select the first element from the
  # set whose name is "foo".
  value = tolist(aws_route53_record.record.alias)[0].name
}
如果底层API认为对象无序且没有特定的唯一标识符,则提供程序通常使用特定块类型的集合表示。不幸的是,这样的结果使用起来不太方便,但是使用这种对底层行为的精确建模可以避免出现这样的问题:配置最初可能会工作,但如果远程API开始以不同的任意顺序返回项,那么之后可能会出现错误行为


这个别名块的集合选择有点奇怪,因为它被定义为只允许零个或一个块;我怀疑这是一个历史性的设计怪癖,提供者现在为了向后兼容而保留它。

这里返回的错误消息Terraform是它为表示为一组对象的所有块类型返回的通用消息,因此,它为您提供了一些基于集合元素的值或嵌套值来选择集合元素的一般建议。例如:

output "example" {
  # Select the first element from the
  # set whose name is "foo".
  value = [
    for a in aws_route53_record.record.alias : a
    if a.name == "foo"
  ][0]
}
该建议实际上不适合您在这里遇到的特定问题,因为您没有找到与特定条件匹配的元素,而只是尝试选择您知道自己编写的一个元素,因为您只静态定义了一个alias块,所以您知道它将始终存在并且始终是正确的

为此,一个选项是使用显式地将集合转换为列表。文档警告说,生成的元素不会以任何特定顺序排列,但如果只有一个元素,则该元素只能有一个顺序,因此这是安全的:

output "example" {
  # Select the first element from the
  # set whose name is "foo".
  value = tolist(aws_route53_record.record.alias)[0].name
}
如果底层API认为对象无序且没有特定的唯一标识符,则提供程序通常使用特定块类型的集合表示。不幸的是,这样的结果使用起来不太方便,但是使用这种对底层行为的精确建模可以避免出现这样的问题:配置最初可能会工作,但如果远程API开始以不同的任意顺序返回项,那么之后可能会出现错误行为


这个别名块的集合选择有点奇怪,因为它被定义为只允许零个或一个块;我怀疑这是提供商为了向后兼容而保留的一个历史设计怪癖。

将Marcin和Martin的答案结合起来,这是我最终使用的

output "alias_name" {
  value =  tolist(aws_route53_record.record.alias.*.name)[0]
}
马辛的回答给出了答案

alias_name = [
  "my-record.domain.com",
]
alias_name = {
  "evaluate_target_health" = false
  "name" = "my-record.domain.com"
  "zone_id" = "Z1234ABCDE"
}
马丁的回答给出了答案

alias_name = [
  "my-record.domain.com",
]
alias_name = {
  "evaluate_target_health" = false
  "name" = "my-record.domain.com"
  "zone_id" = "Z1234ABCDE"
}
但是把这两个答案结合起来,就像我上面所说的那样

alias_name = my-record.domain.com

将马辛和马丁的答案结合起来,这是我最终使用的答案

output "alias_name" {
  value =  tolist(aws_route53_record.record.alias.*.name)[0]
}
马辛的回答给出了答案

alias_name = [
  "my-record.domain.com",
]
alias_name = {
  "evaluate_target_health" = false
  "name" = "my-record.domain.com"
  "zone_id" = "Z1234ABCDE"
}
马丁的回答给出了答案

alias_name = [
  "my-record.domain.com",
]
alias_name = {
  "evaluate_target_health" = false
  "name" = "my-record.domain.com"
  "zone_id" = "Z1234ABCDE"
}
但是把这两个答案结合起来,就像我上面所说的那样

alias_name = my-record.domain.com

谢谢,这很有道理,而且很有效。但是,我可以按照错误消息的建议使用for和if语句吗?如果是这样,怎么办?谢谢,这很有道理,而且很有效。但是,我可以按照错误消息的建议使用for和if语句吗?如果是,怎么办?对不起。。。我意识到回过头来看我的答案,我忘记了包含.name属性,因此它确实导出了整个对象,而不仅仅是名称。我已经编辑了我的答案以包含.name,但我在答案中所做的功能与您在答案中所做的功能相同,只是写出来有点不同。对不起。。。我意识到我 回想我的答案,我忘记了包含.name属性,因此它确实导出了整个对象,而不仅仅是名称。我已经编辑了我的答案以包括.name,但我在答案中所做的功能与你在你的答案中所做的功能相同,只是写出来有点不同。