Linux

嘗試使用腳本更新 Amazon Route53,但未更新域

  • February 14, 2011

我有幾個執行 Ubuntu 10.04 的 Amazon EC2 實例,我想使用 Amazon 的 Route53。我按照 Shlomo Swidler 的文章中的描述設置了一個腳本,但我仍然缺少一些東西。

當腳本執行時,它不會返回任何輸出,我最初認為這意味著它執行正確。但是,當我使用MyR53DNS檢查 DNS 記錄時,我的實例沒有條目。這是我的腳本:

#!/bin/tcsh -f

set root=`dirname $0`
setenv EC2_HOME /usr/lib/ec2-api-tools
setenv EC2_CERT /etc/cron.route53/ec2_x509_cert.pem
setenv EC2_PRIVATE_KEY /etc/cron.route53/ec2_x509_private.pem
setenv AWS_ACCESS_KEY_ID myaccesskeyid
setenv AWS_SECRET_ACCESS_KEY myaccesskey

/usr/bin/ec2-describe-instances | \
perl -ne '/^INSTANCE\s+(i-\S+).*?(\S+\.amazonaws\.com)/ \
and do { $dns = $2; print "$1 $dns\n" }; /^TAG.+\sShortName\s+(\S+)/ \
and print "$1 $dns\n"' | \
perl -ane 'print "$F[0] CNAME $F[1] --replace\n"' | \
xargs -n 4 /etc/cron.route53/cli53/cli53.py \
rrcreate -x 60 mydomain.com

有人看到這個腳本有問題嗎?如果不是腳本,還有什麼可能阻止我的 Route53 域被更新?

我正在使用安全組對實例進行 IP 限制。我已經嘗試打開埠 53,但這似乎沒有效果。Route53 是否使用了另一個埠?

我很感激 Unix 和 Linux 社區可以提供的任何幫助或指導。如果您需要任何進一步的資訊,請告訴我。


這是執行的結果: tcsh -f -x /etc/cron.route53/aws-route53.sh

set root=`dirname $0`
dirname /etc/cron.route53/aws-route53.sh
setenv EC2_HOME /usr/lib/ec2-api-tools
setenv EC2_CERT /etc/cron.route53/ec2_x509_cert.pem
setenv EC2_PRIVATE_KEY /etc/cron.route53/ec2_x509_private.pem
setenv AWS_ACCESS_KEY_ID myaccesskeyid
setenv AWS_SECRET_ACCESS_KEY myaccesskey

無論最後 7 行是註釋還是未註釋,我都會收到相同的輸出。


> cat -A  /etc/cron.route53/aws-route53.sh
#!/bin/tcsh -f$
$
set root=`dirname $0`$
setenv EC2_HOME /usr/lib/ec2-api-tools$
setenv EC2_CERT /etc/cron.route53/ec2_x509_cert.pem$
setenv EC2_PRIVATE_KEY /etc/cron.route53/ec2_x509_private.pem$
setenv AWS_ACCESS_KEY_ID myaccesskeyid$
setenv AWS_SECRET_ACCESS_KEY myaccesskey$
$
/usr/bin/ec2-describe-instances | \$
perl -ne '/^INSTANCE\s+(i-\S+).*?(\S+\.amazonaws\.com)/ \$
and do { $dns = $2; print "$1 $dns\n" }; /^TAG.+\sShortName\s+(\S+)/ \$
and print "$1 $dns\n"' | \$
perl -ane 'print "$F[0] CNAME $F[1] --replace\n"' | \$
xargs -n 4 /etc/cron.route53/cli53/cli53.py \$
rrcreate -x 60 mydomain.com

> cat /etc/cron.route53/aws-route53.sh
#!/bin/tcsh -f

set root=`dirname $0`
setenv EC2_HOME /usr/lib/ec2-api-tools
setenv EC2_CERT /etc/cron.route53/ec2_x509_cert.pem
setenv EC2_PRIVATE_KEY /etc/cron.route53/ec2_x509_private.pem
setenv AWS_ACCESS_KEY_ID myaccesskeyid
setenv AWS_SECRET_ACCESS_KEY myaccesskey

/usr/bin/ec2-describe-instances | \
perl -ne '/^INSTANCE\s+(i-\S+).*?(\S+\.amazonaws\.com)/ \
and do { $dns = $2; print "$1 $dns\n" }; /^TAG.+\sShortName\s+(\S+)/ \
and print "$1 $dns\n"' | \
perl -ane 'print "$F[0] CNAME $F[1] --replace\n"' | \
xargs -n 4 /etc/cron.route53/cli53/cli53.py \
rrcreate -x 60 mydomain.com

啊哈!您的腳本末尾缺少換行符。Unix 文本文件(如腳本)是行序列,每一行(甚至最後一行)都必須以換行符結束。

大多數現代 unix 工具可以處理格式錯誤的文本文件,但 tcsh 不算現代:它看起來忽略了最後一個未終止的邏輯行(最後一個換行符之後沒有反斜杠的所有內容)。

一個好的編輯器(例如 Emacs 或 Vi(m))會自動確保 csh 腳本以換行符終止。¹看起來您的編輯器沒有做正確的事情,因此請確保您的腳本確實以換行符結尾(cat /path/to/script必須在下一個提示上方顯示最後一個腳本行,而不是在它旁邊)。

¹在一個非常好的編輯器中,比如 Emacs,這不適用於其他類型的文件,這些文件可能合法地不是換行符終止的。

引用自:https://unix.stackexchange.com/questions/7393