LoginSignup
0
0

EC2タグのName属性をホスト名にhosts登録するPowershellスクリプト

Posted at

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0