有没有办法从实例中查找实例的区域?
我正在寻找类似于 finding the instance id 的方法的东西。
http://169.254.169.254/latest/meta-data/placement/availability-zone
获取可用区并删除最后一个字符。
http://169.254.169.254/latest/meta-data/placement/region
该 URL (http://169.254.169.254/latest/dynamic/instance-identity/document) 似乎不再起作用。当我尝试使用它时,我得到了 404。我有以下似乎可以工作的代码:
EC2_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed 's/[a-z]$//'`"
还有另一种方法可以实现:
REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}'`
echo $REGION
us-east-1
404 - Not Found
尝试从 us-east-1a
中的机器GET
该 URL。
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | awk -F\" '/region/ {print $4}'
如果您可以使用 jq
,则可以运行以下命令:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r
我想这是最干净的方法。
ec2-metadata --availability-zone | sed 's/.$//'
对于基于 debian 的系统,该命令没有破折号。
ec2metadata --availability-zone | sed 's/.$//'
ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
ec2-metadata
似乎不是默认可用的 - 您能否提供安装说明?
如果你想避免正则表达式,这里有一个你可以用 Python 做的单行:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | python -c "import json,sys; print json.loads(sys.stdin.read())['region']"
在大多数答案已经发布后的某个时间点,AWS 做了合理的事情并实施了一条新路径:latest/meta-data/placement/region
。
这意味着获取区域应该像这样简单
curl http://169.254.169.254/latest/meta-data/placement/region
编辑:还可能值得一提的是,此端点在元数据 API 的 2019-10-01 版本中可用。在使用此版本之前,请通过选中 http://169.254.169.254/
确保您的实例支持该版本或更高版本。
http://169.254.169.254/latest/meta-data/placement
。 region
是否作为列出的选项之一返回?
region
端点之前,有问题的实例在没有重新启动的情况下运行,这就是它不可用的原因 - 作为 documented。
到目前为止我发现的最简单的
curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
您可以使用 ec2 元数据:
ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
eu-central-1
,你就完蛋了。
central
并不存在。现在添加了。
awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'
将仅保留 AZ 名称的前两个组成部分,而不是 grep。
eu-west-1
、eu-west-2
和 eu-west-3
(还有 us-west-1
和 us-west-2
)@OP:仅匹配 '[a-z][a-z]-[a-z]*-[0-9][0-9]*'
似乎更安全(即一个基本的正则表达式,它可以用一个扩展的 RE 来缩短)。 (当前正则表达式将在 ca
区域、af
区域和 me
区域中断)
非常简单的一个班轮
export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone`
export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}
curl: (6) Could not resolve host: instance-data; Name or service not known
错误。
从可用区获取区域,去掉它的最后一个字母。
ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//'
如果您能够使用 AWS Java 开发工具包,现在有一个方法可以返回当前区域名称(例如“us-east-1”、“eu-west-1”):
这是我找到的最干净的解决方案:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p'
例如,
export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p')
不进行 API 调用,使用 EC2 实例元数据
仅使用 curl 和基本 sed,因此不依赖于不太可能安装的 SDK 或工具。
不尝试解析可用区名称,因此无需担心 AWS 更改 AZ/Region 名称格式
感谢 https://unix.stackexchange.com/a/144330/135640,使用 bash 4.2+ 我们可以从可用区中删除最后一个字符:
$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1
这假设 AWS 继续对附加到该区域的可用区使用单个字符。
region=${region%?}
AZ=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
export AWS_DEFAULT_REGION=${AZ::-1}
如果您使用 json - 使用正确的工具。 jq 在这种情况下非常强大。
# curl -s curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region'
eu-west-1
只要您使用 ec2.internal 作为搜索域,2 班轮就可以工作:
az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
对于任何想用好的 ol powershell 来做到这一点的人
$var = (curl http://169.254.169.254/latest/dynamic/instance-identity/document | Select-String-Pattern "Zone" | ConvertFrom-Json | Select-Object -ExpandProperty "region")
echo $var
或者不要让 Ubuntu 或这个工具成为必需品,只需执行以下操作:
: "${EBS_VOLUME_AVAILABILITY_ZONE:=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)}"
: ${EBS_VOLUME_REGION:="${EBS_VOLUME_AVAILABILITY_ZONE%%*([![:digit:]])}"}
这适用于 eu-central-1 以及各种字母区域。 (我没有足够的代表来回复上面的 sed 答案)
ec2-metadata --availability-zone | sed 's/[a-z]$//'
ec2metadata --availability-zone | sed 's/.$//'
(没有破折号)
如果您在 Windows 上运行,则可以使用此 powershell 单线:
$region=(Invoke-RestMethod "http://169.254.169.254/latest/dynamic/instance-identity/document").region
要查找有关您登录的 EC2 的信息,您可以使用 ec2-metadata 工具。
您可以按照this link.安装工具安装工具后,您可以运行
# ec2-metadata -z
找出该地区。
此工具随最新 (10.10) Ubuntu AMI 一起安装,
ec2-metadata -z
仅显示可用区,不显示区域。
如果您希望使用 JS 获取区域,这应该可以:
meta.request("/latest/meta-data/placement/availability-zone",function(err,data){
if(err)
console.log(err);
else{
console.log(data);
str = data.substring(0, data.length - 1);
AWS.config.update({region:str});
ec2 = new AWS.EC2();
}
});
这是从 AWS DOCS 中找到的映射,以响应元数据 API 调用,只需修剪最后一个字符即可。
eu-west-1a :eu-west-1
eu-west-1b :eu-west-1
eu-west-1c :eu-west-1
us-east-1a :us-east-1
us-east-1b :us-east-1
us-east-1c :us-east-1
us-east-1d :us-east-1
ap-northeast-1a :ap-northeast-1
ap-northeast-1b :ap-northeast-1
us-west-1a :us-west-1
us-west-1b :us-west-1
us-west-1c :us-west-1
ap-southeast-1a :ap-southeast-1
ap-southeast-1b :ap-southeast-1
也在寻找从实例中查找区域的解决方案,这是我的纯 Bash 解决方案:
az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az:0:${#az}-1}
除非有些地区 AZ 有两个以上的字母,我不知道。
如果您正在寻找更简单的方法,您可以查看 /etc/resolv.conf 并找到类似“search us-west-2.compute.internal”的行。例如:
$ grep "^search" /etc/resolv.conf | sed "s:.* ::; s:\..*::"
us-west-2
ec2metadata
(无破折号)是为您提供有关您的 ec2 盒子的所有 aws 托管信息的当前命令。这是最优雅和最安全的方法。 (ec2-metadata
是旧的,不再有效的命令。)
一种仅使用 egrep 的方法,它应该适用于大多数启动的 linux 实例,而无需安装任何额外的工具。我针对所有当前 AWS 区域的列表对此进行了测试,它们都匹配。
curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]'
正则表达式的解释:
"(\w)+" 这匹配任意数量的字母
“-”只匹配一个破折号
"[0-9]" 匹配任意 1 个数字
如果您希望将其转换为变量,请执行以下操作:
region=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]')
对于 sed 和 curl 解决方案,格式似乎发生了一些变化。为我工作
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | sed -n 's/ "region" : "\(.*\)"[,]/\1/p'
所有这一切都不再适用于 AMI Linux 2 ......我发现了这种离线(无证)方法:
REGION=`cat /opt/elasticbeanstalk/config/ebenvinfo/region`
echo $REGION
# output example:
us-east-1
如果您使用的是 IMDSv2,则首先需要令牌。
这是一个使用 bash 的示例,它也依赖于 curl:
function get-aws-region() {
imdsv2_token="$(
curl -s -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 1"
)"
curl -s http://169.254.169.254/latest/meta-data/placement/region \
-H "X-aws-ec2-metadata-token: $imdsv2_token"
}
这将获得一个非常短暂的令牌并使用它来获取该区域。
不定期副业成功案例分享
ec2-metadata
只是此 API 的包装器,但本质上是做同样的事情。sed 's/[a-z]$//
echo "${EC2_AVAIL_ZONE: : -1}"
。在 bash 4.2+ 中,您可以删除两个:
之间的空格。