Windows Server EC2インスタンスを別サブネットに移行する際に注意すべきこと

Windows Server 2016以降のはなしです。

一度作成したWindows Server EC2インスタンス対して、バックアップからのリストアやマシン移行などで別のサブネットに移動した場合、インスタンスメタデータを参照することができなくなります。
それによりCloudWatch Agentの起動に失敗するなどの副作用が出る場合があります。
(CloudWatch Agentは起動時にインスタンスメタデータを参照するため)

検証環境

例としてサブネット10.0.1.0/24で作成したWindows Server 2016 EC2インスタンスをAMIイメージを経由してサブネット10.0.2.0/24に移動する場合を考えます。

再現手順

最初にサブネット10.0.1.0/24にWindows Server 2016のEC2インスタンスを作成します。
今回の例ではserver01、IPアドレスは10.0.1.195が割り当てられました。

この状態では問題なくインスタンスメタデータにアクセスできます。

Invoke-RestMethod http://169.254.169.254/latest/meta-data/instance-type

このインスタンスをAMIイメージを経由してサブネット10.0.2.0/24に移動します。
(サブネットを移動する方法は何でも構いません)

移動後のIPアドレスは10.0.2.8が割り当てられました。

ここでインスタンスメタデータにアクセスしようとするとエラーとなります。

原因

原因はわかれば単純なのですが地味に厄介です。

Windows ServerのEC2インスタンスではインスタンスメタデータに対するルートが追加されています。
Windows Server 2012 R2まではEC2Configの機能によりインスタンスの起動時に都度ルートが設定されていたのですが、Windows Server 2016からはこの挙動が若干変わり、EC2Launchの機能によりインスタンスの作成時に1回だけ固定ルートを追加する様になっています。

サブネット10.0.2.0/24に移動したあとのサーバーでroute printコマンドを使いルート情報を確認すると以下の様に固定ルートが登録されており、インスタンスメタデータ(169.254.169.254)がサブネット10.0.1.0/24のゲートウェイ(10.0.1.1)に向いたままになってしまっています。

このためインスタンスメタデータにアクセスすることができなくなってしまいます。

対処方法

原因がわかれば対処方法は単純でルート情報を直してやれば良いだけです。

元々この固定ルートはEC2Launchの初期化処理で行われており、その実体はAdd-Routes関数が担っています。
サブネット移動後のインスタンスでもう一度このAdd-Routes関数を呼び出してやればルート情報は期待したものになります。

以下の様にEC2LaunchのモジュールをインポートしてAdd-Routesを呼び出してやればOKです。

Import-Module (Join-Path $env:ProgramData 'Amazon\EC2-Windows\Launch\Module\Ec2Launch.psd1')
Add-Routes

あらためてルート情報を見てやるとちゃんとルート情報が更新されています。

これでインスタンスメタデータにもアクセス可能です。

【補足】Windows Server 2012 R2以前の場合

補足としてWindows Server 2012 R2のルート情報を確認してみます。

固定ルートではなくアクティブルートにのみインスタンスメタデータへのルートが登録されていることがわかります。
このためルート情報は永続化されず今回の問題は起きません。

ちなみにこの機能は「EC2ConfigService Settings」のGUIには設定項目が無いのですが、config.xmlのグローバル設定ShouldAddRoutesに設定があり、既定で自動設定される様になっています。

上記ドキュメントに

複数の NIC がアタッチされているとき、プライマリネットワークアダプタにカスタムルートを追加して、IP アドレス 169.254.169.250、169.254.169.251、および 169.254.169.254 を有効にする。
これらのアドレスは Windows ライセンス認証が使用し、またユーザーがインスタンスのメタデータにアクセスする際にも使用します。

とある様に、もともとはEC2インスタンスに複数のNICがアタッチされた際に正しくインスタンスメタデータにアクセスできる様に追加された機能となります。

最後に

ざっとこんな感じです。
Windows Server EC2の管理ツールがEC2ConfigからEC2Launchに変わった際の微妙な仕様変更による影響ですが、地味に厄介な問題ですのでインスタンスのサブネットを移動する際は注意してください。