正如您所指出的,您可以在启动配置中使用用户数据脚本,以便在 Auto Scaling 启动新实例时,该脚本重新附加弹性 IP 地址或更新 Route 53 DNS 名称。
要附加弹性 IP 地址,脚本需要获取其自己的实例 ID,然后运行附加命令:
#!/bin/bash
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id/)
aws ec2 associate-address --allocation-id xxx --instance-id $INSTANCE_ID
或者,您可以有一个与实例关联的 DNS 名称,并在实例启动时更新 DNS 名称以指向该实例。
来自Amazon Route 53:如何在不使用弹性 IP 的情况下自动更新 IP 地址 - 开发社区:
#!/bin/bash
# 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 tags associated with instance
ZONE_TAG=$(aws ec2 describe-tags --region ${AZ::-1} --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags[?Key==`AUTO_DNS_ZONE`].Value' --output text)
NAME_TAG=$(aws ec2 describe-tags --region ${AZ::-1} --filters "Name=resource-id,Values=${INSTANCE_ID}" --query 'Tags[?Key==`AUTO_DNS_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_TAG --change-batch '{"Changes":[{"Action":"UPSERT","ResourceRecordSet":{"Name":"'$NAME_TAG'","Type":"A","TTL":300,"ResourceRecords":[{"Value":"'$MY_IP'"}]}}]}'
没有“优雅”的方式可以为 Auto Scaling 组自动执行此类操作。