代码之家  ›  专栏  ›  技术社区  ›  Gary Richardson

从EC2实例中查找区域

  •  110
  • Gary Richardson  · 技术社区  · 15 年前

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

    我在找类似于 finding the instance id .

    23 回复  |  直到 9 年前
        1
  •  134
  •   Reverend Tim    8 年前

    那个网址( 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 基于评论

        2
  •  80
  •   Fluffy    13 年前

    还有一种方法可以实现这一点:

    REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}'`
    
    echo $REGION
    
    us-east-1
    
        3
  •  35
  •   XDR    10 年前

    如果你同意使用 jq ,可以运行以下命令:

    curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r
    

    我想这是最干净的方法。

        4
  •  26
  •   Suncatcher    8 年前
    ec2-metadata --availability-zone | sed 's/.$//'
    
        5
  •  18
  •   Daniel Kuppitz    11 年前

    您可以使用ec2元数据:

    ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
    
        6
  •  17
  •   Jaeyoung Chun    9 年前

    如果要避免使用正则表达式,可以使用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']"
    
        7
  •  15
  •   Francesco Gualazzi    10 年前

    到目前为止我发现的最简单的

     curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
    
        8
  •  13
  •   Beau Grantham    13 年前

    很简单的一行

    export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone`
    export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}
    
        9
  •  8
  •   Arbab Nazar    7 年前

    如果你有 jq公司 安装后,您还可以通过以下方式进行操作(可能是最“优雅”的方法):

    curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
    

    这只是返回“region”的原始值,而没有任何漂亮的打印或其他格式。 参考: AWS Forum

        10
  •  6
  •   mohrt    9 年前

    从可用区域中获取区域,去掉最后一个字母。

    ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//'
    
        11
  •  5
  •   Spanky    8 年前

    使用JQ:

    curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
    
        12
  •  4
  •   Ken Weiner    11 年前

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

    http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/regions/Regions.html#getCurrentRegion()

        13
  •  4
  •   Kelly Setzer    11 年前

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

    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/Region名称格式
        14
  •  4
  •   Community Mohan Dere    9 年前

    多亏了 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继续对附加到区域的可用性区域使用单个字符。

        15
  •  4
  •   dank    8 年前

    如果有人想用好的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
    
        16
  •  3
  •   flaccid    15 年前

    或者不要让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:]])}"}
    
        17
  •  3
  •   Alan    8 年前

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

    # curl -s curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region'
    eu-west-1
    
        18
  •  3
  •   Gil Zellner    8 年前

    2行程序,只要使用ec2.internal作为搜索域即可:

    az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
    region=${az:0:${#az} - 1}
    
        19
  •  3
  •   Michael Küller Lars Hellwig    8 年前

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

    ec2-metadata --availability-zone | sed 's/[a-z]$//'
    
        20
  •  2
  •   cwa    7 年前

    如果您在windows上运行,则可以使用此powershell一行程序:

    $region=(Invoke-RestMethod "http://169.254.169.254/latest/dynamic/instance-identity/document").region
    
        21
  •  1
  •   Ajax    7 年前

    我们还在寻找一个从实例中找到region的解决方案,下面是我的纯Bash解决方案:

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

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

        22
  •  0
  •   sheki    15 年前

    要查找有关您登录的EC2的信息,可以使用 ec2元数据工具。

    可以通过以下方法安装工具 this link. 安装工具后,可以运行

    # ec2-metadata -z

    找出那个地区。

    这个工具是与最新的UbuntuAMIS(10.10)一起安装的,

        23
  •  0
  •   Surya Prakash Patel    8 年前

    如果您希望使用JS获得region,那么应该可以:

    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
    
        24
  •  0
  •   Garen    6 年前

    ec2metadata (没有破折号)是当前的命令,向您提供有关您的ec2框的所有aws宿主信息。这是最优雅和安全的方法。( ec2-metadata 是旧的,不再有效的命令。)