自动缩放,弹性 IP

Posted

技术标签:

【中文标题】自动缩放,弹性 IP【英文标题】:Auto Scaling, Elastic IP 【发布时间】:2019-01-05 11:35:15 【问题描述】:

当我将网络负载均衡器与 Auto Scaling 结合使用时,每次生成实例时,它都会获得一个新的公共 IP。 我想为每个实例都有一个 EIP。我希望当我在网络负载均衡器配置中将 EIP 分配给可用区时,可以做到这一点。 有没有办法为生成的实例设置自动缩放和静态 IP?

https://aws.amazon.com/blogs/aws/new-network-load-balancer-effortless-scaling-to-millions-of-requests-per-second/

据此看来这是不可能的:

很遗憾,无法自动进行自动缩放 为新启动的实例分配弹性 IP 地址

Static IP for Auto Scale in AWS

根据这个:

Assigning static IPs to auto scaled EC2 instance

【问题讨论】:

所以您希望您的所有实例都具有与负载均衡器相同的弹性 IP?或者您希望 AWS 以某种方式神奇地知道您想从每个实例的弹性 IP 池中提取只是因为您为负载均衡器分配了一个弹性 IP?我对您在这里尝试做的事情感到困惑。如果实例位于负载均衡器后面,为什么还要关心各个实例的 IP 地址是什么? 您没有连接到自动扩展组中的实例。重新思考为什么需要他们的 EIP 地址。如果您需要更改实例上的某些内容,请修改您的测试实例,创建一个新的 AMI 并重新部署您的自动扩展组。 ASG 可以随时终止实例,即使您已连接到该实例。此外,您不希望负载均衡器后面的实例具有公共 IP 地址。否则,不良行为者只会绕过您的负载均衡器进行攻击。 谢谢。这些实例需要有一个 EIP,因为它们连接到第三方软件并且它们需要被列入白名单。如果 IP 发生明显变化,则不会出现白名单。我的问题看起来像是我链接的 SO 问题的副本。 @JohnHanley 关于您对负载均衡器后面实例的公共 IP 的评论:实例上的 SG 只允许来自 LB 的流量可以解决这个问题吗? 是的,SG 可以控制进入 EC2 实例的流量。另一种选择是将您的实例放在私有子网中,然后将 NAT 网关的 EIP 地址列入白名单。 【参考方案1】:

编写一个脚本并将其放在自动缩放组的启动配置中的启动脚本中,该脚本可以做任何您想做的事情,范围从分配新的 EIP 到检查其他服务的白/黑名单。 欲了解更多信息,请阅读 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html

【讨论】:

【参考方案2】:

正如其他人所提到的,这可以通过配置新的EIP 并使用UserData 将实例与新发布的EIP 关联来实现。但是,以下设置会出现以下问题:

1) 默认情况下,每个 VPC 有 5 个 EIP 限制,您甚至可以增加限制,以了解您的 VPC 将使用的最大 EIP 数量

2) 当实例被终止时,您需要创建一个进程来删除过期的 EIP 或弄清楚如何重新关联之前分配的 EIP

话虽如此,我确实在我的 ASG 中使用了静态 EIP,但它仅用于 HA 而不是可扩展性,因此在以下示例中,我每次启动新实例时都会重复使用现有的 EIP

            #!/bin/bash -xe
            INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
            aws ec2 disassociate-address --association-id $OpenPVNEIP.AllocationId --region $AWS::Region || true
            aws ec2 associate-address --instance-id "$!INSTANCE_ID" --allocation-id $OpenPVNEIP.AllocationId --region $AWS::Region

【讨论】:

【参考方案3】:

我在私有子网中创建了一个 Lambda。 我将私有子网链接到 NAT 网关,因此我设法为我的 Lambda 获取静态 IP。 5 个 EIP 的限制对我来说是个问题。

https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/

【讨论】:

【参考方案4】:

使用 EC2 和自动扩展,您需要在 EC2 中使用 user data 将弹性 IP 自动附加到 EC2 实例以进行自动扩展

#!/bin/bash
aws configure set aws_access_key_id "XYZ..."
aws configure set aws_secret_access_key "ABC..."
aws configure set region "ap-..."
aws ec2 associate-address --instance-id "$(curl -X GET "http://169.254.169.254/latest/meta-data/instance-id")" --public-ip your_elastic_IP

注意:您应该创建新用户,并且 IAM 只有权限关联地址才能创建/获取 aws 密钥

希望对你有帮助:)

【讨论】:

以上是关于自动缩放,弹性 IP的主要内容,如果未能解决你的问题,请参考以下文章

AWS 中的弹性 IP 和自动扩展

如何在自动缩放的弹性 beantalk 实例中更新文件

弹性豆茎自动缩放期间的问题

具有弹性 beanstalk 自动缩放的共享 node.js 全局变量

AWS cloudwatch 自定义指标作为弹性 beantalk 自动缩放触发器

如何在具有相同弹性 IP 的新添加节点上平衡容器?