自动缩放,弹性 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的主要内容,如果未能解决你的问题,请参考以下文章
具有弹性 beanstalk 自动缩放的共享 node.js 全局变量