从EC2实例中查找区域

Gar*_*son 122 amazon-ec2 amazon-web-services

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

我正在寻找类似于查找实例ID的方法.

dan*_*aur 133

该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]$//'`"
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

编辑:sed根据评论改进

  • 比为EC2_REGION提供的命令更简单的sed替换命令:`sed's/[az] $ //` (12认同)
  • 这将在EC2实例内部运行*并由AWS的后端提供支持.它不会在其他地方工作(主要是因为IP是APIPA).此外,如果没有连接到元数据源,也无法直接从实例内部获取此信息.这假定169.254.169.254 API可用,并且您的脚本应相应地处理网络故障.`ec2-metadata`只是这个API的包装器,但基本上做同样的事情. (4认同)
  • 老实说,当我想出那个2-liner时,我只是在寻找API,寻找可以用来识别正确区域的任何东西.此处完整记录了AWS元数据API:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html (2认同)
  • 如果这是在bootscript中,则元数据服务可能尚未实例化 - 如果是,请等待并再试一次.我已经看到启动后需要10-15秒才能使元数据位置可用. (2认同)

小智 80

还有一种方法可以实现:

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

echo $REGION

us-east-1
Run Code Online (Sandbox Code Playgroud)

  • 用awk:```curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | awk -F \"'/ region/{print $ 4}'``` (4认同)
  • 使用jq:`curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region` (2认同)

小智 35

如果使用正常jq,可以运行以下命令:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r
Run Code Online (Sandbox Code Playgroud)

我想这是最干净的方式.


Jos*_*ban 26

ec2-metadata --availability-zone | sed 's/.$//'
Run Code Online (Sandbox Code Playgroud)

  • 获取仅包含区域名称的纯字符串:`ec2-metadata --availability-zone | sed's/placement:\(.*\).$ /\1 /'` (5认同)

Dan*_*itz 18

您可以使用ec2-metadata:

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

  • 对于我来说,每次AWS添加新区域时都会中断的脚本似乎不是一个特别强大的解决方案. (19认同)
  • 或..只需使用`ec2metadata --availability-zone` (6认同)
  • 有了这个,如果您处于“ eu-central-1”,那么您就搞砸了。 (2认同)
  • 当我最初写下答案时,`central`不存在.它现在已添加. (2认同)

Jae*_*hun 17

如果你想避免使用正则表达式,这里有一个你可以用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']"
Run Code Online (Sandbox Code Playgroud)


Fra*_*zzi 15

到目前为止我找到的最容易

 curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
Run Code Online (Sandbox Code Playgroud)


小智 13

非常简单的一个班轮

export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone`
export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}
Run Code Online (Sandbox Code Playgroud)

  • 那是两行 (3认同)

Ste*_*oob 9

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

这意味着获取区域应该很简单

REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"
Run Code Online (Sandbox Code Playgroud)

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

  • 事实证明,自从添加“region”端点之前,有问题的实例就在没有重新启动的情况下运行,这就是它不可用的原因 - 如[记录](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/实例数据-数据-类别.html)。 (2认同)

Arb*_*zar 8

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

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//'
Run Code Online (Sandbox Code Playgroud)


小智 5

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

# curl -s curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region'
eu-west-1
Run Code Online (Sandbox Code Playgroud)


Spa*_*nky 5

使用JQ:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
Run Code Online (Sandbox Code Playgroud)