Terraform: modül çıkışı

Oct 30 2020

App.terraform.io'da üç çalışma alanımız var,

  • ÖLÇEK
  • DEV
  • PRO

Bu çalışma alanlarının değişkenleri vardır.

Değerini bu değişkenlerle alıyorum ...

variable "environment" {}

Bu değişkeni hangi kaynakların veya modüllerin yükleneceğini seçmek için kullanmak istiyorum.

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

Bu işe yarar ama ...

Bu kaynak için olağan çıktı ...

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
}

Ama sayma değerini kullanırsam, hte çıktısı ...

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]

Doğru çıktı ne olur?

Denedim:

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

ve:

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

Ama çalışmıyor (ikisi de)

  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.

Nasıl yapıldığını görmeye çalıştım, örneğin 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]
}

yani ...

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

fakat ...

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.

Yanıtlar

3 BinaryMonster Oct 30 2020 at 09:49

Karmaşık bir şey değil, sadece çıktı yaratılmamış kaynağı arıyor, çünkü terraform hala bir hata attığı için o kaynağa atıfta bulunuyor.

Bu sorunu çözmenin birkaç yolu olsa da, bunlardan biri, tüm kaynakları tek adımda liste halinde birleştirmek ve terraform yerleşik işlevleri kullanarak tek bir öğeyi almaktır.

Kaynakları oluşturmak için sayma koşulunu kullandığınızda çıktınız böyle bir şey olmalıdır. Kaynak oluşturulursa, çıktı kaynağın kimliği olacaktır. Sayı sıfır olduğunda çıktı hatasız boş olacaktır.

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