Terraform: modül çıkışı
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
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)
}