【问题标题】:Use one AWS Elastic IP for several instances对多个实例使用一个 AWS 弹性 IP
【发布时间】:2020-05-15 01:57:38
【问题描述】:

我需要为我的客户提供在 EC2 实例停止/启动时不会更改的固定 URL,因为有时我们需要更改 EC2 的大小,而当我们重新启动实例时,公共 IP 已更改。

我曾考虑使用弹性 IP,以便在实例重新启动时保持相同的公共 IP,但我看到亚马逊告诉您只有 5 个弹性 IP。如果你问他们,他们说他们可以给你更多,但我猜他们不会给你 10.000 个。

如何使用单个公共弹性 IP 为每个用户提供不同的 URL 以进行服务?

应该是这样的,11.22.33.44 弹性 IP 和 192.168.0.X two EC2 instances

11.22.33.44:**1000** --> 192.168.0.**1**:22
11.22.33.44:**1001** --> 192.168.0.**1**:80
11.22.33.44:**1002** --> 192.168.0.**1**:443

11.22.33.44:**1003** --> 192.168.0.**2**:22
11.22.33.44:**1004** --> 192.168.0.**2**:80
11.22.33.44:**1005** --> 192.168.0.**2**:443

我需要让它以编程方式工作,因为我正在根据需要从 SDK 创建 EC2 实例。

我认为的另一种方法是使用 .com 域中的子域,这些子域指向每个 EC2 实例的当前公共 IP,但使用我之前描述的 IP 听起来更好。

【问题讨论】:

  • 如果您对它们有合法需求,它们会为您提供 10,000 个弹性 IP,但这并不是真正的场景之一。您需要一个负载均衡器 (ELB) 和一些 DNS 记录,如 client1.example.comclient2.example.com 等。
  • DNS 解决方案是唯一可行的方法。您将无法获得那么多静态 IP 地址,如果您想稍后在这些实例前面放置负载均衡器或 API 网关或 CDN 或其他东西,DNS 也更具未来性。
  • @ceejayoz 负载均衡器是做什么用的?如果我已经将每条 DNS 记录指向一个公共 IP,我就不需要更多了,对吧?
  • @LuisMiguelGarcíaMancebo 一个 IP 用于多个实例意味着一个负载均衡器。如果您只希望单个实例与每条 DNS 记录关联,则可以放弃 LB。
  • 旁注:为每个客户提供单独的 Amazon EC2 实例有利于分离,但不利于扩展和成本效率。可能值得研究如何实施多租户,以便可以在多个客户之间共享 EC2 容量。它还将大大降低您的成本。

标签: amazon-web-services amazon-ec2 elastic-ip


【解决方案1】:

问题是实例在停止和启动后接收新的(临时)公共 IP 地址。

处理此问题的一种简单方法是将脚本添加到每次启动期间运行的每个实例。此脚本可以更新 DNS 记录以将其指向实例。

脚本应该进入/var/lib/cloud/scripts/per-boot目录,这将导致Cloud-Init在每次启动实例时自动运行脚本。

# Set these values based on your Route 53 Record Sets
ZONE_ID=Z3NAOAOAABC1XY
RECORD_SET=my-domain.com

# Extract information about the Instance
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id/)
AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/)
MY_IP=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4/)

# Extract Name tag associated with instance
NAME_TAG=$(aws ec2 describe-tags --region ${AZ::-1} --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags[?Key==`Name`].Value' --output text)

# Update Route 53 Record Set based on the Name tag to the current Public IP address of the Instance
aws route53 change-resource-record-sets --hosted-zone-id $ZONE_ID --change-batch '{"Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"'$NAME_TAG.$RECORD_SET'","Type":"A","TTL":300,"ResourceRecords":[{"Value":"'$MY_IP'"}]}}]}'

该脚本将提取实例的 Name 标签并更新 Route 53 中的相应记录集。(请随意更改此设置以使用不同的标签。)该实例还需要 ec2 describe-tags 的 IAM 权限和route53 change-resource-record-sets.

更新:我已经把这个答案变成了一篇博文:Amazon Route 53: How to automatically update IP addresses without using Elastic IPs

【讨论】:

  • 谢谢@John,这似乎是一个好方法。当我自己创建实例时,我可以知道 IP 并在 Route 53 中对其进行更新,但我必须考虑是否最好让实例按照您的建议自行执行。
  • 可以,在创建实例的时候可以这样做,但是如果实例停止和启动,上述方法也会将DNS Name更新为新的公共IP地址。
猜你喜欢
  • 2019-07-11
  • 2015-11-21
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 2021-04-13
  • 2016-05-16
  • 2018-08-06
  • 2021-08-10
相关资源
最近更新 更多