AWS上のWindowsのVersionを一気に調べる


## ピンチ
AWSから突然メールが来て、Windows Server 2012 R2のインスタンスは、再起動すると二度とつながらなくなるらしい！

* Important information about Amazon EC2 instances running Windows Server 2012 R2
http://aws.amazon.com/jp/windows/2012r2-network-drivers/

* ServerWorksさん早い！
http://blog.serverworks.co.jp/tech/2014/09/04/importantinformationaboutec2win2012r2/

しかし！
・ちょ〜いっぱいのインスタンスを見ないといけない
・AMIはいろいろコピーして使っているので、名前からはWindowsのバージョンまでわからない
・一台づつRDPして調べると一生かかってしまいそう
などなど、いろいろな事情があるのでピンチです。

そこで、なるべく労力をかけずにWindowsInstancesのバージョンを一挙に調べる方法を考えてみます。
もっといい方法があったら逆に教えてください！

## 調査用のWindowsインスタンスを用意
直接AWSにPrivate IP AddressにてIP RechableなWindowsマシンがあるかたはそれを利用します。
無い方は、AWS上に適当なWindowsInstanceを用意しましょう。(2012R2じゃないやつを)

## 調査用スクリプトを作る
PowerShellやバッチファイルで作ればよかったのですが、手抜きでShellScriptで作ったので、Cygwinなどを入れて準備します。

## AWS CLIを入れる
http://aws.amazon.com/jp/cli/
64ビットか32ビットっていう所を押して、実行するだけで入ります。
ここからインストールしてください。

## Cygwinなどを入れる
たとえばCygwinなど、ShellScriptを実行できる環境を入れてください。
http://cygwin.com/
setup-x86.exe (32-bit installation)か
setup-x86_64.exe (64-bit installation)
という所を押して、
途中で近いミラーサイトを選んで、つぎつぎ行けばとりあえず入ります。

## AWS CLIを使う準備をする
Cygwin Terminalなどを立ち上げて、

```shell-session:例
$ mkdir ~/.aws
$ vi ~/.aws/config

[default]
output = text
region = ap-northeast-1
aws_access_key_id = ACCESS_KEY
aws_secret_access_key = SECRET_KEY
```

のような感じでAWS CLIを使えるようにしてください。
詳しくは、
http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html

※ Windowsコマンドにて日本語が文字化けする場合は、ターミナルを右クリック->Options...->TextのFontをMSゴシックなどに、Localeをja_JPに、Character setをSJISにすると文字化けしなくなります。

## 調査用スクリプトを入れる
こんな感じのを作ります(手抜き)

```shell-script:list_windows_instance_version_aws.sh
#!/bin/bash

AWSCLIPATH="/cygdrive/c/Program Files/Amazon/AWSCLI/aws.exe"
AWSCLIOPT="--output text "

for IID in $("${AWSCLIPATH}" ${AWSCLIOPT} ec2 describe-instances --filter Name=platform,Values=windows --query "Reservations[].Instances[].[InstanceId]" | sed -e 's/\r//g')
do

  echo
  PRIIP=$("${AWSCLIPATH}" ${AWSCLIOPT} ec2 describe-instances --instance-id ${IID} --query "Reservations[].Instances[].NetworkInterfaces[].[PrivateIpAddress]" | sed -e 's/\r//g')
  KEYNAME=$("${AWSCLIPATH}" ${AWSCLIOPT} ec2 describe-instances --instance-id ${IID} --query "Reservations[].Instances[].[KeyName]" | sed -e 's/\r//g')
  KEYPATH="./keys/${KEYNAME}.pem"

  echo "Instance ID : ${IID}"
  echo "KeyPath : ${KEYPATH}"
  echo "Private IP Address : ${PRIIP}"

  PASSWD=$("${AWSCLIPATH}" ${AWSCLIOPT} ec2 get-password-data --instance-id ${IID} --priv-launch-key ${KEYPATH} --query "[PasswordData]" | sed -e 's/\r//g')

  if [ "" = "${PASSWD}" ]
  then
    echo "can not get windows password."
  else
    echo "Windows Password : ${PASSWD}"

    systeminfo /s ${PRIIP} /u Administrator /p "${PASSWD}" | findstr "^OS"

  fi

done
```

## AWSに設定した鍵を準備する
WindowsInstanceに設定した鍵の秘密鍵を用意して、./keys/に入れておきます。
名前は、.pemをつけましょう。(仕様)

```shell-session:例
$ mkdir keys ; cat "ssh-rsa xxxxx" > ./keys/default.pem
```

## スクリプトを実行してみる

```shell-session:例
$ bash ./list_windows_instance_version_aws.sh
```

で実行してみます。
※ WindowsのAdministratorPasswordをキーと結びつかないように変更していると、内部で実行している

<pre>
systeminfo /s ${PRIIP} /u Administrator /p ${PASSWD} | findstr "^OS"
</pre>

が失敗するので、有効なユーザ名、パスワードにて「結局手動で」実行してくださいw
うまく実行されると、

```shell-session:出力例
Instance ID : i-02xxxxx
KeyPath : ./keys/default.pem
Private IP Address : 10.1.1.100
Windows Password : xxxxxxx
OS 名:                  Microsoft Windows Server 2012 R2 Standard
OS バージョン:          6.3.9600 N/A ビルド 9600
OS 製造元:              Microsoft Corporation
OS 構成:                スタンドアロン サーバー
OS ビルドの種類:        Multiprocessor Free

Instance ID : i-4exxxxxx
KeyPath : ./keys/win.pem
Private IP Address : 10.1.1.176
Windows Password : xxxxxxx
OS 名:                  Microsoft Windows Server 2008 R2 Datacenter
OS バージョン:          6.1.7601 Service Pack 1 ビルド 7601
OS 製造元:              Microsoft Corporation
OS 構成:                スタンドアロン サーバー
OS ビルドの種類:        Multiprocessor Free

Instance ID : i-c1xxxxxxx
KeyPath : ./keys/default2.pem
Private IP Address : 10.1.1.21
Windows Password : xxxxxxxx
OS 名:                  Microsoft Windows Server 2012 Standard
OS バージョン:          6.2.9200 N/A ビルド 9200
OS 製造元:              Microsoft Corporation
OS 構成:                スタンドアロン サーバー
OS ビルドの種類:        Multiprocessor Free
```

こんな感じで出てきます。対象がたくさんあった場合はAWSさんを恨みましょうw

# 以上！