EC2のWindowsインスタンスの起動時にElastic IPアドレスを設定する

EC2で起動中のインスタンスに割り当てられるパブリックIPアドレスは、起動するたびに異なります。IPアドレスを固定するためにはElastic IPアドレスという機能で固定のパブリックIPアドレスを取得し、インスタンスにそのIPアドレスを設定します。また、IPアドレスの設定はインスタンスが停止すると解除されるため、インスタンスの起動時にそのIPアドレスを設定する必要があります。Windowsインスタンスで起動時にIPアドレスを設定する方法について書いておきたいと思います。

ただし、Elastic IPアドレスは、取得したIPアドレスを設定したインスタンスの起動中には料金は発生しませんが、使用していないIPアドレスには$0.01/時間の料金がかかります。常時起動しているインスタンスでは全く費用はかかりませんが、そうでない場合には、Route53を使って起動時に動的に設定されたIPアドレスDNSに登録する方がよいかもしれません。

EC2 API ToolkitからIPアドレスの設定はec2-associate-addressコマンドを実行します。

> ec2-associate-address -i i-XXXXXXXX 175.41.249.XXX
ADDRESS 175.41.249.XXX i-XXXXXXXX

このコマンドは複数回実行してもエラーは発生しませんが、すでに他にインスタンスに設定されているIPアドレスを指定した場合には、後から設定したインスタンスに指定したIPアドレスが割り当てられるので、注意が必要です。

次にWindows起動時にIPアドレスを設定する手順について説明します。今回はPowershellを使います。以下についてはあらかじめインストールしておきます。

Powershellスクリプトファイルを実行するために、実行ポリシーを変更します。Powershellを起動してSet-ExecutionPolicyコマンドを実行します。

PS C:\Users\Administrator> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピックで説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):Y

Get-ExecutionPolicyコマンドでポリシーが変更されていることを確認します。

PS C:\Users\Administrator> Get-ExecutionPolicy
RemoteSigned

以下のPowershellスクリプトをファイルに保存します。

# 設定するIPアドレス
$ip = "175.41.249.XXX"

# 自分のインスタンスIDを取得する
$webclient = New-Object System.Net.WebClient
$myinstance = $webclient.DownloadString("http://169.254.169.254/latest/meta-data/instance-id")

# IPアドレスの設定
ec2-associate-address -i $myinstance $ip 

EC2インスタンスからhttp://169.254.169.254/latest/meta-data/ にアクセスすると、そのインスタンスメタデータを取得することができます。このスクリプトではインスタンスIDを取得するのに使用しています(Using Instance Metadata)。
このスクリプトをタスクスケジューラを使ってWindowsの起動時に実行します。

なぜかコマンドに直接Powershellを指定すると正しく実行されなかったので、以下のようなバッチファイルを指定しています。

powershell -File associate-ip.ps1