【问题标题】:Powershell get region from AWS metadataPowershell 从 AWS 元数据中获取区域
【发布时间】:2022-03-03 22:57:16
【问题描述】:

我有一个 EC2 实例,我正在那里运行一个 Powershell 脚本,我想在其中获取运行 EC2 的区域。

目前我有这样的解决方法,它首先获取可用区。可用区的格式类似于“us-east-1a”。

$region = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/placement/availability-zone 
if ($region -like "*east*") {$region = "us-east-1"} ELSE {$region = "us-west-2"} 

我只想获取区域,而不是获取可用区域然后进行一些修改。我知道有可能使用:

http://169.254.169.254/latest/dynamic/instance-identity/document

这将返回一个具有区域的 JSON 对象,但我还需要解析 JSON 来实现这一点。

我如何只获得该地区?

【问题讨论】:

    标签: json powershell amazon-web-services amazon-ec2


    【解决方案1】:

    你可以使用ConvertFrom-Json

    PS C:\> $region = (Invoke-WebRequest -UseBasicParsing -Uri http://169.254.169.254/latest/dynamic/instance-identity/document | ConvertFrom-Json | Select region).region
    

    编辑:添加 -UseBasicParsing

    【讨论】:

    • 简化为(Invoke-RestMethod http://169.254.169.254/latest/dynamic/instance-identity/document).region
    【解决方案2】:

    这行得通吗?

    PS C:\> $region = invoke-restmethod -uri http://169.254.169.254/latest/meta-data/placement/availability-zone
    
    PS C:\> $region.Substring(0,$region.Length-1)
    

    【讨论】:

    • 是的,该解决方案将起作用,因为似乎所有可用区域的末尾都添加了一个字母。发现没有本地方法可以通过单个命令来获取该区域。谢谢。
    【解决方案3】:

    解析可用区不是最安全的方法。区域名称可用作实例身份文档的属性,该属性在实例启动时生成。使用 Powershell 读取此信息有两种选择:

    您可以使用 Invoke-WebRequest:

    IWR(也别名为curlwget)工作正常,但它只能处理HTML。所以你需要一个额外的步骤来解析 JSON。它默认使用 IE COM 接口解析 DOM,但您可以通过 -UseBasicParsing 选项避免这种情况。

    PS C:\> curl http://169.254.169.254/latest/dynamic/instance-identity/document | ConvertFrom-Json | Select region
    
    region
    ------
    us-east-1
    
    PS C:\> (curl http://169.254.169.254/latest/dynamic/instance-identity/document | ConvertFrom-Json).region
    us-east-1
    

    但 Invoke-RestMethod 是最好的选择:

    由于这是一个 REST 接口,IRM 是最佳选择,因为它原生支持 JSON 和 XML。

    PS C:\> irm http://169.254.169.254/latest/dynamic/instance-identity/document | Select region
    
    region
    ------
    us-east-1
    
    PS C:\> (irm http://169.254.169.254/latest/dynamic/instance-identity/document).region
    us-east-1
    
    PS C:\> irm http://169.254.169.254/latest/dynamic/instance-identity/document | % region
    us-east-1
    

    【讨论】:

      【解决方案4】:

      尝试使用

      EC2_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
      EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
      

      EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \"wget instance-id has failed: $?\"`"test -n "$EC2_INSTANCE_ID" || die 'cannot obtain instance-id'
      
      EC2_AVAIL_ZONE="`wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone || die \"wget availability-zone has failed: $?\"`"test -n "$EC2_AVAIL_ZONE" || die 'cannot obtain availability-zone'
      
      EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
      

      JQ:

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

      参考:Instance Metadata

      注意:这必须从 EC2 实例内部运行,因为该 IP 是 APIPA。如果不连接元数据源,就无法直接从实例内部获取此信息

      希望对你有帮助

      【讨论】:

      • 看起来这些是 Linux 命令...想知道如何在 Powershell 中执行相同的操作?
      • OP 明确表示需要的解决方案是powershell
      • @helloV:我的错。 Invoke-webrequest 会这样做而不是 curl :)
      【解决方案5】:

      $region = Get-EC2InstanceMetadata -Category 区域

      write-output "获取区域:"

      写入输出 $region.SystemName

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      相关资源
      最近更新 更多