Objective
I regularly have to run POCs or tests, on somewhat complex environments involving 10+ machines. Since I am a cost-conscious person, I will normally start the environment, do my testing/work, and then stop it at the end. All good with this, except that:
- Logging in to AWS console, switching profiles, switching zones takes a good 2-3 minutes
- Finding the the instances I need, starting them, takes another 30 seconds
- Updating all links to my test instances in Remote Desktop Manager (which I use) takes another good 5 minutes (remember we're talking 10 instances).
The script below will:
- Find all instances that use a given AWS Security Group
- Start all those instances
- Modify my Remote Desktop Manager xml file that contains the links to the VMs
Hope this helps anyone out there.
I promise I'll figure out code highlighting on this blog another day.
# Get list of instances # Important Variables $groupName = "NHS-ALL-LOCAL" #Name of security group to search for in instances $rdgFilePath = "C:\Users\Nuno\OneDrive\Documents\NHS.rdg" #Path to RD Manager group file with links to Machines/RDP $instanceStartWaitTime = 20 # Time in seconds to wait for EC2 instances to start function GetName($instance) { foreach ($tag in $instance.Tags) { if ($tag.Key -eq "Name") {return $tag.Value} return $null } } function GetAllInstances() { $allAWSInstances = aws ec2 describe-instances | ConvertFrom-Json $instances = @{} foreach ($instance in $allAWSInstances.Reservations.Instances) { foreach ($group in $instance.SecurityGroups) { if ($group.GroupName -eq $groupName) { $nameTag = GetName($instance) $instances.Add($nameTag, $instance) } } } return $instances } function GetInstanceIds($instances) { $listInstances = @() foreach ($instance in $instances.GetEnumerator()) { $listInstances += $instance.Value.InstanceId } return $listInstances } $instances = GetAllInstances Write-Host "Found the following Instances:" foreach ($instance in $instances.GetEnumerator()) { Write-Host $instance.Name " - " $instance.Value.InstanceId } # Start all instances $list = GetInstanceIds($instances) Write-Host "Starting all instances with security group $groupName..." aws ec2 start-instances --instance-ids $list Write-Host "Waiting $instanceStartWaitTime seconds" for($i=1; $i -le $instanceStartWaitTime; $i++) { $timeRemaining = $instanceStartWaitTime - $i Write-Progress -Activity "Waiting $timeRemaining seconds" -PercentComplete (($i/$instanceStartWaitTime)*100) Start-Sleep -Seconds 1 } $instances = GetAllInstances # Should be updated now. foreach ($instance in $instances.GetEnumerator()) { Write-Host $instance.Value.InstanceId is now $instance.Value.State.Name } # Modify C:\Users\Nuno\OneDrive\Documents\NHS.rdg to place all the right URLs [xml]$rdg = Get-Content -Path $rdgFilePath foreach ($instance in $instances.GetEnumerator()) { $instanceName = $instance.Key $publicUrl = $instance.Value.PublicDnsName foreach ($server in $rdg.RDCMan.file.server.properties) { if ($server.displayName -eq $instanceName) { Write-Host "Updating Node: $instanceName with Url $publicUrl" $server.name = $publicUrl } } } $rdg.Save($rdgFilePath)
2 comments:
Welcome back. :-)
Post a Comment