我有一个项目,每次使用当前实例的公共 DNS 地址启动 EC2 实例时,我都需要更新配置文件。我将为此使用 Perl 或 Sed,所以这不是真正的问题,但真正的问题是:有没有办法可以确定实例的公共 DNS 地址?是否有我可以从实例访问的 EC2 api 来确定它?
答案1
有。从实例内部,您可以运行:
curl http://169.254.169.254/latest/meta-data/public-ipv4
要获取公共 DNS 主机名,您可以将其更改为:
curl http://169.254.169.254/latest/meta-data/public-hostname
您也可以获得实例的私有 IP:
curl http://169.254.169.254/latest/meta-data/local-ipv4
附带说明一下,您可以对照互联网上的非 AWS 网站仔细检查它,例如http://ip4.me
#!/bin/bash
pubip=$( curl http://ip4.me 2>/dev/null | sed -e 's#<[^>]*>##g' | grep '^[0-9]' )
echo $pubip
通常,这可以检查任何 NAT 系统的“公共 IP”,或者查找您的公共代理 IP 等。
这里有一个很好的链接,可以帮助您了解可以从 Amazon API 获取的信息类型: http://www.ducea.com/2009/06/01/howto-update-dns-hostnames-automatically-for-your-amazon-ec2-instances/
答案2
我在 .bashrc 中定义此函数来检索公共 ip 和 dns:
export PUBLIC_DNS=`curl http://169.254.169.254/latest/meta-data/public-hostname 2>/dev/null`
export PUBLIC_IP=`curl http://169.254.169.254/latest/meta-data/public-ipv4 2>/dev/null`
function get-pub() {
if [ $# -ne 1 ]; then
echo "Invalid number of arguments"
return 1
else
case $1 in
dns)
echo $PUBLIC_DNS
;;
ip)
echo $PUBLIC_IP
;;
*)
echo $"Usage: get-pub {dns|ip}"
return 2
esac;
fi
return 0
}
答案3
您可以安装和配置AWS CLI( aws configure
) 并使用以下命令:
aws ec2 describe-instances --instance-id i-0xyz --query 'Reservations[].Instances[].PublicDnsName' --output text
答案4
这将通过标签获取 dns 名称。
aws ec2 describe-instances --region us-east-2 --max-items 1 --filters "Name=tag:Name,Values=MyNameTag" --query 'Reservations[].Instances[].PublicDnsName' --output text