Terraform:将静态专用 IP 正确分配给新创建的实例
Terraform: Correctly assigning a static private IP to newly created instance
Objective:
我正在尝试创建多个 EC2 实例,并从映射变量中为每个实例分配一个静态私有 IP 地址。该地址必须是主地址,基本上意味着我没有使用 aws 提供的 DHCP 分配地址。
问题:
terraform 计划成功,我可以创建显示分配的静态 IP 地址的实例,与 DHCP 分配的地址一起(在 aws 控制台中)。当我通过 ssh 进入实例时,我看到主地址是 DHCP 分配的地址。实例 (eth1) 上附加了第二个 ENI,但静态 IP 地址不存在。
问题:
如何使用主接口 (eth0) 的静态分配 IP 地址而不是默认分配的 DHCP 地址让 terraform 创建实例?基本上,我怎样才能:
a) 在实例创建时使用静态分配的接口创建此接口,或者,
b) 将现有主接口 IP 地址替换为静态地址(或将整个 ENI 本身替换为新创建的具有静态 IP 地址的地址)
详情如下:
我在单独的 main.tf 文件中使用模块如下:
a) 创建实例
module "ec2-hadoop-manager" {
source = "../modules/ec2"
ami_id = "${var.dw_manager["ami"]}"
instance_type = "${var.dw_manager["instance_type"]}"
aws_region = "${var.region}"
availability_zone = "eu-west-1a"
associate_public_ip_address = true
role = "hadoop-manager"
env = "${var.environment}"
vpc = "${var.vpc_id}"
security_group_ids = "${var.aws_security_group_id["sg_id"]}"
key_name = "${var.key_name}"
subnet_id = "${var.default_subnet}"
number_of_instances = "${var.dw_manager["count"]}"
}
b) 我正在使用资源(在 main.tf 中的模块集团之外)将私有 IP 分配给实例:
resource "aws_network_interface" "private_ip" {
count = "${var.dw_manager["count"]}"
subnet_id = "${var.default_subnet}"
private_ips = ["${lookup(var.dw_manager_ips, count.index)}"]
security_groups = "${var.aws_security_group_id["sg_id"]}"
attachment {
instance = "${element(split(",", module.ec2-hadoop-manager.ec2_instance_ip), count.index)}"
device_index = 1
}
}
注意:我尝试将 device_index 更改为 0,但正如预期的那样,aws 抱怨索引 0 处已经附加了一个 eni:
Error applying plan:
3 error(s) occurred:
* aws_network_interface.private_ip.0: Error attaching ENI: InvalidParameterValue: Instance 'i-09f1371f798c2f6b3' already has an interface attached at device index '0'.
status code: 400, request id: ed1737d9-5342-491a-85a5-e49e70b7503d
* aws_network_interface.private_ip.2: Error attaching ENI: InvalidParameterValue: Instance 'i-012bda6948bbe00c9' already has an interface attached at device index '0'.
status code: 400, request id: 794c04fb-9089-4ad0-8f5d-ba572777575a
* aws_network_interface.private_ip.1: Error attaching ENI: InvalidParameterValue: Instance 'i-00ac215801de3aba8' already has an interface attached at device index '0'.
状态码:400,请求id:cbd9e36d-145f-45d4-934f-0a9c2f6e7768
一些可能有用的附加信息:Link 我的完整模块定义文件:
ec2 模块的主要定义文件:
ec2 模块的主要 outputs.tf 定义文件:
我不知道你是否真的想做你正在做的事情。根据您的描述,我希望有一个具有 "static" IP 的单一网络接口。
现在我会做的是使用aws_instance
的private_ip
参数,它只是为EC2主机设置固定IP。完成。
您似乎尝试在 aws_instance
中创建没有静态 IP 的主机(您没有显示它,所以我只是假设),恕我直言,这将始终为主机提供动态 IP .然后你创建第二个网络接口,你给它一个静态 IP,并将它附加到主机。这不会是实例的第一个(或 "primary")接口,但它有一个静态 IP,根据您的描述,情况就是这样。
我敢肯定,如果您没有在主机定义中指定静态 IP,那么您最终会得到一个 DHCP IP 地址。
因此,要么您提供有关您的用例的更多信息,要么提供更多代码,但如果我理解正确的话,您做事的方式与您想要的完全不同。
Terraform v0.9.4 在 aws_instance
上附带了一项新功能,让您可以通过新的配置选项 network_interface
:
分配给设备索引 0
还有 aws_network_interface_attachment,但我相信您想要上面 aws_instance
的新 network_interface
选项。
示例配置:
resource "aws_network_interface" "foo" {
subnet_id = "${aws_subnet.my_subnet.id}"
private_ips = ["172.16.10.100"]
tags {
Name = "primary_network_interface"
}
}
resource "aws_instance" "foo" {
ami = "ami-22b9a343" // us-west-2
instance_type = "t2.micro"
network_interface {
network_interface_id = "${aws_network_interface.foo.id}"
device_index = 0
}
}
我知道这个问题很老了,但我有一些有用的东西要补充。 EC2 实例的地址是 always 来自 DHCP。 AWS 使用 DHCP 预留分配 IP 地址。动态分配地址和“静态”私有地址之间的唯一区别是,前者 AWS 是从可用地址中随机挑选用于预订,而后者是您自己挑选。两者的应用方式完全相同,因此您永远不会在盒子上看到静态 IP。
Objective:
我正在尝试创建多个 EC2 实例,并从映射变量中为每个实例分配一个静态私有 IP 地址。该地址必须是主地址,基本上意味着我没有使用 aws 提供的 DHCP 分配地址。
问题:
terraform 计划成功,我可以创建显示分配的静态 IP 地址的实例,与 DHCP 分配的地址一起(在 aws 控制台中)。当我通过 ssh 进入实例时,我看到主地址是 DHCP 分配的地址。实例 (eth1) 上附加了第二个 ENI,但静态 IP 地址不存在。
问题:
如何使用主接口 (eth0) 的静态分配 IP 地址而不是默认分配的 DHCP 地址让 terraform 创建实例?基本上,我怎样才能:
a) 在实例创建时使用静态分配的接口创建此接口,或者, b) 将现有主接口 IP 地址替换为静态地址(或将整个 ENI 本身替换为新创建的具有静态 IP 地址的地址)
详情如下:
我在单独的 main.tf 文件中使用模块如下:
a) 创建实例
module "ec2-hadoop-manager" {
source = "../modules/ec2"
ami_id = "${var.dw_manager["ami"]}"
instance_type = "${var.dw_manager["instance_type"]}"
aws_region = "${var.region}"
availability_zone = "eu-west-1a"
associate_public_ip_address = true
role = "hadoop-manager"
env = "${var.environment}"
vpc = "${var.vpc_id}"
security_group_ids = "${var.aws_security_group_id["sg_id"]}"
key_name = "${var.key_name}"
subnet_id = "${var.default_subnet}"
number_of_instances = "${var.dw_manager["count"]}"
}
b) 我正在使用资源(在 main.tf 中的模块集团之外)将私有 IP 分配给实例:
resource "aws_network_interface" "private_ip" {
count = "${var.dw_manager["count"]}"
subnet_id = "${var.default_subnet}"
private_ips = ["${lookup(var.dw_manager_ips, count.index)}"]
security_groups = "${var.aws_security_group_id["sg_id"]}"
attachment {
instance = "${element(split(",", module.ec2-hadoop-manager.ec2_instance_ip), count.index)}"
device_index = 1
}
}
注意:我尝试将 device_index 更改为 0,但正如预期的那样,aws 抱怨索引 0 处已经附加了一个 eni:
Error applying plan:
3 error(s) occurred:
* aws_network_interface.private_ip.0: Error attaching ENI: InvalidParameterValue: Instance 'i-09f1371f798c2f6b3' already has an interface attached at device index '0'.
status code: 400, request id: ed1737d9-5342-491a-85a5-e49e70b7503d
* aws_network_interface.private_ip.2: Error attaching ENI: InvalidParameterValue: Instance 'i-012bda6948bbe00c9' already has an interface attached at device index '0'.
status code: 400, request id: 794c04fb-9089-4ad0-8f5d-ba572777575a
* aws_network_interface.private_ip.1: Error attaching ENI: InvalidParameterValue: Instance 'i-00ac215801de3aba8' already has an interface attached at device index '0'.
状态码:400,请求id:cbd9e36d-145f-45d4-934f-0a9c2f6e7768
一些可能有用的附加信息:Link 我的完整模块定义文件:
ec2 模块的主要定义文件:
ec2 模块的主要 outputs.tf 定义文件:
我不知道你是否真的想做你正在做的事情。根据您的描述,我希望有一个具有 "static" IP 的单一网络接口。
现在我会做的是使用aws_instance
的private_ip
参数,它只是为EC2主机设置固定IP。完成。
您似乎尝试在 aws_instance
中创建没有静态 IP 的主机(您没有显示它,所以我只是假设),恕我直言,这将始终为主机提供动态 IP .然后你创建第二个网络接口,你给它一个静态 IP,并将它附加到主机。这不会是实例的第一个(或 "primary")接口,但它有一个静态 IP,根据您的描述,情况就是这样。
我敢肯定,如果您没有在主机定义中指定静态 IP,那么您最终会得到一个 DHCP IP 地址。
因此,要么您提供有关您的用例的更多信息,要么提供更多代码,但如果我理解正确的话,您做事的方式与您想要的完全不同。
Terraform v0.9.4 在 aws_instance
上附带了一项新功能,让您可以通过新的配置选项 network_interface
:
还有 aws_network_interface_attachment,但我相信您想要上面 aws_instance
的新 network_interface
选项。
示例配置:
resource "aws_network_interface" "foo" {
subnet_id = "${aws_subnet.my_subnet.id}"
private_ips = ["172.16.10.100"]
tags {
Name = "primary_network_interface"
}
}
resource "aws_instance" "foo" {
ami = "ami-22b9a343" // us-west-2
instance_type = "t2.micro"
network_interface {
network_interface_id = "${aws_network_interface.foo.id}"
device_index = 0
}
}
我知道这个问题很老了,但我有一些有用的东西要补充。 EC2 实例的地址是 always 来自 DHCP。 AWS 使用 DHCP 预留分配 IP 地址。动态分配地址和“静态”私有地址之间的唯一区别是,前者 AWS 是从可用地址中随机挑选用于预订,而后者是您自己挑选。两者的应用方式完全相同,因此您永远不会在盒子上看到静态 IP。