有没有一种方法可以从实例内部查找实例的区域?
我正在寻找类似于查找实例id的方法的东西。
http://169.254.169.254/latest/meta-data/placement/availability-zone
并删除最后一个字符。
有没有一种方法可以从实例内部查找实例的区域?
我正在寻找类似于查找实例id的方法的东西。
http://169.254.169.254/latest/meta-data/placement/availability-zone
并删除最后一个字符。
Answers:
该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]$//'`"
希望这可以帮助。
编辑:sed
根据评论进行了改进
ec2-metadata
只是该API的包装器,但实际上做同样的事情。
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
尝试GET
从中的计算机访问该URL us-east-1a
。
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
我想这是最干净的方法。
如果您想避免使用正则表达式,可以使用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']"
您可以使用ec2-metadata:
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名称的前两个组成部分。
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
区域上中断)
到目前为止我发现的最简单的
curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
很简单的一个班轮
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
错误。
如果安装了jq,也可以通过以下方式进行处理(可能是最“优雅”的方法):
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
这只是返回“区域”的原始值,而无需任何漂亮的印刷或其他格式。参考:AWS论坛
如果您能够使用AWS Java SDK,现在可以使用一种方法来返回当前区域名称(例如“ 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')
感谢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%?}
或者不要将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:]])}"}
如果您希望使用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
仅使用egrep的方法,该方法可以在大多数Linux实例上运行,而无需安装任何额外的工具。我针对所有当前AWS区域的列表进行了测试,它们都匹配。
curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]'
region=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]')
您可能会使用此curl请求获取实例区域
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1