我有一个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来实现此目的。
我如何获得该地区?
答案 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
注意:必须从EC2实例内部运行,因为该IP是APIPA。如果没有连接到元数据源,就无法直接从实例内部获取此信息
希望有所帮助
答案 3 :(得分:1)
解析可用区不是最安全的方法。区域名称可用作实例身份文档的属性,该属性是在启动实例时生成的。有两个选项可用于通过Powershell读取此信息:
IWR(也别名为curl
和wget
)工作正常,但只能处理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
由于这是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