При построении строк, представляющих сериализованные структуры данных, гораздо проще использовать встроенные функции сериализации Terraform для построения результата, чем пытаться создать допустимую строку с использованием шаблонов строк.
В этом случае мы можем использовать jsonencode
для построения строки JSON, представляющей template_body
из значения объекта Terraform, что затем позволяет использовать все функции выражения языка Terraform для ее построения :
template_body = jsonencode({
Description: "eks-${var.cluster_name}-${var.single_az_node_groups[count.index].name}",
Resources: {
ASG: {
Type: "AWS::AutoScaling::AutoScalingGroup",
Properties: {
AutoScalingGroupName: "eks-${var.cluster_name}-${var.single_az_node_groups[count.index].name}",
VPCZoneIdentifier: [var.private_subnet_ids[count.index]],
MinSize: lookup(var.single_az_node_groups[count.index], "asg_min", "0"),
MaxSize: lookup(var.single_az_node_groups[count.index], "asg_max", "10"),
HealthCheckType: "EC2",
TargetGroupArns: flatten([
for g in local.single_az_node_groups : [
split(", ", g.target_group_arns)
]
]),
# etc, etc
},
},
},
})
Как вы можете видеть выше, используя jsonencode
для всей структуры данных, мы можем использовать операторы выражений Terraform для построения значений. Для TargetGroupArns
в вышеприведенном примере я использовал функцию flatten
вместе с for
выражением для преобразования вложенной структуры данных local.single_az_node_groups
в плоский список целевой группы Строки ARN.
CloudFormation поддерживает как JSON, так и YAML, а Terraform также имеет функцию yamlencode
, которую вы могли бы потенциально использовать вместо jsonencode
здесь. Я выбрал jsonencode
, так как yamlencode
в настоящее время помечен как экспериментальный (точное форматирование YAML, которое он производит, может измениться в более позднем выпуске), а также потому, что Terraform имеет специальную поддержку JSON форматирования в выходных данных плана, где он может показать структурную diff структуры данных внутри, а не diff на основе строки.