Powershell从AWS元数据中获取区域

时间:2017-08-22 17:16:23

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

我有一个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来实现此目的。

我如何获得该地区?

4 个答案:

答案 0 :(得分:4)

这会有用吗?

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)

答案 1 :(得分:4)

您可以使用 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

答案 2 :(得分:1)

尝试使用

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。如果没有连接到元数据源,就无法直接从实例内部获取此信息

希望有所帮助

答案 3 :(得分:1)

解析可用区不是最安全的方法。区域名称可用作实例身份文档的属性,该属性是在启动实例时生成的。有两个选项可用于通过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