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 实例上部署和更新应用程序?

Auto Scaling Group 启动配置更改

Capistrano 和 Auto-Scaling AWS

在 Auto Scaling AMI 启动中如何在新实例中复制我的私钥文件

AWS Auto Scaling - 带有 2 个固定实例