Terraform:正确地为新创建的实例分配静态专用IP

时间:2017-03-08 08:28:07

标签: amazon-web-services amazon-ec2 terraform

目标:

我试图创建一些EC2实例,并为每个EC2实例分配一个来自map变量的静态私有IP地址。该地址必须是主地址,基本上意味着我没有使用aws提供的DHCP分配地址。

问题:

terraform计划成功,我可以创建实例,显示分配的静态IP地址,一起与DHCP分配的地址(在aws控制台中)。当我进入实例时,我看到主地址是DHCP分配的地址。有一个第二个ENI附加到实例(eth1)但静态IP地址不存在。

问题:

如何使用terraform创建实例,使用静态分配的主接口IP地址(eth0),而不是默认分配的DHCP地址?基本上,我怎么能:

a)在实例创建时使用静态分配的接口创建此接口,或者 b)用静态IP地址替换现有的主接口IP地址(或者用新创建的静态IP地址替换整个ENI本身)

以下是详细信息:

我在另一个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

可能有用的一些其他信息:链接到我的完整模块定义文件:

ec2模块的主要定义文件:

http://pastebin.com/zXrZRrQ5

ec2模块的主要output.tf定义文件:

http://pastebin.com/9t5zjfQS

2 个答案:

答案 0 :(得分:2)

Terraform v0.9.4附带aws_instance上的新功能,您可以通过新配置选项network_interface分配给设备索引0:

还有aws_network_interface_attachment,但我相信您需要上面network_interface的新aws_instance选项。

示例配置:

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
  }
}

答案 1 :(得分:1)

我不知道你是否真的想做你正在做的事情。根据您的描述,我希望单个网络接口具有“静态”IP。

现在会做的是使用aws_instance的{​​{3}}参数,它只是设置EC2主机的固定IP。完成。

您似乎尝试在aws_instance中创建没有静态IP的主机(您没有显示它,所以我只是假设),这将是IMHO总是给主机一个动态IP。然后创建第二个网络接口,您可以为其提供静态IP,并将其附加到主机。这不是实例的第一个(或“主要”)接口,但它具有静态IP,根据您的描述,这就是发生的情况。

如果您未在主机定义中指定静态IP,我非常确定您将始终使用DHCP IP地址。

因此,要么您提供有关您的用例的更多信息,要么提供更多代码,但如果我理解正确,您执行操作的方式是错误的。