Terraform: keluaran modul

Oct 30 2020

Kami memiliki tiga ruang kerja di app.terraform.io,

  • UJI
  • DEV
  • PRO

Ruang kerja tersebut memiliki variabel.

Saya mendapatkan nilai dengan variabel itu dengan ...

variable "environment" {}

Saya ingin menggunakan variabel ini untuk memilih sumber daya atau modul yang dimuat.

resource "aws_directory_service_directory" "ds" {
  count = "${var.environment == "TEST" ? 0 : 1}"
  
  name       = "example.com"
  short_name = "example"
  password   = "******"
  type       = "MicrosoftAD"
}

Ini berfungsi tetapi ...

Keluaran biasa untuk sumber daya ini adalah ...

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
}

Tetapi jika saya menggunakan atribut hitungan, keluaran hte gagal dengan ...

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]

Apa yang akan menjadi keluaran rigth?

Saya mencoba:

output id {
  description = "The ID of the directory"
  value       = aws_directory_service_directory.ds[0].id
}

dan:

output id {
  description = "The ID of the directory"
  value       = aws_directory_service_directory.ds[1].id
}

Tapi tidak berhasil (tidak)

  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.

Saya mencoba untuk melihat bagaimana itu dilakukan, misalnya 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]
}

jadi ...

output id {
  description = "The ID of the directory"
  value       = concat(aws_directory_service_directory.*.id, [""])[0]
}

tapi ...

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.

Jawaban

3 BinaryMonster Oct 30 2020 at 09:49

Tidak ada yang rumit, hanya saja keluarannya mencari sumber daya yang tidak dibuat, karena terraform masih mengacu pada sumber daya itu yang menyebabkan kesalahan.

Meskipun ada beberapa cara untuk mengatasi masalah ini, salah satunya adalah menggabungkan semua sumber daya sebagai daftar dalam satu langkah, dan mengambil satu elemen menggunakan fungsi bawaan terraform.

Output Anda harus seperti ini ketika Anda menggunakan count sebagai kondisi untuk membuat resource. Jika sumber daya dibuat, keluarannya adalah id sumber daya. Jika hitungannya nol, keluaran akan kosong tanpa ada kesalahan.

output id {
  description = "The ID of the directory"
  value       = element(concat(aws_directory_service_directory.ds.*.id, list("")), 0)
}