Amazon web services 更新route53记录中的自动缩放组IP

Amazon web services 更新route53记录中的自动缩放组IP,amazon-web-services,shell,aws-cli,amazon-route53,aws-auto-scaling,Amazon Web Services,Shell,Aws Cli,Amazon Route53,Aws Auto Scaling,我们有一个自动缩放组,有n个ec2实例。我们创建了一个route53记录集(multi-wieght),它指向自动缩放组的ip地址。对于每个ec2缩放操作,我都希望查询autoscaling组中正在运行的实例,并使用userdata脚本更新dns 我正在使用aws cli查询自动缩放组中运行的ec2实例: aws自动缩放描述自动缩放实例--区域us-east-1--输出文本--查询“AutoScalingInstances[?AutoScalingGroupName=='myapp-asg'].

我们有一个自动缩放组,有n个ec2实例。我们创建了一个route53记录集(multi-wieght),它指向自动缩放组的ip地址。对于每个ec2缩放操作,我都希望查询autoscaling组中正在运行的实例,并使用userdata脚本更新dns

我正在使用aws cli查询自动缩放组中运行的ec2实例:

aws自动缩放描述自动缩放实例--区域us-east-1--输出文本--查询“AutoScalingInstances[?AutoScalingGroupName=='myapp-asg'].InstanceId”| xargs-n1 aws ec2描述实例--实例ID$ID--区域us-east-1--查询“Reservations[].instances[].PrivateIpAddress”--输出文本
这将以以下格式提供自动缩放组中的所有IP地址:

20.91.0.1
20.91.0.2
20.91.0.3
20.91.0.4
我想使用aws cli更新dns。下面是我正在使用的命令:

aws——region us-east-1 route53更改资源记录集——托管区域id“zone id”--更改批“{”更改“{”操作“:“UPSERT”,“ResourceRecordSet”:“{”名称“:“myrecord.mydomain.com“,”类型“:“A”,“TTL”:60,“Weight”:200,“SetIdentifier”:“myrecord”,“ResourceRecords”:“[{”值“:“20.91.0.1”},{”值“:“20.91.0.2”}]

如何自动执行从第一个命令获取的iPAddress以更新第二个命令中记录集的值

您只需迭代从第一个命令获取的值即可。大致如此


AWS_ROUTE53_ZONEID=“修订版”
TTL=“600”
IPS=$(aws autoscaling描述自动缩放实例--区域us-east-1--输出文本--查询“AutoScalingInstances[?AutoScalingGroupName=='myapp-asg'].InstanceId”| xargs-n1 aws ec2描述实例--实例ID$ID--区域us-east-1--查询“保留[].instances[].PrivateIpAddress”--输出文本)
对于IP,单位为$IPS;
用于主机1主机2主机3中的主机名
做
aws route53更改资源记录集--托管区域id$aws\U route53\U ZONEID--更改批处理“{\”更改“:[{\”操作“:\”上传“,\”资源记录集“:{\”名称“:\”主机名“,”类型“:\”A\”,“TTL\”:$TTL,\'ResourceRecords\”:[{\'值\':\\\\”:“$IP\”}}}”
echo“已将DNS区域更新为$IP”
完成
实际上,我将使用
boto3
库编写一些
python
代码,因为这将为我提供各种错误处理

asg_client=boto3.client('autoscaling')
asg_响应=asg_客户端。描述自动缩放组(自动缩放组名=[“myasg”])
实例_id=[]
对于asg_响应中的i['AutoScalingGroups']:
对于i[‘实例’]中的k:
实例ID.append(k['InstanceId'])
一旦获得实例,您就可以简单地迭代相同的实例来更新dns记录

def更改记录(域、子域、目标ip、操作,ttl=900): “”“更改子域的记录”“” zone\u id=获取托管的\u zone\u id(域) 名称=子域+“+”域 client.change\u资源\u记录\u集合( HostedZoneId=区域id, 变更批次={ “注释”:“%s子域%s(来自区域%s)”%(操作、子域、区域id), “变化”:[ { “行动”:行动, “资源记录集”:{ “姓名”:姓名, “类型”:“A”, “ResourceRecords”:[{“Value”:target_ip}], “TTL”:TTL, }, } ], }, ) 不过,整个过程是静态的,因为
Autoscaling
会根据需求上下浮动实例。好主意是创建
CloudWatch
事件规则并调用lambda。这甚至会删除过时的记录并更新这些记录

{
{
“来源”:[
“自动校准”
],
“详细信息类型”:[
“EC2实例启动成功”,
“EC2实例终止成功”
]
}

谢谢你的回答。在我的例子中,我想更新route53 dns记录的wieghted值,该值包含所有自动缩放组ip地址的ip地址。下面是一个示例:{“Name”:“'myrecord.mydomain.com”,“Type”:“a”,“TTL”:60,“Weight”:200,“SetIdentifier”:“myrecord”,“ResourceRecords”:[{“value”:“20.91.0.1”},{“value”:“20.91.0.2”}]}}基本上我希望一条记录在dns中有多个IP地址“,我希望所有asg ip地址都带有wieghteddns@user14907472您仍然可以使用相同的方法来更改记录,只需更新那里的IP地址即可。如果你想通过shell脚本来做这件事,请考虑通过建立模板,然后在命令行中使用同样的方法,如这里所描述的。因为在壳中建造是一件棘手的事情。