Amazon web services SSM文档中的Active Directory DNS服务器IP地址列表

Amazon web services SSM文档中的Active Directory DNS服务器IP地址列表,amazon-web-services,terraform,terraform-provider-aws,terraform0.12+,Amazon Web Services,Terraform,Terraform Provider Aws,Terraform0.12+,我正在将我的0.11代码转换为0.12。大多数事情似乎进展顺利,但我真的对SSM文档感到迷茫 在我的0.11代码中,我有以下代码: resource "aws_ssm_document" "ssm_document" { name = "ssm_document_${terraform.workspace}${var.addomainsuffix}" document_type = "Command"

我正在将我的0.11代码转换为0.12。大多数事情似乎进展顺利,但我真的对SSM文档感到迷茫

在我的0.11代码中,我有以下代码:

resource "aws_ssm_document" "ssm_document" {
    name = "ssm_document_${terraform.workspace}${var.addomainsuffix}"
    document_type = "Command"
    content = <<DOC
    {
        "schemaVersion": "1.0",
        "description": "Automatic Domain Join Configuration",
        "runtimeConfig": {
            "aws:domainJoin": {
                "properties": {
                    "directoryId": "${aws_directory_service_directory.microsoftad-lab.id}",
                    "directoryName": "${aws_directory_service_directory.microsoftad-lab.name}",
                    "dnsIpAddresses": [
                        "${aws_directory_service_directory.microsoftad-lab.dns_ip_addresses[0]}",
                        "${aws_directory_service_directory.microsoftad-lab.dns_ip_addresses[1]}"
                    ]
                }
            }
        }
    }
    DOC
    depends_on = ["aws_directory_service_directory.microsoftad-lab"]
}
我越来越

InvalidDocumentContent:JSON格式不正确

这对我来说有点奇怪,因为如果我查看跟踪日志,我似乎得到了相对正确的值:

{"Content":"{\n    \"schemaVersion\": \"1.0\",\n    \"description\": \"Automatic Domain Join Configuration\",\n    \"runtimeConfig\": {\n        \"aws:domainJoin\": {\n            \"properties\": {\n                \"directoryId\": \"d-9967245377\",\n                \"directoryName\": \"012mig.lab\",\n                \"dnsIpAddresses\": [\n                    \"10.0.0.227\",\n
      \"10.0.7.103\",\n                ]\n            }\n        }\n    }\n}\n    \n","DocumentFormat":"JSON","DocumentType":"Command","Name":"ssm_document_012mig.lab"}
我尝试了concat和list将这些值放在一起,但随后出现了数据类型错误。现在,我好像在绕圈子


这里有人能给我一些指导吗?

Terraform 0.12的类型比0.11更严格,并且在封面下进行的自动类型强制更少,所以这里您遇到了这样一个事实:资源的输出:

“dns\u ip\u地址”:{
类型:schema.TypeSet,
元素:&schema.schema{Type:schema.TypeString},
Set:schema.HashString,
对,,
},
而必须首先在0.12中显式转换为列表

例如:

variable "example_list" {
  type = list(string)
  default = [
    "foo",
    "bar",
  ]
}


output "list_first_element" {
  value = var.example_list[0]
}
在此基础上运行
terraform apply
,将输出以下内容:

Outputs:

list_first_element = foo
但是,如果我们改用集合变量:

variable "example_set" {
  type = set(string)
  default = [
    "foo",
    "bar",
  ]
}

output "set_first_element" {
  value = var.example_set[0]
}
然后尝试运行
terraform apply
将抛出以下错误:

Error: Invalid index

  on main.tf line 22, in output "set_foo":
  22:   value = var.example_set[0]

This value does not have any indices.
如果我们使用first将set变量转换为一个列表,那么它将起作用:

variable "example_set" {
  type = set(string)
  default = [
    "foo",
    "bar",
  ]
}

output "set_first_element" {
  value = tolist(var.example_set)[0]
}
请注意,集合的顺序可能与您预期的不同(在本例中,它是按字母顺序排列的,而不是按声明的顺序排列的)。在您的例子中,这不是一个问题,但在为一个项目编制索引时,需要考虑这个问题,因为它期望元素按照您声明的顺序排列

这里的另一个可能选项是,您可以直接将
dns\u ip\u addresses
属性编码为JSON,而不是从输出集或输出列表中构建JSON输出:

运行
terraform apply
后输出以下内容:

Outputs:

set_first_element = ["bar","foo"]
因此,对于您的具体示例,我们希望执行以下操作:

resource "aws_ssm_document" "ssm_document" {
    name = "ssm_document_${terraform.workspace}${var.addomainsuffix}"
    document_type = "Command"
    content = <<DOC
    {
        "schemaVersion": "1.0",
        "description": "Automatic Domain Join Configuration",
        "runtimeConfig": {
            "aws:domainJoin": {
                "properties": {
                    "directoryId": "${aws_directory_service_directory.microsoftad-lab.id}",
                    "directoryName": "${aws_directory_service_directory.microsoftad-lab.name}",
                    "dnsIpAddresses": ${jsonencode(aws_directory_service_directory.microsoftad-lab.dns_ip_addresses)}
                }
            }
        }
    }
    DOC
}
资源“aws\U ssm\U文档”“ssm\U文档”{
name=“ssm_document_${terraform.workspace}${var.addomainsuffix}”
文档类型=“命令”

content=谢谢,这就解决了问题。我想我应该花更多的时间阅读Terraform文档,因为如果我花更多的时间阅读不同的数据类型,我可能会自己找到答案。我确实尝试过将变量包装在list()中,但没有tolist(),看来那是我的错误之一。谢谢。
variable "example_set" {
  type = set(string)
  default = [
    "foo",
    "bar",
  ]
}

output "set_first_element" {
  value = jsonencode(var.example_set)
}
Outputs:

set_first_element = ["bar","foo"]
resource "aws_ssm_document" "ssm_document" {
    name = "ssm_document_${terraform.workspace}${var.addomainsuffix}"
    document_type = "Command"
    content = <<DOC
    {
        "schemaVersion": "1.0",
        "description": "Automatic Domain Join Configuration",
        "runtimeConfig": {
            "aws:domainJoin": {
                "properties": {
                    "directoryId": "${aws_directory_service_directory.microsoftad-lab.id}",
                    "directoryName": "${aws_directory_service_directory.microsoftad-lab.name}",
                    "dnsIpAddresses": ${jsonencode(aws_directory_service_directory.microsoftad-lab.dns_ip_addresses)}
                }
            }
        }
    }
    DOC
}