Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon ec2 从EC2实例中查找区域_Amazon Ec2_Amazon Web Services - Fatal编程技术网

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/区域名称格式,则无需担心
多亏了,有了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/.$//'
对于基于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