我正在尝试创建应用程序负载均衡器(ALB),并将目标类型设置为实例。我创建了 ec2 、ALB 、route53 、acm 模块以及支持资源。以下是代码文件:
白蛋白.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"
}
}
输出.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
}
Terraform 版本是 1.4.6
我试图在 ALB 模块中使用 ec2 模块的输出值来获取单个 ec2 实例 id,但出现以下错误:
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".
有人可以帮我解决这个问题吗?
很确定你的问题是:
target_id = (element(tolist(module.ec2_instance,1)).id)
您的索引位于 tolist 函数中,而不是位于 element 函数中。
这应该有效:
target_id = (element(tolist(module.ec2_instance),1).id)
然而,核心问题是您的 module.ec2_instance 被设计为对象映射,您无法将其直接转换为列表。
您的两个选择是:
module.ec2_instance["one"].id
values
函数将映射转换为值列表element(values(module.ec2_instance),0).id