TL;DR
- AWS-Cli経由で稼働中インスタンスIPとName属性を取得し、hosts登録するWindows用のPowershellスクリプトです。
- 環境によってはうまく動作しない可能性もあり、自己責任でご利用ください。
- 修正点あればご教示いただけると嬉しいです。
スクリプト
# AWS-cliから稼働中EC2インスタンスのIPを取得。TagのName属性をホスト名としてWindows上のhostsに登録するPowershellスクリプト。
# AWS-cliにアクセスキー設定されており、AWSリソースの設定が可能であることが前提。
# hostsファイルの各行内でホスト名の文字列に重複がないことが前提。(ex. myec21,myec22というName属性を持つ2インスタンスが存在する場合、文字列としてmyec2が重複しておりNG)
# エラー発生時は処理中断。
$ErrorActionPreference = "Stop"
# 初期値
$HostsFileFullPath = "C:\Windows\System32\drivers\etc\hosts"
$PreparetionHostsFileFullPath = "C:\Users\$Env:USERNAME\Desktop\hosts-changed-result.txt"
$SignOfEOL = "`r"
# 管理者権限がなければ、自らを管理者権限で呼び出して実行。
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) {
Start-Process powershell.exe "-File $PSCommandPath" -Verb RunAs
Exit
}
$HostsContents = (Get-Content $HostsFileFullPath)
#VSCode上でソース整形時(Shift+Alt+F)、Values=runningの前に空白挿入されエラーとなることから文字列としてコマンドを定義し実行。
$InstanceInfo = (Invoke-Expression "((aws ec2 describe-instances --filters Name=instance-state-name,Values=running | convertfrom-json).Reservations.Instances)")
# hostsファイルの内容を稼働中インスタンス数を評価。(稼働中インスタンスが存在しなければ予め読込済のhosts内容をそのまま出力)
foreach ($Instance in $InstanceInfo) {
$updatedFlag = $false
$outputHostsLines = $null
$InstanceName = ($Instance.Tags | Where-Object { $_.Key -eq "Name" }).Value
# Name属性が存在しなければ次インスタンスに処理を移す
if ([string]::IsNullOrEmpty($InstanceName)) {
continue
}
# hostsファイルを1行づつチェック
foreach ($inputhostsLine in $HostsContents) {
# コメント行以外で既に同一ホスト名が存在する場合は上書き。
if (($inputHostsLine.contains($InstanceName)) -and (!($inputHostsLine.substring(0, 1).contains("#")))) {
$outputHostsLines += ($Instance.PublicIpAddress + ' ' + $InstanceName + $SignOfEOL)
$updatedFlag = $true
Write-Host "Updated:${InstanceName}"
}
else {
# 存在しなかったら元の内容とする。
$outputHostsLines += ($inputHostsLine) + $SignOfEOL
}
}
# 全行チェックして同一ホスト名が存在しない場合は新規追加。
if (!$updatedFlag) {
Write-Host "Added:${InstanceName}"
$outputHostsLines += ($Instance.PublicIpAddress + ' ' + $InstanceName + $SignOfEOL)
}
# 次のインスタンス情報の処理に備え、hosts内容を上書。
# splitしていないと1行づつ分割して取り出せないので注意。
$HostsContents = $outputHostsLines.split($SignOfEOL)
# 最後配列に空行が入るので除外(最終配列添字となる$HostsContents.Length-1を含めない)
$HostsContents = $HostsContents[0..($HostsContents.Length - 2)]
}
#過去分をバックアップ(削除は行わないため適宜手動メンテナンス要)
Copy-Item -Path $HostsFileFullPath -Destination ($HostsFileFullPath + "." + (Get-Date).ToString('yyyyMMddHHmmss') + ".txt") | Out-Null
#上書用ファイルをデスクトップ出力(確認も兼ねる)
Set-Content -Path $PreparetionHostsFileFullPath -Value $HostsContents -Force
#hostsファイルの書き換え(直接Set-Contentで書いてしまうとタイミングイシューで空ファイルになるときがある)
Copy-Item $PreparetionHostsFileFullPath -Destination $HostsFileFullPath -Force | Out-Null
Read-Host "Finished. Please Enter Key..." | Out-Null