如何基于EC2实例标记名称自动执行AWS Route53 DNS更新?

时间:2016-03-19 17:51:30

标签: amazon-web-services amazon-ec2 amazon-route53

我想实现一种基于实例的EC2标签更新Route53 DNS的自动方式。

想象一下,我可以有一个名为dns_name的标签名称,它应该记录机器的预期dns名称。

如果我关闭机器,升级它并重新启动它,我确实希望更新DNS而不必更改任何内容。

我不想在计算机上安装DNS更新服务,因为这需要我将AWS凭据放在所有VM上,并将其部署到它们。

使用AWS EC2标签声明预期名称似乎要容易得多。 cron作业可以轻松检查更改并更新DNS。

有没有人实现这个?

3 个答案:

答案 0 :(得分:1)

我强烈建议使用Elastic IP' s。这是他们的确切目的。对于此实施,请转到EC2 => Network & Security => Elastic IP => Allocate New Address => Actions => Associate Address => (选择您正在寻找的实例标签名称)

EIP复制到剪贴板,然后转到Route53 => Create Hosted Zone =>去想那些步骤=> Go to Record Sets => Create Record Set =>对于Name:,您可以拥有www.或不是=> Type: A - IPv4 => Alias: NO => TTL:无论你喜欢什么=> Value: 您的EIP地址 => Save Record Set

如果您的实例与弹性IP相关联,则可以重启,交换,停止,更新,更改,变形,无论您想要什么! EIP不会去任何地方。

<强>更新 您可以通过Route53 API自动完成所有这些操作。 这些是执行此操作的步骤,因为您必须知道该过程才能使用API​​调用。

答案 1 :(得分:1)

计算机上的DNS更新服务不需要AWS凭据。您最好使用AWS IAM实例配置文件。我已经使用此方法在服务器启动时运行脚本,以使用最新的IP地址更新Route53记录。

如果要在单个服务器上安排cron,该服务器根据实例标签处理更新所有服务器的Route53记录,那么这当然是可能的。它只是几行代码。

答案 2 :(得分:0)

我正在尝试完全按照我的想法做。

我发现此链接中的脚本是一个很好的起点。

https://medium.com/@dbclin/a-bash-script-to-update-an-existing-aws-security-group-with-my-new-public-ip-address-d0c965d67f28

#!/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'"}]}}]}'