Auto Scaling 启动新实例时自动更新 Route 53
Posted
技术标签:
【中文标题】Auto Scaling 启动新实例时自动更新 Route 53【英文标题】:Updating Route 53 automatically when Auto Scaling brings up new instance 【发布时间】:2020-01-08 06:18:33 【问题描述】:我在我的环境中使用 Amazon EC2 Auto Scaling,每当 Auto Scaling 触发一个新实例时,我需要在 Route 53 中手动更改 IP。我想自动化这个过程。
尝试使用Lifecycle Hooks,但没有看到 Route 53 的任何更新。
【问题讨论】:
您的 Auto Scaling 组中有多少个实例?如果 Auto Scaling 仅提供一个实例,则更新 IP 地址是有意义的,但如果您使用多个实例,请告诉我们您将如何管理 IP 地址。 【参考方案1】:您可以使用此用户数据脚本在启动实例时更新 Route 53 记录。
它从实例元数据中收集所需信息。
#!
INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
PRIVATE_IP=$(curl http://169.254.169.254/latest/meta-data/local-ipv4)
DOMAIN_NAME=$(aws route53 get-hosted-zone --id "$HOSTED_ZONE_ID" --query 'HostedZone.Name' --output text | sed 's/.$//')
hostnamectl set-hostname hostname."$DOMAIN_NAME"
aws route53 change-resource-record-sets --hosted-zone-id "$HOSTED_ZONE_ID" --change-batch '"Changes": ["Action": "UPSERT","ResourceRecordSet": "Name": "'"$(hostname)"'","Type": "A","TTL": 60,"ResourceRecords": ["Value": "'"$PRIVATE_IP"'"]]'
您需要为$HOSTED_ZONE_ID
插入一个值来标识要更新的记录。
编辑:
如果您有多个由 ASG 提供的实例,您可以开发一个脚本来命名新主机。 即:
-
使用 ASG 将“角色”标签应用于 ASG 配置的每个实例,即 role=webserver
在 userdata 脚本中列出所有带有标签 role=webserver 的实例
检查返回的 TAG“节点”实例
如果没有,则此实例为 node1 -> 主机名 webserver-node1.$DOMAIN_NAME
如果有,请解析 TAG“节点”以检查哪个实例被 ASG 替换。即结果你可以有节点=节点1,节点=节点3,节点=节点4。缺少 node2,所以这个实例是 node2 -> 主机名 webserver-node2.$DOMAIN_NAME
在用户数据的末尾,您必须将“节点”标签添加到此实例,因此下一个不会被命名为现有的。
【讨论】:
您好 Tomasz,感谢您的回复。我正在使用自动缩放组,我如何将它用于正在启动的新实例。这个脚本对这种情况有用吗? @John 这很有用,但在我的情况下,我在差异可用区 2a 和 2b 中有 2 台服务器连接到我的 Autoscaling 组。如果我将其添加为 ASG 中的用户数据。我只能提供一个主机名。 你必须实现主机命名脚本。【参考方案2】:# !/bin/bash
INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
PRIVATE_IP=$(curl http://169.254.169.254/latest/meta-data/local-ipv4)
DOMAIN_NAME=$(aws route53 get-hosted-zone --id "<Hosted Zone ID >" --query 'HostedZone.Name' --output text | sed 's/.$//')
hostnamectl set-hostname hostname."$DOMAIN_NAME"
CN=`echo $PRIVATE_IP | cut -d . -f 3`
echo $CN
a=5
if [ $CN == $a ]
then
aws route53 change-resource-record-sets --hosted-zone-id "<Hosted Zone ID >" --change-batch '"Changes": ["Action": "UPSERT","ResourceRecordSet": "Name": "'"Dns Name"'","Type": "A","TTL": 60,"ResourceRecords": ["Value": "'"$PRIVATE_IP"'"]]'
else
aws route53 change-resource-record-sets --hosted-zone-id "<Hosted Zone ID >" --change-batch '"Changes": ["Action": "UPSERT","ResourceRecordSet": "Name": "'"< Dns Name>"'","Type": "A","TTL": 60,"ResourceRecords": ["Value": "'"$PRIVATE_IP"'"]]'
fi
【讨论】:
谢谢大家,我已经发布了最终解决方案。 你能解释一下 CN= 部分吗?以上是关于Auto Scaling 启动新实例时自动更新 Route 53的主要内容,如果未能解决你的问题,请参考以下文章
如何转换 Amazon EC2 实例以用于 Auto Scaling?
如何在 Amazon Auto-scaling 组中的多个 ec2 实例上部署和更新应用程序?