[小ネタ] EC2インスタンスメタデータを簡単に確認する (PowerShell編)

2019.03.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

AWS CLIEC2 Instance Metadata Query Toolを使ってインスタンスメタデータへアクセスをするネタが弊社望月によって公開されていますが、本記事ではAWS Tools for PowerShellを使った場合の方法を紹介します。

[小ネタ] EC2インスタンスメタデータを簡単に確認する

前提条件

AWS Tools for PowerShellバージョン3系のはなしです。 バージョン2以前は該当しませんので注意してください。

Get-EC2InstanceMetadata

AWS Tools for PowerShellではVer.3.1.73.0(2016-05-26)からGet-EC2InstanceMetadataコマンドレットが提供されておりメタデータへのアクセスが抽象化されています。

このコマンドレットではListCategoryパラメータを使うとメタデータのカテゴリ一覧を取得できます。

Get-EC2InstanceMetadata -ListCategory

そしてCategoryパラメータを指定してカテゴリ毎のメタデータを取得できます。

Get-EC2InstanceMetadata -Category AmiId

また、Pathパラメータを指定して階層の深いところにあるメタデータを一発で取得することも可能です。

Get-EC2InstanceMetadata -Path /network/interfaces/macs

その他細かい点についてはコマンドレットのリファレンスを参照してください。

Amazon.Util.EC2InstanceMetadata クラス

ここまでは普通にドキュメントにも載っている手段ですが、ここからはちょっと裏技的な方法を紹介します。

AWS Tools for PowerShellは内部でAWS SDK for .NETを使っており、このSDKにはユーティリティクラスとしてAmazon.Util.EC2InstanceMetadataが提供されています。 PowerShellは.NETのオブジェクトを扱うシェルですのでこのAmazon.Util.EC2InstanceMetadataクラスを直接扱うことができます。

先ほどのGet-EC2InstanceMetadataコマンドレットで取得した情報も以下の様な感じで取得できます。 (カテゴリ情報は Get-EC2InstanceMetadata 独自のものなので取得できません)

# クラスをロードするために`Import-Module`を明示する必要があります
Import-Module AWSPowerShell

[Amazon.Util.EC2InstanceMetadata]::AmiId

[Amazon.Util.EC2InstanceMetadata]::NetworkInterfaces[0].MacAddress
# PowerShell 3.0以降で可能な記法
[Amazon.Util.EC2InstanceMetadata]::NetworkInterfaces.MacAddress

こちらも細かい内容はリファレンスを参照してください。

最後に

本記事ではPowerShellを使った2通りのメタデータの取得方法を紹介しました。

用途に応じて好きな方を使えば良いと思います。 個人的にはコンソール上でちょっとデータを確認するときはGet-EC2InstanceMetadataを、スクリプト中ではAmazon.Util.EC2InstanceMetadataを使うのが良さそうだなと感じています。

もちろんこれらの機能を使わずInvoke-WebRequestInvoke-RestMethodを使い続けるのも良いでしょう。 とくに応答速度が重視されるときはInvoke-WebRequestInvoke-RestMethodの方が良い場合が多いと思います。