AWS中的Auto Scale的静态IP

时间:2015-11-12 16:47:50

标签: amazon-web-services chef amazon-cloudformation

我需要在AWS自动扩展组中的所有实例配置(已知)静态IP。我将在稍后的邮件服务器中将所有这些IP列入白名单(这就是为什么需要所有这些IP都是静态的)。是否可以使用常规的云形式方法?可能是分配第二个NIC并从静态IP范围为其分配IP?有什么想法吗?

5 个答案:

答案 0 :(得分:7)

很遗憾,您无法访问自动缩放组的任何自定义IP范围。

您可以获取您所在地区的IP范围,并将该地区的所有IP列入白名单,但这不会将其他AWS账户中的实例列入黑名单。您可以获得这些范围here

您可以在AWS中配置静态IP - 它们称为弹性IP。弹出IP地址将在停止/启动之间保持实例。弹性IP也是“弹性的”,因为它们可以从一个网络接口或实例分离并连接到另一个网络接口或实例。

不幸的是,没有办法让自动扩展自动为新启动的实例分配弹性IP地址。您需要编写一个在启动新实例时运行的脚本。您可以使用EC2用户数据运行此脚本。

然后,您可以使用CLI或SDK。该脚本需要为您的帐户分配一个新的弹性IP地址,然后将该弹性IP与该实例相关联。

或者,您可以使用Lambda运行脚本来执行相同的操作,但是响应自动缩放事件。

您可能遇到的其他问题:

  1. 默认情况下,您的帐户每个区域只能有5个弹性IP。您需要提交限制增加以获得更多 - 这可能最终成为一个持续存在的问题。
  2. 在ASG中终止实例时会发生什么?弹性IP将被取消关联 - 您需要为分离的弹性IP付费。您总是可以编写一个Lambda函数来运行,以响应释放任何取消关联的弹性IP的自动控制事件 - 但这会产生更多的开销。
  3. 不幸的是,这个问题没有很好的解决方案。最简单的方法是将该区域的所有Amazon IP列入白名单,但您仍然存在潜在的安全问题。

    修改 您也可以只创建一个代理实例。您可以配置ASG中的所有实例以通过代理实例引导流量。然后,您可以为代理实例提供弹性IP并将其保留在防火墙中。

    唯一可能的问题是您的代理服务器过载。您需要确保您使用的实例类型可以处理ASG中满负荷允许的最大实例数。

答案 1 :(得分:1)

听起来你正在寻找的是弹性IP

  

弹性IP地址是为动态云计算设计的静态IP地址。使用弹性IP地址,您可以通过快速将地址重新映射到帐户中的另一个实例来屏蔽实例或软件的故障。您的弹性IP地址与您的AWS账户相关联,而非与特定实例相关联,并且在您选择明确发布之前,它仍与您的帐户相关联。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html

答案 2 :(得分:1)

我们通过使用云形成分配静态IP来实现这一目标,并且从VPC子网中获取IP。

答案 3 :(得分:1)

一种解决方法是使您的实例使用NAT网关连接到邮件服务器。您必须将它们放在一个子网中,在该子网中,对电子邮件服务器的请求将路由到NATGW。

您只需要将NATGW的弹性IP列入白名单。

但是请先检查成本:NAT网关的固定成本约为每天2美元,每GB流量成本较低。

答案 4 :(得分:0)

@Saboo解决方案有效。您需要在启动时映射公共IP  子网。

以下是Terraform中的脚本:

使用预先分配的专用IP(仅限VPC)将EIP附加到实例:

resource "aws_vpc" "default" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
}

resource "aws_internet_gateway" "gw" {
  vpc_id = "${aws_vpc.default.id}"
}

resource "aws_subnet" "tf_test_subnet" {
  vpc_id                  = "${aws_vpc.default.id}"
  cidr_block              = "10.0.0.0/24"
  map_public_ip_on_launch = true

  depends_on = ["aws_internet_gateway.gw"]
}

resource "aws_instance" "foo" {
  # us-west-2
  ami           = "ami-5189a661"
  instance_type = "t2.micro"

  private_ip = "10.0.0.12"
  subnet_id  = "${aws_subnet.tf_test_subnet.id}"
}

resource "aws_eip" "bar" {
  vpc = true

  instance                  = "${aws_instance.foo.id}"
  associate_with_private_ip = "10.0.0.12"
  depends_on                = ["aws_internet_gateway.gw"]
}