多个实例使用一个 AWS 弹性 IP

Use one AWS Elastic IP for several instances

我需要为我的客户提供在 EC2 实例为 stopped/started 时不会更改的固定 URL,因为有时我们需要更改 EC2 的大小并且当我们重新启动实例时 public IP 已更改。

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

如何使用单个 public 弹性 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 实例的当前 public IP,但使用我之前描述的 IP 听起来更好。

问题是实例在停止和启动后接收新的(临时)Public 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 中相应的记录集。(请随意更改它以使用不同的标签。)该实例还将需要 IAM 权限以用于ec2 describe-tagsroute53 change-resource-record-sets.

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