几个月前我在网上发现了一个脚本,我改变并提出了下面的解决方案。 它使用EC2-Describe-Instances并使用Perl来收集实例名称,IP地址并更新Route53。
它有效,但它有点无效,我更多的是.Net程序员,我有点超出我的深度,所以希望有人可以帮助或指出我正确的方向。
我在想的是我希望它保存上次运行时的EC2-Describe-Instances副本,然后获得一份新的副本。比较差异,然后仅对已更改IP的实例运行Route53更新。任何想法?
#!/bin/bash
set root='dirname $0'
ec2-describe-instances -O ###### -W ##### --region eu-west-1 |
perl -ne '/^INSTANCE\s+(i-\S+).*?(\S+\.amazonaws\.com)/
and do { $dns = $2; print "$1 $dns\n" }; /^TAG.+\sName\s+(\S+)/
and print "$1 $dns\n"' |
perl -ane 'print "$F[0] CNAME $F[1] --replace\n"' |
grep -v '^i-' |
xargs --verbose -n 4 -I myvar /bin/sh -c '{ /usr/local/bin/cli53 rrcreate -x 300 contoso.com 'myvar'; sleep 1; printf "\n\n"; }'
- 编辑 -
基本上我需要的是一种方法来比较保存的文件和EC2-Describe-Instances的输出,然后只返回包含差异的行以反馈到其余的代码中。
类似的东西:
ChangedLines(File.txt," ec2-describe-instances -O ###### -W ##### --region eu-west-1")| perl的......
如果 文件1 = ABC DEF GHI JKL
输出= ABC DEF GHJ JKL
返回= GHJ
EC2-Descibe-Instances示例
PROMPT> ec2-describe-instances
RESERVATION r-1a2b3c4d 111122223333 my-security-group
INSTANCE i-1a2b3c4d ami-1a2b3c4d ec2-203-0-113-25.compute-1.amazonaws.com ip-10-251-50-12.ec2.internal running my-key-pair 0 t1.micro YYYY-MM-DDTHH:MM:SS+0000 us-west-2a aki-1a2b3c4d monitoring-disabled 184.73.10.99 10.254.170.223 ebs paravirtual xen ABCDE1234567890123 sg-1a2b3c4d default false
BLOCKDEVICE /dev/sda1 vol-1a2b3c4d YYYY-MM-DDTHH:MM:SS.SSSZ true
RESERVATION r-2a2b3c4d 111122223333 another-security-group
INSTANCE i-2a2b3c4d ami-2a2b3c4d ec2-203-0-113-25.compute-1.amazonaws.com ip-10-251-50-12.ec2.internal running my-key-pair 0 t1.micro YYYY-MM-DDTHH:MM:SS+0000 us-west-2c windows monitoring-disabled 50.112.203.9 10.244.168.218 ebs hvm xen ABCDE1234567890123 sg-2a2b3c4d default false
BLOCKDEVICE /dev/sda1 vol-2a2b3c4d YYYY-MM-DDTHH:MM:SS.SSSZ true
我需要捕获IP地址与上一次运行相比发生变化的行。
答案 0 :(得分:1)
听起来您的实际目标是为新启动的Amazon EC2实例更新Amazon Route 53。你可以采取一些不同的方法。
使用AWS Command-Line Interface (CLI)列出最近发布的实例。我在https://github.com/aws/aws-cli/issues/1209上找到了这个例子:
aws ec2 describe-instances --query 'Reservations[].Instances[?LaunchTime>=`2015-03-01`][].{id: InstanceId, ip: PrivateIpAddress}' --output text
根据您的需求进行了修改:
curl http://169.254.169.254/latest/meta-data/public-ipv4/public/
以不同的方式思考,为什么不让实例自己更新Amazon Route 53?使用调用AWS CLI的启动脚本(通过用户数据)直接更新Route 53!
实例可以通过instance metadata检索其IP地址:
aws route53 change-resource-record-sets
然后致电{{1}}更新记录。