Amazon ec2 从EC2实例中查找区域
是否有一种方法可以从实例中查找实例的区域Amazon ec2 从EC2实例中查找区域,amazon-ec2,amazon-web-services,Amazon Ec2,Amazon Web Services,是否有一种方法可以从实例中查找实例的区域 我正在寻找类似的方法。要查找有关您登录的EC2的信息,您可以使用 ec2元数据工具 您可以通过以下方式安装该工具 安装该工具后,可以运行 #ec2元数据-z 了解这个地区 此工具随最新(10.10)的Ubuntu AMIs一起安装,或者不要求Ubuntu或此工具,只需执行以下操作: : "${EBS_VOLUME_AVAILABILITY_ZONE:=$(curl -s http://169.254.169.254/latest/meta-data/pl
我正在寻找类似的方法。要查找有关您登录的EC2的信息,您可以使用 ec2元数据工具 您可以通过以下方式安装该工具 安装该工具后,可以运行
#ec2元数据-z
了解这个地区
此工具随最新(10.10)的Ubuntu AMIs一起安装,或者不要求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()似乎不再有效。当我试着使用它时,我得到了一个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
基于评论您可以使用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”):
这是我找到的最干净的解决方案:
curl-shttp://169.254.169.254/latest/dynamic/instance-identity/document |sed-n's/ “区域”:“\(.*)”/\1/p'
例如:
export REGION=$(curl-shttp://169.254.169.254/latest/dynamic/instance-identity/document |sed-n's/ “区域”:“\(.\)”/\1/p')
- 不进行API调用,使用EC2实例元数据
- 仅使用curl和基本sed,因此不依赖于SDK或不可能安装的工具
- 不尝试解析可用性区域名称,因此如果AWS更改AZ/区域名称格式,则无需担心
$ 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/.$//'
对于基于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答案)
如果您使用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文档中找到的映射,响应元数据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
使用JQ:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
只要您使用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
如果您安装了jq,您也可以这样做(可能是最“优雅”的方法):
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
这只是返回“region”的原始值,没有任何漂亮的打印或其他格式。
参考:也在寻找从实例中查找区域的解决方案,下面是我的纯Bash解决方案:
az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az:0:${#az}-1}
除非存在AZ包含两个以上字母的区域(我不知道)。如果您在windows上运行,您可以使用此powershell one liner:
$region=(Invoke-RestMethod "http://169.254.169.254/latest/dynamic/instance-identity/document").region
ec2metadata
(无破折号)是当前命令,用于向您提供有关ec2盒的所有aws托管信息。这是最优雅和安全的方法。(ec2 metadata
是一个旧的、不再有效的命令。)一种仅使用egrep的方法,该方法可以在大多数已启动的linux实例上运行,而无需安装任何额外的工具。我测试了所有当前AWS区域的列表,它们都匹配
curlhttp://169.254.169.254/latest/meta-data/placement/availability-zone |白鹭-o'(\w)+-(\w)+-[0-9]'
正则表达式的解释:
- “(\w)+”匹配任意数量的字母
- “-”只匹配一个破折号
- “[0-9]”匹配任意1个数字
region=$(卷曲)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/metadata/placement/region
这意味着获取该区域应尽可能简单
REGION=“$(wget-q-O-http://169.254.169.254/latest/meta-data/placement/region)"
编辑:可能还值得一提的是,该端点在2019-10-01版元数据API中可用。请确保您的实例支持该版本或更高版本,然后再通过选中
http://169.254.169.254/
您可以使用此curl请求获取实例区域
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1
对于不关心所有shell脚本的任何人来说,简短答案可能重复:从
http://169.254.169.254/latest/meta-data/placement/availability-zone
并删除最后一个字符。这是否回答了您的问题?对于那些阅读2020年中期后的读者,您现在可以使用http://169.254.169.254/latest/meta-data/placement/region
请注意,这仅适用于当前可用区域,因为可用区域始终是带有小写字母的区域名称(例如,区域为“us-west-1”,区域为“us-west-1a”)。如果亚马逊打破了这一模式,那么上述逻辑将不再有效。这是不正确的ec2元数据-z
仅显示可用区域,而不是区域。这是否适用于任何区域/az(以及任何AMI)?我正在从us-east-1a
@AdamMonsen中的一台机器上获取404-找不到
试图获取
该URL可能是一个暂时的错误。我跟我们在一起
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | sed -n 's/ "region" : "\(.*\)"[,]/\1/p'
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1