【问题标题】:Static IP for Auto Scale in AWSAWS 中自动扩展的静态 IP
【发布时间】:2016-02-14 02:18:48
【问题描述】:

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

【问题讨论】:

  • 辅助方法:使用 Chef 搜索功能查找具有特定角色的节点,并根据找到的节点的 IP 属性构建您的邮件服务器白名单。
  • 您对公共 IP 还是私有 IP 感兴趣?使用私有规则更容易实现这一点,但使用 AWS Config 规则,您也可以很容易地使用公共规则来实现。

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


【解决方案1】:

很遗憾,您无法访问自动扩缩组的任何自定义 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 的自动调节事件 - 但这会带来更多开销。

不幸的是,这个问题没有很好的解决方案。最简单的方法是将该区域的所有 Amazon IP 列入白名单,但您仍然会遇到潜在的安全问题。

编辑: 您也可以只创建一个代理实例。您可以将 ASG 中的所有实例配置为通过代理实例引导流量。然后你可以给代理实例一个弹性 IP 并允许它进入你的防火墙。

唯一的潜在问题是您的代理服务器过载。您需要确保用于它的实例类型可以处理 ASG 中允许的最大实例数。

【讨论】:

    【解决方案2】:

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

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

    不过,请先检查成本:NAT 网关的固定成本约为 2 美元/天 + 每 GB 流量的小成本。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        我们通过使用云结构分配静态 IP 来实现这一点,并且 IP 是从 VPC 子网中提取的。

        【讨论】:

          【解决方案5】:

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

          这是 Terraform 中的脚本,为此:

          将 EIP 附加到具有预分配私有 IP 的实例(仅限 VPC):

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

          【讨论】:

            猜你喜欢
            • 2016-10-29
            • 2018-03-06
            • 2020-08-23
            • 2018-08-20
            • 2015-06-04
            • 2015-03-10
            • 1970-01-01
            • 2013-02-06
            • 1970-01-01
            相关资源
            最近更新 更多