EC2コンソールでNameタグを設定しても、OS起動してホスト名を変更にしないとサーバのホスト名はEC2のデフォルト値になってしまいます。都度サーバを立てるたびに変更するのは面倒なので、Nameタグ=サーバーホスト名になる起動テンプレートを作成してみます。ちょっとしたAD設定の検証などでWindowsの方が使うことは多いかもしれませんね。
今回のゴール
起動テンプレートを利用して、以下環境が設定済み状態でEC2起動を起動できるようにする
AWS環境
・指定VPC内の所定のサブネットにデプロイ
・グローバル(パブリック)IPを付与
・指定AMI(Windows Server2019 JPN)を利用
・インスタンスタイプをスポットインスタンスに指定
OS環境
・ホスト名をNameタグに設定した内容に変更する
・タイムゾーン、言語を日本仕様に設定
・"administrator"ユーザのパスワードを指定したものに設定
作業の流れ
①VPCとサブネットおよびセキュリティグループを作成
②起動テンプレートを作成
③EC2の起動・デプロイ
④設定の確認
実際の設定
まず①ですが、この作業は各所に詳しい記事がありますので、本記事では割愛します。一般的にEC2をデプロイして、SSHで接続できる環境であれば問題ありません。起動テンプレートの設定もこの記事(https://qiita.com/u-bayashi/items/a5ab6c7e045cad0f5948) とほぼ同じ設定でOKです。
一部違うところがあるので、以下のようにしてください。
■AMIを選択する際に、「クイックスタート」の「Windows」を選択するとOSが英語版になるので、「その他AMI」から日本語版を選択してください。
■「メタデータのタグを許可する」を有効化してください。なんとなく分かりにくい表現ですがEC2からタグデータ参照する許可を設定しています。
■「ユーザデータ」のところに以下のスクリプトを記述してください。先頭と最後にスクリプトがpowershellであると宣言を入れるのを忘れずに。
記載するスクリプト内容は以下になります。
<powershell>
#administratorのパスワード変更
net user "administrator" "XXXXXX(administratorのパスワード)"
#タイムゾーンを日本時間の設定
Set-TimeZone -id "Tokyo Standard Time"
#ロケーションを日本に設定
Set-WinHomeLocation -GeoId 122
#インスタンスメタデータを使って「タグ」の設定値を参照する
$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
#インスタンスメタデータを使って「タグ」の設定値を参照し、変数(compname)に設定する
$compname = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/tags/instance/Name
#ホスト名を変更(強制)
Rename-Computer -NewName $compname -Force
#再起動
Restart-Computer
</powershell>
最後の④ですが「テンプレートから起動」でEC2を起動させればOKです。通常ならリモートログインする初期パスワードは秘密鍵を複合しないといけなかったですがスクリプト内でadministratorのパスワードを変更しているので、秘密鍵の複合なして、指定パスワードでログインできます。
ついでに初期起動時にGoogle chromeもインストールしておきたい場合は上記スクリプトの中に以下を追記してください。
$Path = $env:TEMP; $Installer = "chrome_installer.exe"; Invoke-WebRequest "https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26browser%3D0%26usagestats%3D1%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26brand%3DGTPM/update2/installers/ChromeSetup.exe" -OutFile $Path\$Installer; Start-Process -FilePath $Path\$Installer -Args "/silent /install" -Verb RunAs -Wait; Remove-Item $Path\$Installer
おわりに
自動化、テンプレート化の大切さが身にしみる(笑)不慣れな人でも一発で環境を作れるのは素晴らしいd(`・ω・’)
参考にしたページ
[アップデート] EC2のインスタンスメタデータから「タグ」の設定値を参照できるようになりました!
【PowerShell】10秒で終わるWindowsの地域やタイムゾーンの設定変更
コマンドでWindowsにChromeをインストールする