linux - 用于 DNS 的 EC2-Describe-Instances

标签 linux bash perl amazon-web-services amazon-ec2

几个月前,我在网上找到了一个脚本,我对其进行了更改,并提出了以下解决方案。 它使用 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 = 美国广播公司 DEF GHI JKL

输出= 美国广播公司 DEF 国华健 JKL

返回= 国华健

EC2 描述实例示例

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 地址与上次运行相比发生变化的行。

最佳答案

听起来您的实际目标是为新启动的 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, type: InstanceType, launched: LaunchTime}'

根据您的需要修改:

aws ec2 describe-instances --query 'Reservations[].Instances[?LaunchTime>=`2015-03-01`][].{id: InstanceId, ip: PrivateIpAddress}' --output text

让实例自行更新

换一种方式思考,为什么不让实例自己更新 Amazon Route 53?使用调用 AWS CLI 的启动脚本(通过用户数据)直接更新 Route 53!

实例可以通过 instance metadata 检索它们的 IP 地址:

curl http://169.254.169.254/latest/meta-data/public-ipv4/public/

然后调用aws route53 change-resource-record-sets更新记录。

关于linux - 用于 DNS 的 EC2-Describe-Instances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31582119/

相关文章:

c++ - 在 Linux 中检测与命名管道的断开连接

c - 将 wordexp 的输出提供给 getopt_long 会使我的 linux cli 应用程序崩溃

linux - 从另一个 shell 脚本执行 shell 脚本并传递关键字作为参数

sql - 如何在 Perl 的 DBI 中为可变 SQL 函数使用占位符?

javascript - 如何使用 extjs 调用服务器端脚本并让用户下载文本响应?

perl - 自动纠正 Lingua::LinkParser 包含 lib 路径

linux - bash命令行中用双引号括起来的字符串cmd

python - 如何在 python 中获得单调持续时间?

python - 如何将Azure应用服务Python版本从3.9.7更改为3.9.12?

bash - expr 显示表达式而不是求解它