从EC2实例中查找区域

时间:2010-11-22 19:38:04

标签: amazon-ec2 amazon-web-services

有没有办法从实例中查找实例的区域?

我正在寻找类似于finding the instance id的方法。

28 个答案:

答案 0 :(得分:124)

该网址(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

答案 1 :(得分:72)

还有一种方法可以实现这一目标:

REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}'`

echo $REGION

us-east-1

答案 2 :(得分:31)

如果您使用jq即可,则可以运行以下命令:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r

我猜这是最干净的方式。

答案 3 :(得分:25)

ec2-metadata --availability-zone | sed 's/.$//'

答案 4 :(得分:18)

您可以使用ec2-metadata:

ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"

答案 5 :(得分:15)

如果你想避免正则表达式,这里有一个你可以用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']"

答案 6 :(得分:14)

到目前为止我找到的最简单

any(names(capabilities())  == "aqua" & capabilities() == TRUE)

答案 7 :(得分:13)

非常简单的一个班轮

export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone`
export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}

答案 8 :(得分:6)

从可用区获取该区域,剥去它的最后一个字母。

ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//'

答案 9 :(得分:6)

如果已安装 jq ,则还可以通过以下方式进行处理(可能是最“优美”的方法):

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region

这只是返回“区域”的原始值,而没有任何漂亮的印刷或其他格式。 参考:AWS Forum

答案 10 :(得分:5)

使用JQ:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region

答案 11 :(得分:4)

如果您能够使用AWS Java SDK,现在有一种方法可以返回当前的区域名称(例如" us-east-1"," eu -West-1&#34):

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

答案 12 :(得分:4)

这是我发现的最干净的解决方案:

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 /地区名称格式,则无需担心

答案 13 :(得分:4)

在某些时候,由于大多数答案已经发布,AWS做了合理的事情并实现了新路径:latest/meta-data/placement/region

这意味着获取区域应该尽可能简单

REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"

编辑:还可能值得一提的是,此端点在元数据API的2019-10-01版本中可用。选中http://169.254.169.254/,以确保实例支持该版本或更高版本。

答案 14 :(得分:3)

对于任何想要使用优质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

答案 15 :(得分:3)

只要您使用ec2.internal作为搜索域,就可以使用2个衬垫:

az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}

答案 16 :(得分:3)

如果您使用json - 请使用正确的工具。 jq在这种情况下非常强大。

# curl -s curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region'
eu-west-1

答案 17 :(得分:3)

感谢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继续对附加到该区域的可用区域使用单个字符。

答案 18 :(得分:3)

或者不要将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:]])}"}

答案 19 :(得分:2)

这适用于eu-central-1以及各种字母区域。 (我没有足够的代表回复上面的sed答案)

ec2-metadata --availability-zone | sed 's/[a-z]$//'

答案 20 :(得分:1)

还在寻找一种从实例中查找区域的解决方案,这是我的纯Bash解决方案:

az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az:0:${#az}-1}

除非在某些地区AZ具有两个以上的字母,但我不知道。

答案 21 :(得分:0)

如果您希望使用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

答案 22 :(得分:0)

如果您在Windows上运行,则可以使用以下Powershell一线式:

$region=(Invoke-RestMethod "http://169.254.169.254/latest/dynamic/instance-identity/document").region

答案 23 :(得分:0)

ec2metadata(无破折号)是当前命令,可为您提供有关ec2盒的所有aws托管信息。这是最优雅,最安全的方法。 (ec2-metadata是旧的,不再有效的命令。)

答案 24 :(得分:0)

仅使用egrep的方法,该方法可以在大多数Linux实例上运行,而无需安装任何额外的工具。我针对所有当前AWS区域的列表进行了测试,它们都匹配。

curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]'

对REGEX的解释:

  • “(\ w)+”可以匹配任意数量的字母
  • “-”仅匹配一个破折号
  • “ [0-9]”匹配任意1个数字

如果要将其转换为变量,请执行以下操作:

region=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]')

答案 25 :(得分:0)

对于sed和curl解决方案,格式似乎有所改变。 为我工作

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | sed -n 's/ "region" : "\(.*\)"[,]/\1/p'

答案 26 :(得分:0)

要查找有关您登录的EC2的信息,您可以使用 ec2元数据工具。

您可以按照this link.安装该工具 安装该工具后,您可以运行

# ec2-metadata -z

找出该地区。

此工具随最新的(10.10)Ubuntu AMI一起安装,

答案 27 :(得分:-1)

您可能会使用此curl请求获取实例区域

$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1