从EC2实例中查找区域
有没有办法从实例中查找实例的区域?
我正在寻找类似于find实例ID的方法。
该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 -e 's:\([0-9][0-9]*\)[az]*\$:\\1:'`"
希望这可以帮助。
还有一个方法可以达到这个目的:
REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}'` echo $REGION us-east-1
你可以使用ec2-metadata:
ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
如果你可以使用jq
,你可以运行以下命令:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r
我想这是最干净的方法。
非常简单的一个class轮
export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone` export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}
ec2-metadata --availability-zone | sed 's/.$//'
如果你想避免正则expression式,下面是你可以用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']"
迄今为止我发现的最简单
curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
如果您可以使用AWS Java SDK,现在有一种方法可以返回当前的区域名称(例如“us-east-1”,“eu-west-1”):
或者不要使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:]])}"}
这是我发现的最干净的解决scheme:
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或工具。
- 不会尝试parsing可用区域名称,所以不用担心AWS更改AZ /区域名称格式
从可用区域获取区域,去掉它的最后一个字母。
ec2-metadata -z | awk '{print $2}' | sed 's/[az]$//'
要查找有关您login的EC2的信息,可以使用ec2-metadata工具。
您可以通过以下链接安装该工具。 安装该工具后,您可以运行
# ec2-metadata -z
找出该地区。
这个工具安装了最新的(10.10)Ubuntu AMI,
感谢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继续使用单个字符作为附加到区域的可用区域。
使用JQ:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
2内胆,只要您使用ec2.internal作为您的search域:
az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone) region=${az:0:${#az} - 1}
这适用于欧盟中心1以及各种字母区域。 (我没有足够的代表来回答上面的sed答案)
ec2metadata –availability-zone | sed's / [az] $ //'
如果你使用json – 使用正确的工具。 jq在这种情况下非常强大。
# curl -s curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region' eu-west-1
如果你正在寻找使用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