【问题标题】:Updating Route 53 automatically when Auto Scaling brings up new instanceAuto Scaling 启动新实例时自动更新 Route 53
【发布时间】: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 地址。

标签: amazon-web-services amazon-ec2 aws-lambda amazon-route53 autoscaling


【解决方案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 提供的实例,您可以开发一个脚本来命名新主机。 即:

  1. 使用 ASG 将“角色”标签应用于 ASG 配置的每个实例,即 role=webserver
  2. 在 userdata 脚本中列出所有带有标签 role=webserver 的实例
  3. 检查返回的 TAG“节点”实例
  4. 如果没有,则此实例为 node1 -> 主机名 webserver-node1.${DOMAIN_NAME}
  5. 如果有,请解析 TAG“节点”以检查哪个实例被 ASG 替换。即结果你可以有节点=节点1,节点=节点3,节点=节点4。缺少 node2,所以这个实例是 node2 -> 主机名 webserver-node2.${DOMAIN_NAME}
  6. 在用户数据的末尾,您必须将“节点”标签添加到此实例,因此下一个不会被命名为现有的。

【讨论】:

  • 您好 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= 部分吗?
猜你喜欢
  • 2015-10-08
  • 2018-02-05
  • 2021-07-16
  • 1970-01-01
  • 2018-05-27
  • 2012-12-16
  • 2021-02-09
  • 2017-04-20
  • 2017-12-22
相关资源
最近更新 更多