【发布时间】:2021-11-05 04:40:50
【问题描述】:
我在使用 Terraform 进行测试时遇到问题。我是 AWS 和 Terraform 技术的新手。我正在尝试在负载均衡器下创建一些网络服务器。
为了实现这一点,我创建了:
VPC、子网、互联网网关和路由表:
resource "aws_vpc" "vpc" {
cidr_block = "${var.cidr}"
enable_dns_hostnames = false
enable_dns_support = false
tags = {
Name = "vpc-${var.project}"
}
}
resource "aws_subnet" "pub1" {
cidr_block = "${var.pub1_cidr}"
vpc_id = "${aws_vpc.vpc.id}"
map_public_ip_on_launch = true
availability_zone = "${data.aws_availability_zones.az.names[0]}"
tags = {
Name = "${var.project}-subnetpub1"
}
}
resource "aws_subnet" "pub2" {
cidr_block = "${var.pub2_cidr}"
vpc_id = "${aws_vpc.vpc.id}"
map_public_ip_on_launch = true
availability_zone = "${data.aws_availability_zones.az.names[1]}"
tags = {
Name = "${var.project}-subnetpub2"
}
}
resource "aws_subnet" "pri1" {
cidr_block = "${var.pri1_cidr}"
vpc_id = "${aws_vpc.vpc.id}"
map_public_ip_on_launch = true
availability_zone = "${data.aws_availability_zones.az.names[0]}"
tags = {
Name = "${var.project}-subnet1"
}
}
resource "aws_subnet" "pri2" {
cidr_block = "${var.pri2_cidr}"
vpc_id = "${aws_vpc.vpc.id}"
map_public_ip_on_launch = true
availability_zone = "${data.aws_availability_zones.az.names[1]}"
tags = {
Name = "${var.project}-subnet2"
}
}
resource "aws_internet_gateway" "igw" {
vpc_id = "${aws_vpc.vpc.id}"
}
resource "aws_route" "default_route" {
route_table_id = "${aws_vpc.vpc.default_route_table_id}"
destination_cidr_block = "0.0.0.0/0"
gateway_id = "${aws_internet_gateway.igw.id}"
}
安全组:
resource "aws_security_group" "elb-sg" {
name = "elb-sg"
vpc_id = aws_vpc.vpc.id
# Entrada
ingress {
from_port = 80
protocol = "tcp"
to_port = 80
cidr_blocks = ["0.0.0.0/0"]
}
# Salida
egress {
from_port = 0
protocol = "-1"
to_port = 0
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_security_group" "elb-web" {
name = "web-sg"
vpc_id = aws_vpc.vpc.id
ingress {
from_port = 80
protocol = "tcp"
to_port = 80
# Permitimos el acceso a este security group a aquellos recursos que tengan asigando el security group de elb
security_groups = ["${aws_security_group.elb-sg.id}"]
}
egress {
from_port = 0
protocol = "-1"
to_port = 0
cidr_blocks = ["0.0.0.0/0"]
}
}
最后是 ELB 和 EC2 实例:
resource "aws_elb" "elbweb" {
name = "elb-${var.project}-${var.environment}" # Nombre del balanceador.
cross_zone_load_balancing = true # Balancear entre las zonas
subnets = ["${aws_subnet.pub1.id}","${aws_subnet.pub2.id}"]
security_groups = ["${aws_security_group.elb-sg.id}"]
listener {
instance_port = 80
instance_protocol = "http"
lb_port = 80
lb_protocol = "http"
}
availability_zones = "${data.aws_availability_zones.az.names}"
instances = "${aws_instance.webservers.*.id}"
}
resource "aws_instance" "webservers" {
instance_type = "${var.instance_type}"
ami = "${lookup(var.aws_amis, var.region)}"
vpc_security_group_ids = ["${aws_security_group.elb-web.id}"]
subnet_id = "${aws_subnet.pri1.id}"
count = 3
tags = {
Name = "VM${var.environment}WEBSERVER${count.index}"
}
}
当我尝试apply 时,我收到以下错误:
aws_elb.elbweb: Modifying... [id=elb-web-project-development]
╷
│ Error: Failure registering instances with ELB: InvalidInstance: EC2 instance i-0a39df0625ab87dd1 is not in the same VPC as ELB.
│ status code: 400, request id: c0f700b4-50a7-42af-af9a-a5690509b6cb
│
│ with aws_elb.elbweb,
│ on elb.tf line 1, in resource "aws_elb" "elbweb":
│ 1: resource "aws_elb" "elbweb" {
│
╵
谁能帮帮我?
【问题讨论】:
-
你真的想使用ELB classic吗?如果你在它后面运行一个网络服务器,正常的做法是使用application load balancer,它使用
aws_lbresource。 -
你的代码也有很多不必要的插值(例如
"${var.instance_type}"而不是var.instance_type)。您是否从非常古老的指南中复制内容?您的错误消息看起来像是您使用的是新版本的 Terraform,并且您已将其标记为terraform0.12+,这表明您没有使用早于 0.12 的 Terraform 版本,因此您可以放弃该插值。terraform fmt应该使用新版本的 Terraform 为您处理这个问题 -
@ydaetskcoR 是的,我使用的是旧文档,但我认为这不是问题,我正在学习,对于基本概念,我认为已经足够了。我会审查你告诉我的。无论如何,我不理解反对票
-
反对票不是来自我。这个问题有很多信息,所以我不会反对。不过,我对使用一个长期弃用的东西(经典的负载均衡器)和现在学习 Terraform 的 0.12 之前的语法感到困惑。如果您想学习 Terraform,我可能会从较新的指南/资源开始。我推荐learn.hashicorp.com/terraform。
-
无论如何,我认为错误表明 ELB 和实例都已创建,但它只是无法附加实例。在这种情况下,您应该能够使用 AWS CLI(例如
aws ec2 describe-instances --instance-ids ...和aws elbv2 describe-load-balancers --load-balancer-arns ...)来描述它们并编辑您的问题以包含这些输出。
标签: amazon-web-services terraform terraform-provider-aws terraform0.12+