EC2 インスタンスで DNS が壊れている場合でも、このマシンが EC2 インスタンスであるかどうかを 100% の確率で教えてくれる Ruby 関数が必要です。
使用していた関数は次のとおりです。
def is_ec2?
require 'socket'
Socket::gethostbyname('instance-data.ec2.internal.')
true
rescue
false
end
ただし、DNS が壊れたとき、すべての EC2 マシンはそれが EC2 マシンではないと考え、実稼働マシンが独自の SSL 証明書を削除してローカルの開発ボックスの証明書に置き換えるなど、悪いことが起こりました..
Python では、以下を使用しています。
@memoized
def is_ec2():
# This is a 99% check to avoid the need to wait for the timeout.
# Our VM's have this file. Our dev VM's don't.
if not os.path.isfile('/sys/hypervisor/uuid'):
return False
try:
result = boto.utils.get_instance_metadata()
if result == {}:
return False
return True
except Exception:
return False
wget -q -O - http://169.254.169.254/latest/meta-data
の代わりに使用することを除いてboto.utils.get_instance_metadata()
、それは機能しますか?