EC2のインスタンスタイプをNitro世代へプライベートサブネット環境で移行する

Pocket

Amazon EC2の新基盤「Nitro」とは

Nitroは、Amazon Web Services(AWS)社が2017年に発表した、Amazon EC2(EC2)の新基盤です。AWS社はNitroについてこう説明しています。

Nitro システムは、高パフォーマンス、高可用性、高セキュリティを実現する AWS で構築されたハードウェアとソフトウェアのコンポーネントの集合です。また、ベアメタル機能を備えることで、仮想化オーバーヘッドを排除するとともに、ホストハードウェアへのフルアクセスを要求するワークロードをサポートします。

AWSドキュメント『Amazon EC2  Windowsインスタンス用ユーザーガイド』より

Amazon EC2 でWindowsOSのインスタンスタイプをNitro世代にする

Amazon EC2を利用しているお客様の基幹システムにて、Amazon EC2 リザーブドインスタンスの契約更改を迎えるのを機に、インスタンスタイプの見直しを実施しました。現行システムではm4インスタンスタイプのEC2(Windows Server 2012R2)があり、これをNitro世代であるm5インスタンスタイプにバージョンアップすることになりました。

Window OS はm5インスタンスタイプに変更する際、各種ドライバの事前のアップグレードが必要なのですが、AWSのオートメーション機能を利用することで簡単に作業できると考えていました。がしかし、お客様のプライベートサブネット環境ではオートメーション機能が使えず、工夫が必要でした。本記事ではその顛末についてお話しようと思います。

あらためて、今回のアップグレードの仕様はこちらです。

対象OS Windows Server 2012 R2
EC2インストールタイプ (現行)m4.xlarge → (新規)m5.xlarge

ドライバのアップグレードにオートメーションドキュメントを使ってみる

AWSのマニュアルには、Windowsサーバ用m5インスタンスタイプ対応のドライバアップグレードには、“オートメーションドキュメント(AWSSupport-UpgradeWindowsAWSDrivers)を提供している”旨の記載(AWSドキュメント『最新世代のインスタンスタイプへの移行』)があり、さっそく検証用AWSアカウントで実行してみました。

手順は、以下の通りです。 前提として、検証環境のプライベートサブネットには、NATゲートウェイを介してインターネットへのルートが設定されていました。

1.IAMユーザへの権限追加

実行するIAMユーザのロールにSSMアクセス(オートメーションドキュメントを使用するための権限)のポリシー(AmazonSSMFullAccess)を追加します。

2.対象EC2インスタンスの停止

対象のEC2 Windows インスタンスを停止します。
※ここで、バックアップのため対象EC2インスタンスのAMIの作成をしました。

3.Systems Managerにアクセス

AWSマネジメントコンソールから、[Systems Manager]を選択します。

4.オートメーションの実行

アクション内の[オートメーション]を選択し、  [オートメーションの実行]ボタンを選択します。

5.オートメーションドキュメント[AWSSupport-UpgradeWindowsAWSDrivers]の設定

検索フィールドに AWSSupport-UpgradeWindowsAWSDrivers を設定してEnterキーを押し、 名前(アンカー:AWSSupport-UpgradeWindowsAWSDrivers) をクリックします。

6.オートメーションの実行

[オートメーションの実行]ボタンをクリックします。

7.[入力パラメータ] の設定

[入力パラメータ] セクションで次のオプションを設定します。

項目 設定内容 補足
インスタンス ID i-xxxxxxxxx 対象EC2(m4インスタンスタイプ)のインスタンスID
AllowOffline True オフラインインストールを実行するには、このオプションを選択します。インスタンスは、アップグレード処理中に停止され、再開されます。
SubnetId SelectedInstanceSubnet (デフォルト) アップグレードプロセスでは、アップグレードするインスタンスと同じサブネットにヘルパーインスタンスを起動します。サブネットは、SSM エンドポイントとの通信を可能にする必要があります。

その他のフィールドは、既定値のままにします。

設定後、[実行] をクリックします。

8.[ステータス]の遷移

[実行ステータス]の[全体ステータス]が「実行中」となり、[実行したステップ]の[ステータス]が順次「成功」に変わります。

9.ドライバアップグレードの完了

[実行ステータス]の[全体ステータス]が「成功」となり、AWS PV、ENA、NVMeドライバのアップグレードは完了です。

10.EC2インスタンスタイプの変更

この後、対象EC2インスタンスのインスタンスタイプを変更して、インスタンスを起動します。

オートメーションドキュメントを使うには通信経路の確保が必要

このように検証環境では、無事ドライバ アップグレードが実施できました。そこでお客様の検証環境で オートメーションドキュメントを実行したところ、 実行途中で失敗(エラー)しました。

AWSサポートへ相談したところ、オートメーションドキュメント サービスを実行するには、以下のいずれかの方法でインターネットを介した通信経路を確保する必要があるとのことでした。

    1. ルートテーブルの通信先 0.0.0.0/0 のターゲットにインターネットゲートウェイに設定する。
    2.  NAT ゲートウェイを作成し、ルートテーブルの通信先 0.0.0.0/0 のターゲットを NAT ゲートウェイに設定する。

お客様の環境では、セキュリティー上の理由でプライベートサブネットをインターネットゲートウェイおよび、NATゲートウェイへのルートを設けることができませんでした。

通信経路が確保できないプライベートサブネット環境のNitro移行は地道にドライバをインストール

そこでお客様の環境では、事前のドライバ アップグレード をドライバ毎に実施することになりました。

通信経路が確保できないプライベートサブネット環境で、EC2 Windows インスタンスのインスタンスタイプを m4 から m5 へアップグレード する手順をご説明します。

0.必要なリソースの準備

アップグレードに必要なリソースを以下のサイトからダウンロードします。

上記を対象のEC2(Windows Server)のフォルダに格納して解凍しておきます。
※ドライバのアップグレードの前に対象のEC2インスタンスを一旦停止して、AMIの作成をしました。(事前バックアップ) 

1.AWS PV ドライバのアップグレード

(1) AWS PV ドライバのインストール

AWSPVDriver.zip を解凍したフォルダに移動し、 AWSPVDriverSetup.msi をダブルクリックします。

(2)Windows Server の自動再起動

いくつかのダイアログに回答するとWindows Server が自動的に再起動します。

2.ENA ドライバのアップグレード

(1)PowerShell 動作環境設定

前工程で再起動した Windows Server にサインインし、管理者で PowerShell を起動し、PowerShell に動作環境の設定をします。

Set-Item env:tz -Value jst
Set-Item function:Global:prompt {“PS: $(Get-Date)> “} -force
Set-ExecutionPolicy Unrestricted
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は “Y”): y 

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

AwsEnaNetworkDriver.zip を解凍したフォルダに移動し、フォルダの中にある install.ps1 を実行します。 正常に実行されると、 successful が表示されます。

3.AWS NVMe ドライバのアップグレード

(1) 最新 NVMe ドライバのインストール

AWSNVMe.zip を解凍したフォルダに移動し、フォルダの中にあるdpinst.exe を実行します。

(2) NVMe ドライバの再設定

以下のコマンドを実行します。

start rundll32.exe sppnp.dll,Sysprep_Generalize_Pnp -wait

4.ENAドライバの有効化

※ ENAドライバを有効にするためには、対象のEC2インスタンスがインターネットに接続できることが必要ですが、 前述のとおりインターネットへの接続ができないため、代替として EC2サービス(com.amazonaws.ap-northeast-1.ec2)へのエンドポイントを設定しました。

※ ENAドライバを有効化する対象の EC2 サーバとは別に、ドライバ有効化のコマンド(AWS CLI)を実行するサポート用サーバを準備します。

(1)対象EC2 インスタンスの停止

ENAドライバを有効化する対象の EC2 インスタンスを停止します。

(2)エンドポイントの設定

対象の EC2 インスタンスを含むサブネットに対して、EC2サービス(com.amazonaws.ap-northeast-1.ec2)へのエンドポイントを設定します。 詳細は、(2.1)~(2.5)に記載しました。

(2.1)EC2 のロールにポリシーを追加設定

AWSコンソールで対象 EC2 サーバのロールがアタッチしているポリシーに ec2:ModifyInstanceAttribute の許可を追加します。

(2.2)セキュリティグループの設定

AWSコンソールで対象となる EC2 インスタンスを含むサブネット(プライベート)に対して、http での接続を許可するセキュリティグループ(sec-pvpce)を作成します。

(2.3) エンドポイントの作成

対象EC2 インスタンスが含まれるサブネットにEC2サービス(com.amazonaws.ap-northeast-1.ec2)へのエンドポイントを作成し、EC2サービスへの接続を可能にします。

(2.4)セキュリティグループの設定

(2.2)で作成したセキュリティグループを設定します。

エンドポイントが作成されました。

(2.5)エンドポイントの名前設定

エンドポイントに名前(vpce-pec2)を付けます。

(3)有効化作業前のENAの状態

サポート用EC2インスタンス(Linux)で以下コマンドを実行し、ENA拡張ネットワーキングが有効化されているかどうかの確認をします。

aws ec2 describe-instances –instance-ids インスタンスID –query “Reservations[].Instances[].EnaSupport”

※ インスタンスID は、ENAドライバを有効化する対象インスタンスのインスタンスID(キャプチャー中: i-xxxxx71)です。 有効化されていない場合は、[] (ヌル)が戻ります。

(4)ENA拡張ネットワーキングの有効化

サポート用EC2インスタンス(Linux)で以下コマンドを実行し、ENA拡張ネットワーキングを有効化します。

aws ec2 modify-instance-attribute –instance-id インスタンスID –ena-support

※ インスタンスID は、ENAドライバを有効化する対象インスタンスのインスタンスID(キャプチャー中: i-xxxxx71)です。

(5)有効化作業後のENAの状態

サポート用EC2インスタンス(Linux)で以下コマンドを実行し、ENA拡張ネットワーキングが有効化されているかどうかの確認をします。

aws ec2 describe-instances –instance-ids インスタンスID –query “Reservations[].Instances[].EnaSupport”

※ インスタンスID は、ENAドライバを有効化する対象インスタンスのインスタンスID(キャプチャー中: i-xxxxx71)です。有効化されている場合は、[ true ] が戻ります。

(6)エンドポイントの削除

ENAドライバの有効化に使用したエンドポイントを削除します。

(7)セキュリティグループの削除

使用済のセキュリティグループを削除します。

5.インスタンスタイプの変更

(1)インスタンスタイプの変更

停止中の対象EC2インスタンスのインスタンスタイプを m4.xlarge から m5.xlarge に変更します。

(2)起動および、インスタンスタイプの確認

対象EC2インスタンスを起動し、インスタンスタイプが変更されていることを確認します。

6.EC2Config の更新

Windows がm5インスタンスタイプ(Nitroシステム)で提供される追加の機能を有効にするため、EC2Config を最新化する必要があるとのことなので更新します。

(1)EC2Configのバージョンの確認

「コントロールパネル > 全てのコントロールパネル項目 > プログラムと機能」 で EC2Configサービス のバージョンを確認します。

(2)既存 EC2Config.xml ファイルのバックアップおよび、EC2Config を最新化の実行

EC2Install.zip を解凍したフォルダに移動し、既存の EC2Config.xml ファイルのバックアップ(copy)を取り、EC2Install.exe を実行します。

表示されるダイアログに沿って実行します。

(3)EC2Configサービスの停止

タスクマネージャで EC2Configサービスを停止します。

(4)既存 config.xml の復元

バックアップ(copy)した、config.xml を元のフォルダに戻し(上書き)ます。念のため、ファイル相違点の比較をします。

(5)EC2Configサービスの起動

タスクマネージャでEC2Configサービスを起動します。

(6)EC2Configのバージョンの確認

「コントロールパネル > 全てのコントロールパネル項目 > プログラムと機能」で EC2Configサービス のバージョンを確認します。バージョンが変更されていることを確認します。

7.電源管理設定の更新

m5 インスタンスタイプ(Nitroシステム)で正常な OS のシャットダウンが可能になるように電源管理設定の更新をします。

※ 採用している対象EC2インスタンスのAMI が2018年 11月 28日より古いため実施しました。(左記日付以降に提供されるAMIは対応済とのことです。)

対象EC2インスタンスの PowerShell で以下のコマンドを実行します。

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

まとめ

当初、検証環境でAWS提供のオートメーションドキュメント(AWSSupport-UpgradeWindowsAWSDrivers)が比較的スムーズに実行できたため、 お客様環境でのオートメーションの採用に固執して、AWSサポートとのやり取りを含めて本質的でない部分(オートメーションの実行)に時間をとられた感があります。

ENAドライバのバージョンアップにあたっては、インターネットに接続できない前提であっても、EC2サービスへのエンドポイントの設定は必要となり、 プライベートサブネットを全く外部に接続しないで実施することはできませんでした。

この私の経験が、他の方のお役に立てれば幸いです。

参考文献

[1]: AWSドキュメント『最新世代のインスタンスタイプへの移行』
[2]:AWSドキュメント (代替案) AWS Systems Manager を使用した AWS PV、ENA、NVMeドライバのアップグレード

お問い合わせ先

執筆者プロフィール

Kishikawa Tetsu
Kishikawa Tetsutdi 東日本産業システム部
入社34年、コンピュータはUNIXから始めました。開発言語のmother tongueは、C言語です。
AWSを採用しているお客様のインフラ保守として約3年が経ちました。
AWSの全貌が未だ見えず日々苦闘しています。
Pocket

関連記事