Home > Windows にまつわる e.t.c.

AWS Windows EC2 インスタンス内で Name TAG を取得する


オンプレ環境のサーバーの場合は、BIOS の SerialNumber や hostname からサーバー自身が自分の識別情報を得ることができますが、クラウド上に構築した Windows インスタンスにはこの手が使えません。

AWS の場合は、Web API と、EC2 インスタンスにプレインストールされている PowerSehell の AWS 拡張で Name TAG 等の識別情報を得ることができます。

 

Web API で情報を取得する

Web API で取得できる情報は、http://169.254.169.254/latest/meta-data/ で確認できます。

PS C:\> Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/

 

これを見ると、instance-id と local-hostname が識別子に使えそうです。

値を取得するには、以下のようにします。

PS C:\> Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/local-hostname
ip-172-31-10-149.ap-northeast-1.compute.internal

PS C:\> Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/instance-id
i-07b89f6831aaf62d4

 

Name TAG を取得する

これらの値は、AWS が割り当てる値なので、管理に使いにくいという事であれば、EC2 インスタンスに出来る Name TAG が便利でしょう。

Name TAG は、PowerShell の AWS 拡張コマンドレットの Get-EC2Tag で取得できるのですが、このコマンドレットを使うには IAM で発行した AccessKey と SecretKey が必要です。
(EC2 の外から特定インスタンスの Name TAG を取得するのと同じ事を EC2 内で実行します)

必要以上の権限を持ったユーザーを使うのはセキュリティ上好ましくないので、必要最低限の権限を持ったユーザーを作成し、そいつの AccessKey SecretKey を使うのがお勧めです。

AWS の既存ポリシーを使うのであれば、AmazonEC2ReadOnlyAccess あたりが良いでしょう。

ちなみに、EC2 の PS 実行ポリシーが、AllSigned になっているので、AWS PowerShell 拡張ロード時に対話処理が入ります。
これがうざいので、RemoteSigned に変更しておくのがお勧めです。

# PowerShell 実行ポリシー設定
Set-ExecutionPolicy RemoteSigned -Force

# AccessKey、SecretKey は架空の値です
$Region = "ap-northeast-1"
$AccessKey = "HOGEHOGE123456789012"
$SecretKey = "APK60uPn5dJ2CqYCysgsAPK60uPn5dJ2CqYCysgs"

# EC2 タグの取得
[array]$EC2Tags = Get-EC2Tag -Region $Region -AccessKey $AccessKey -SecretKey $SecretKey

 

Get-EC2Tag で取得したタグは、自分の EC2 インスタンス以外のものも含まれているので、自分のインスタンスIDで自分のタグに絞ります。

### 自分の TAG だけにする
# インスタンス ID
$InstanceId = Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/instance-id

# インスタンス ID で自分のタグだけを取り出す
[array]$MyTags = $EC2Tags | ? {$_.ResourceId -eq $InstanceId}

 

Name タグは、Key に "Name" がセットされています。

# Name TAG の値を取り出す
$NameTagData = $MyTags | ? {$_.Key -eq "Name"}

# Name TAG の値を表示
echo $NameTagData.Value

 

これで、自分自身の Name TAG 情報を取得することが出来ました。

 

一連の処理を関数にするとこんな感じです

###############################################################
# Name TAG 取得
###############################################################
function GetNameTag( $Region, $AccessKey, $SecretKey ){
    # EC2 タグの取得
    [array]$EC2Tags = Get-EC2Tag -Region $Region -AccessKey $AccessKey -SecretKey $SecretKey

    # インスタンス ID
    $InstanceId = Invoke-RestMethod -Uri http://169.254.169.254/latest/meta-data/instance-id

    # インスタンス ID で自分のタグだけを取り出す
    [array]$MyTags = $EC2Tags | ? {$_.ResourceId -eq $InstanceId}

    # Name TAG を取り出す
    $KeyName = "Name"
    $NameTagData = $MyTags | ? {$_.Key -eq $KeyName}

    # Name TAG の値を返す
    return $NameTagData.Value
}

 

関連情報

関数を PowerShell プロンプトで実行する
http://www.vwnet.jp/Windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm

スケジュールジョブ(PowerShell)でパスワードをセキュアに使う(証明書編)
http://www.vwnet.jp/Windows/WS12R2/Password/CertPassword.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.