既存 Windows インスタンスを Nitro 世代(m5,c5,t3 …)に移行する手順まとめ ※’18/12 update対応版

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

はじめに

新世代・・・というより、既に「現行世代」といった感のある AWS EC2 の最新ハイパーバイザ Nitro Hypervisor ですが、m4 や t2 といった従来型のインスタンスタイプで動作しているインスタンスを Nitro 世代のインスタンスタイプに変更する場合、OS にも対応が必要な場合があります。

そのための手順は AWS の公式ドキュメントにまとめてあり、既に弊ブログでもいくつか記事が書かれています。

なので、実際に Nitro 世代のインスタンスを使いたい場合は、これらのドキュメントをみながら作業すればいいのですが、実はこの公式ドキュメント(英語版)が最近しれっと更新されていました。下記の手順(項目)が増えています。

Part 6: Updating Power Management Settings

※日本語版ドキュメントにリダイレクトされた場合は、右上の言語から「English」を選択して開き直してください

OSS 版のドキュメントで確認すると、少なくともこちらは先週 12/5 の commit で記述が増えた模様です。

そういうわけで、Windows インスタンスを Nitro 世代に変更する手順について、あらためてまとめてみました。1

前提

Nitro世代インスタンスタイプとは

「Nitro世代」とひとくちに言っても、複数のインスタンスタイプが存在し、今後増えていくと予想されます。こちらのドキュメント(記事執筆時点で英語版のみ)にまとまっていますのでご参照ください。

Nitro-based Instances
(snip)
The following instances are based on the Nitro system:
- A1, C5, C5d, C5n, M5, M5a, M5d, p3dn.24xlarge, R5, R5a, R5d, T3, and z1d
- Bare metal: i3.metal, u-6tb1.metal, u-9tb1.metal, and u-12tb1.metal

変更できるインスタンスの条件

単純に考えて Nitro 発表後にリリースされた AMI から作成された EC2 インスタンスなら、そのまま Nitro 世代のインスタンスタイプで動かしても大丈夫 なはずです。それ以前から動作していたインスタンスを Nitro 世代に移す場合は、対応しているか(そもそも移行できるか)確認する必要があります。最低限下記の条件は下記になります。

  • HVM タイプの AMI から起動されていること
  • ENA および NVMe 用のドライバを含む、あるいはインストール可能であること

現在 t2 や m4 / c4 等の世代で動作しているインスタンスであれば、これらの条件は満たしていると思われます。

また手順上必要になるので、下記がインストールされていることも確認しましょう。可能であれば WindowsUpdate も行って、最新の状態になっていることが好ましいです。

  • PowerShell 3.0以上
  • .NET Framework 3.5 SP1以上

PowerShell のバージョンは、PowerShell ターミナルを開いた後下記のコマンドで確認可能です。

$PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
(以下略)

.NET Framework のバージョン確認については GUI から行った方が簡単でしょう。例えばサーバーマネージャーの「役割と機能の追加」ウィザードを起動し、「機能」のところから、現在インストール済の .NET Framework のバージョンが分かります。2

作業に伴うインスタンスの停止/起動

インスタンスタイプ変更なので、当然無停止というわけにはいきません。バックアップ取得も含めると数回 OS 停止/起動が発生します。実際に行う場合には、そのつもりでご計画ください。

手順概要

ドキュメントにあるように、大まかな流れは下記になります。

  • パート 1: AWS PV ドライバーをインストールしてアップグレードする
  • パート 2: ENA をインストールしてアップグレードする
  • パート 3: AWS NVMe ドライバーのアップグレード
  • パート 4: EC2Config および EC2Launch の更新
  • パート 6: Updating Power Management Settings (New!)

パート 5 は ベアメタルインスタンスのシリアルポートドライバーのインストール ですが、今回のようなユースケースでベアメタルインスタンス(i3.metal)の利用はまれだと思うので、一般的にはパート 1〜4, 6 を行えば良いことになります。今回説明する手順もこちらになります。

なお、パート 1〜3 は出来合の AWS Systems Manager のオートメーションドキュメント AWSSupport-UpgradeWindowsAWSDrivers で一気に行うことが可能なので、既に対象のインスタンスで RunCommands が使用可能な状態になっていれば、下記の手順に短縮できます。

手順

それでは手順を説明します。少し効率も考えて順番を組み直したりしたので、上述の手順そのままにはなっていませんがご了承下さい。「optional」と書いた手順は必須ではありませんが、なるべくやっておいた方がいいでしょう。

なお手順を進める上で、該当インスタンス上でのコマンド実行( PowerShell )と AWS CLI での操作の両方が必要です。環境を用意しておいてください。

0.1. バックアップ (optional / ※ OS 再起動)

作業前に、対象インスタンスのバックアップを取得しておきます。いちど OS を停止させて静止点を作成してから、AMI をとることでバックアップするのが良いでしょう。

本題ではないので細かくは説明しませんが、マネジメントコンソールの「イメージの取得」を実行(「再起動しない」のチェックは外したまま)するのが楽かと思います。

0.2. 必要なファイル(インストーラ)のダウンロード

手順の中で、いくつかのファイルをダウンロードしインストールする必要があります。どうせなのでまとめてダウンロードしておきましょう。手元の作業用端末でダウンロードし共有するか、対象インスタンスが外部へ接続可能なら、PowerShell コマンドラインからダウンロードするのが便利かと思います。

### 共通
Invoke-WebRequest -Uri https://s3.amazonaws.com/ec2-windows-drivers-downloads/AWSPV/Latest/AWSPVDriver.zip -OutFile AWSPVDriver.zip
Invoke-WebRequest -Uri https://s3.amazonaws.com/ec2-windows-drivers-downloads/ENA/Latest/AwsEnaNetworkDriver.zip -OutFile AwsEnaNetworkDriver.zip
Invoke-WebRequest -Uri https://s3.amazonaws.com/ec2-windows-drivers-downloads/NVMe/Latest/AWSNVMe.zip -OutFile AWSNVMe.zip

### Windows Server 2016 以外の場合 (EC2Config)
Invoke-WebRequest -Uri https://s3.amazonaws.com/ec2-downloads-windows/EC2Config/EC2Install.zip -OutFile EC2Install.zip

### Windows Server 2016 の場合 (EC2Launch)
Invoke-WebRequest -Uri https://s3.amazonaws.com/ec2-downloads-windows/EC2Launch/latest/EC2-Windows-Launch.zip -OutFile EC2-Windows-Launch.zip
Invoke-WebRequest -Uri https://s3.amazonaws.com/ec2-downloads-windows/EC2Launch/latest/install.ps1 -Outfile install.ps1

どこか適当に作業用のフォルダを作成し、その中で実行して下さい。対象が Windows Server 2016 か否かで EC2Config か EC2Launch かが変わりますので、適切な方をダウンロードしてください。

1. 最新 PV ドライバのインストール(※ OS 再起動)

手順 に従って作業しましょう。

事前にダウンロードした AWSPVDriver.zip を展開し、中にある AWSPVDriverSetup.msi を実行して下さい。ウィザードが起動するので、指示に従って進めていきます。

ちなみに、ウィザードの途中で表示される注意書きにも書いてありますが、このインストーラは最後に(完了後「Close」をクリックしたら) OS を再起動するのでご注意下さい。再起動は数回行われる可能性があるので、実行後はマネジメントコンソールから「インスタンスのスクリーンショットを取得」を時々実行して確認するといいでしょう。

2. 最新 ENA ドライバのインストール

手順 に従って作業しましょう。

事前にダウンロードした AwsEnaNetworkDriver.zip を展開し、中にある install.ps1 を実行して下さい。PowerShell からの実行前には Set-ExecutionPolicy Unrestricted を実行しておきます。

Set-ExecutionPolicy Unrestricted
.\install.ps1

うまくいけば下記のようなメッセージが出力されます。

Installation of "C:\Users\Administrator\20181214\AwsEnaNetworkDriver\ena.inf" successful.

3. 最新 NVMe ドライバーのインストール

手順 に従って作業しましょう。

事前にダウンロードした AWSNVMe.zip を展開し、中にある dpinst.exe を実行して下さい。

.\dpinst.exe

インストールが完了したら、PowerShell ターミナルより下記コマンドを実行します。実行には数十秒〜 1分弱くらいかかります。

start rundll32.exe sppnp.dll,Sysprep_Generalize_Pnp -wait

3.5. インスタンスタイプ変更(※停止/起動 要 AWS CLI)

ここでインスタンスタイプの変更を行っておきます。ドキュメントによると Windows Server 2008 R2 and Windows Server 2012 RTM の場合は特に、ここでタイプ変更してから先に進むようにとのことでした。

なお手順には書いてないのですが、インスタンスそのものの ENA (拡張ネットワーキング)サポートが無効になっている場合、このタイミングで有効にする必要があります。具体的な手順はこちらを参照してください。

該当インスタンスの停止 -> ENA 有効化 -> インスタンスタイプを Nitro 世代の目的のものに変更 -> インスタンスの開始、という手順になります。

以下、一連の手順を AWS CLI で実施する場合のコマンドを記載します。

### インスタンス ID を変数にセット
INSTANCE_ID=i-1234abcd5678ef901

### 現状の確認
aws ec2 describe-instances \
    --instance-ids ${INSTANCE_ID} \
    --query 'Reservations[].Instances[].{
                Name:Tags[?Key==`Name`].Value|[0],
                InstanceId:InstanceId,
                InstanceType:InstanceType,
                Platform:Platform,
                EnaSupport:EnaSupport,
                State:State.Name
            }[0]'

### インスタンス停止
aws ec2 stop-instances \
    --instance-ids ${INSTANCE_ID}
aws ec2 wait instance-stopped \
    --instance-ids ${INSTANCE_ID} && echo 'stopped.'

### ENA 有効化と変更後の確認
aws ec2 modify-instance-attribute \
    --instance-id ${INSTANCE_ID} \
    --ena-support
aws ec2 describe-instances \
    --instance-ids ${INSTANCE_ID} \
    --query "Reservations[].Instances[].EnaSupport"

### インスタンスタイプ変更(仮に t3.medium)と確認
aws ec2 modify-instance-attribute \
    --instance-id ${INSTANCE_ID} \
    --instance-type t3.medium
aws ec2 describe-instances \
    --instance-ids ${INSTANCE_ID} \
    --query 'Reservations[].Instances[].InstanceType'

### インスタンス起動
aws ec2 start-instances \
    --instance-ids ${INSTANCE_ID}
aws ec2 wait instance-running \
    --instance-ids ${INSTANCE_ID} && echo 'running.'
aws ec2 wait instance-status-ok \
    --instance-ids ${INSTANCE_ID} && echo 'status ok.'

4.1 EC2Config の更新 (Windows Server 2016 以外)

手順 に従って作業します。下記ドキュメントのほうが詳しく書いてあるので、こちらも参照してください。

config.xml が修正されているかどうかで手順がかわりますが、されていない場合は単に EC2Install.exe を実行するだけです。修正がある場合の手順を下記にまとめます。

  1. %Program Files%\Amazon\Ec2ConfigService\Settings\config.xml のバックアップ(コピー)を取得しておく
  2. 事前にダウンロードした EC2Install.zip を展開し、中にある EC2Install.exe を実行する
  3. タスクマネージャにて Ec2Config サービスを停止する
  4. config.xml をバックアップから復元
  5. タスクマネージャから Ec2Config を起動(開始)する

4.2 EC2Launch の更新 (Windows Server 2016)

手順 に従って作業します。下記ドキュメントにも同じことが書いてあります。

  1. C:\ProgramData\Amazon\EC2-Windows\Launch\Config 下の設定ファイルをバックアップしておく
  2. 前述の手順 0.2 でダウンロードした EC2-Windows-Launch.zipinstall.ps1 が存在するフォルダに移動し、そこで install.ps1 を実行する
    1. でバックアップした設定ファイルを戻す

ちなみに EC2Launch は OS 起動時に動作するアプリケーションなので、特にサービスが常時起動しているとかいうことはありません。

5. ベアメタルインスタンスのシリアルポートドライバーのインストール

前述のとおり、ここではスキップします。

必要であれば ドキュメント を参照して手順を実行して下さい。

6. 電源管理設定のアップデート

ハイパーバイザが Nitro 世代になって(あるいはベースが Xen から KVM になって)、AWS 側から EC2 インスタンス上の OS にシャットダウンを伝える方法が変わりました。これが伝わらないと、インスタンスの停止 = 電源断ということになってしまって好ましくありません。Linux の場合は acpid など ACPI 信号を受診する仕組みが OS 上に必要 ですし、同様に Windows の場合は、電源管理設定を Nitro にも対応させる必要があります。

ちなみにこの設定を行った上で、m4 などの Nitro 以外の世代にもどしても問題ありません(再度 powercfg コマンドを打つ必要はありません)。

powercfg /setacvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e 7516b95f-f776-4464-8c53-06167f40cc99 3c0bc021-c8a8-4e07-a973-6b14cbcb2b7e 0
powercfg /setacvalueindex 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 7516b95f-f776-4464-8c53-06167f40cc99 3c0bc021-c8a8-4e07-a973-6b14cbcb2b7e 0
powercfg /setacvalueindex a1841308-3541-4fab-bc81-f71556f20b4a 7516b95f-f776-4464-8c53-06167f40cc99 3c0bc021-c8a8-4e07-a973-6b14cbcb2b7e 0

以上で手順は終了です!

手順 6. の動作確認を兼ねて、最後にもう一回 OS 再起動しておくと良いと思います(optional)。

注意

これだけ説明しておいてアレですが、現在東京リージョンにおいて、Nitro 世代の一部のインスタンスタイプはキャパシティに余裕があまりないようです。

キャパシティ、つまり起動しようとしているインスタンスタイプの余裕が AWS にない場合、起動しようとしても「起動できません」と表示されてしまいます。これは事前に確認できないので、作業中に発生した時は少し時間を置いてから再チャレンジしてみてください。

注釈


  1. このドキュメントの意義に関わるのですが、本番環境などでは可能であれば、Nitro世代のインスタンスタイプの上に新しくOSから構築することをお勧めします。OSから見たら新しいハードウェアの上で動作するようなものなので、そのほうが安全です。
    もしこの手順を実施する場合でも、少なくとも検証環境で試験を行ってから本番に適用することをお考え下さい。 
  2. 厳密な確認方法ではないかも知れませんが、今回の場合これで十分です