Estou tentando criar o Application Load Balancer(ALB) para o qual definindo o tipo de destino como instância. Criei módulos ec2,ALB,route53,acm juntamente com recursos de suporte. A seguir estão os arquivos de código:
alb.tf
module "ec2_instance" {
source = "terraform-aws-modules/ec2-instance/aws"
for_each = toset(["one", "two"])
name = "bcr-templates-instance-${each.key}"
instance_type = "t2.micro"
ami = data.aws_ami.bcr-templates-ami.id
key_name = "${aws_key_pair.generated_key.key_name}"
monitoring = true
vpc_security_group_ids = [module.vpc.default_security_group_id]
subnet_id = module.vpc.public_subnets[0]
tags = {
Terraform = "true"
Environment = "dev"
}
}
module "alb" {
source = "terraform-aws-modules/alb/aws"
version = "~> 8.0"
name = "bcr-templates-alb"
load_balancer_type = "application"
vpc_id = module.vpc.vpc_id
subnets = module.vpc.public_subnets
security_groups = [module.vpc.default_security_group_id]
security_group_rules = {
ingress_all_http = {
type = "ingress"
from_port = 80
to_port = 80
protocol = "tcp"
description = "HTTP web traffic"
cidr_blocks = ["0.0.0.0/0"]
}
ingress_all_icmp = {
type = "ingress"
from_port = -1
to_port = -1
protocol = "icmp"
description = "ICMP"
cidr_blocks = ["0.0.0.0/0"]
}
egress_all = {
type = "egress"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
target_groups = [
{
name_prefix = "h1"
backend_protocol = "HTTP"
backend_port = 80
target_type = "instance"
targets = {
ec2_target = {
target_id = (element(tolist(module.ec2_instance,0)).id)
port = 80
}
my_other_target = {
target_id = (element(tolist(module.ec2_instance,1)).id)
port = 8080
}
}
}
]
https_listeners = [
{
port = 443
protocol = "HTTPS"
certificate_arn = module.acm.acm_certificate_arn
target_group_index = 0
}
]
http_tcp_listeners = [
{
port = 80
protocol = "HTTP"
target_group_index = 0
},
{
port = 81
protocol = "HTTP"
action_type = "forward"
forward = {
target_groups = [
{
target_group_index = 0
weight = 100
},
{
target_group_index = 1
weight = 0
}
]
}
},
{
port = 82
protocol = "HTTP"
action_type = "redirect"
redirect = {
port = "443"
protocol = "HTTPS"
status_code = "HTTP_301"
}
},
{
port = 83
protocol = "HTTP"
action_type = "fixed-response"
fixed_response = {
content_type = "text/plain"
message_body = "Fixed message"
status_code = "200"
}
},
]
tags = {
Environment = "dev"
}
}
saídas.tf
output "ami" {
description = "AMI ID that was used to create the instance"
value = toset([ for v in module.ec2_instance : v.ami ])
}
output "id" {
description = "The ID of the instance"
value = values(module.ec2_instance)[*].id
}
A versão do Terraform é 1.4.6
Estou tentando usar o valor de saída do módulo ec2 no módulo ALB para buscar uma única id de instância ec2, mas estou recebendo o seguinte erro:
Error: Not enough function arguments
on alb.tf line 274, in module "alb":
274: target_id = (element(tolist(module.ec2_instance,0)).id)
├────────────────
│ while calling element(list, index)
│ module.ec2_instance is a map of object
Function "element" expects 2 argument(s). Missing value for "index".
Error: Not enough function arguments
on alb.tf line 278, in module "alb":
278: target_id = (element(tolist(module.ec2_instance,1)).id)
├────────────────
│ while calling element(list, index)
│ module.ec2_instance is a map of object
Function "element" expects 2 argument(s). Missing value for "index".
Alguém por favor poderia me ajudar nisso?
Certeza que seu problema é:
target_id = (element(tolist(module.ec2_instance,1)).id)
Seu índice é colocado na função tolist, não na função elemento.
Isso deve funcionar:
target_id = (element(tolist(module.ec2_instance),1).id)
No entanto, o problema principal é que seu module.ec2_instance é concebido como um mapa de objetos, que você não pode converter diretamente em uma lista.
Suas duas opções são:
module.ec2_instance["one"].id
values
função para converter o mapa em uma lista de valoreselement(values(module.ec2_instance),0).id