从 EC2实例中查找区域

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

我正在寻找类似于 找到实例 ID的方法。

122905 次浏览

要查找登录到的 EC2的相关信息,可以使用 Ec2-元数据工具。

您可以通过以下链接来安装该工具。 安装该工具后,可以运行

# ec2-metadata -z

找出这个地区。

这个工具安装了最新的(10.10) Ubuntu AMI,

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

还有一种方法可以做到这一点:

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


echo $REGION


us-east-1

那个 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]$//'`"

您可以使用 ec2元数据:

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

非常简单的一句话

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

如果您能够使用 AWS Java SDK,现在有一个方法可以返回当前的区域名称(比如“ us-east-1”,“ eu-west-1”) :

Http://docs.aws.amazon.com/awsjavasdk/latest/javadoc/com/amazonaws/regions/regions.html#getcurrentregion

这是我找到的最干净的解决方案:

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/区域名称格式

多亏了 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 .region -r

我想这是最干净的方法了。

目前为止最简单的

 curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
ec2-metadata --availability-zone | sed 's/.$//'

对于基于 debian 的系统,该命令没有破折号。

ec2metadata --availability-zone | sed 's/.$//'

如果你想避免使用正则表达式,这里有一个你可以用 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 -z | awk '{print $2}' | sed 's/[a-z]$//'

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

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

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

只要使用 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

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

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

除非有些地区 AZ 有两个以上的字母我不知道。

如果你在 windows 上运行,你可以使用 Powershell 的一行程序:

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

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

一个只使用 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]”匹配任意一个数字

如果你想把它变成一个变量,可以这样做:

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'

在某个时候,因为大多数这些答案已经发布,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/,确保您的实例支持该版本或更高版本,然后再使用该版本。

如果您正在寻找一种更简单的方法来完成这项工作,那么可以查看/etc/Resolv.conf 并找到类似于“ search us-west-2。“计算机,内部”。例如:

$ grep "^search" /etc/resolv.conf | sed "s:.* ::; s:\..*::"
us-west-2

所有这些都不再适用于 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"
}

这将获得一个非常短命的令牌,并使用它来获取该区域。