从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”):

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/regions/Regions.html#getCurrentRegion();

或者不要使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