有没有办法从实例中查找实例的区域?
我正在寻找类似于finding the instance id的方法。
答案 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):
答案 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')
答案 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]'
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