Functions/AWS/New-EC2PSSession.ps1
<# .SYNOPSIS Opens a PSSession to an Ec2 instance with Administrator credentials .DESCRIPTION The cmdlet accepts pipeline input of EC2 instances and requires a private-key file to decrypt and logon with the administrator credentials. .PARAMETER InstanceId Mandatory - EC2 Instance Id for the target machine .PARAMETER Region Mandatory - Region parameter for the EC2 Instance if -InstanceID is specified. .PARAMETER Reservation Accepts an EC2 Reservation pipeline input from Get-Ec2Instance output. .PARAMETER Instance Accepts an Amazon EC2 Instance object from the pipeline .PARAMETER PemFile Mandatory - Path to the PrivateKey file to decrypt .PARAMETER AddressProperty Optional - String to try to use a specific private or public address .EXAMPLE New-EC2PSSession -Verbose -InstanceId i-2492acfc -Region us-west-2 -PemFile '~/ssh/dev.pem' .EXAMPLE Get-Ec2Instance i-ade67df | New-EC2PSSession -PemFile '~/ssh/dev.pem' #> function New-EC2PSSession { [CmdletBinding(DefaultParameterSetName='ByInstanceId')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions","")] param( [Parameter(Mandatory=$true,ParameterSetName="ByInstanceId")] [string[]]$InstanceId, [Parameter(Mandatory=$true,ParameterSetName="ByInstanceId")] [string]$Region, [Parameter(Mandatory=$true,ParameterSetName="ByReservationObject", ValueFromPipeline=$true)] [Amazon.EC2.Model.Reservation]$Reservation, [Parameter(Mandatory=$true,ParameterSetName="ByInstanceObject", ValueFromPipeline=$true)] [Amazon.EC2.Model.Instance[]]$Instance, [Parameter()] [ValidateNotNullOrEmpty()] [string]$PemFile=$script:DefaultEc2PemFile, [Parameter()] [ValidateSet($null, 'PrivateIpAddress','PublicIpAddress','PrivateDnsName','PublicDnsName')] [string]$AddressProperty #Authentication Mechanism #[System.Management.Automation.Runspaces.AuthenticationMechanism]$Authentication ) Begin { Test-EC2PemFile -PemFile $PemFile -ErrorAction Stop | Out-Null } Process { if ($InstanceId) { $Reservation = Get-EC2Instance -Instance $InstanceId -Region $Region } if ($Reservation) { $Instance = $Reservation.Instances } foreach ($i in $Instance) { Write-Verbose "Fetching credentials for $($i.InstanceId)" $credential = $i | Get-EC2Credential -PemFile $PemFile if ($credential) { foreach ($address in ($i | Get-EC2InstanceAddress -AddressProperty $AddressProperty | Select-Object -Unique)) { if (!$address) { continue } try { Write-Verbose "Trying to connect to address '$address'.." $session = $null $session = New-PSSession -ComputerName $address -Credential $credential if ($session) { Write-Verbose "Session established on '$address'.." return $session } } catch { Write-Error $_ } } } else { Write-Warning "Credential cannot be fetched. Make sure you pass valid key for '$($i.KeyName)'" } } } } |