Amazon web services SSM文档中的Active Directory DNS服务器IP地址列表
我正在将我的0.11代码转换为0.12。大多数事情似乎进展顺利,但我真的对SSM文档感到迷茫 在我的0.11代码中,我有以下代码: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"
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
}