I’m spending more, and more, time with AWS. As a PowerShell enthusiast, I’ve therefore kept myself busy during a few of the week and weekend evenings. And sometimes during the day, too, when it makes sense.
As of today, I’ve written four AWS-specific functions for work. It’s everything from comparing my version of the AWSPowerShell module with the one in the PowerShell Gallery, returning the AWS service noun prefixes (EC2, CFN, etc.), and returning the EC2 instance type counts, and then there’s the newest one.
My most recent function can create an RDP (.rdp
) file to connect to an EC2 instance (it gets the EC2’s IP address and places that in an RDP file). As I wrote up an email to share the function with a coworker—the one that mentioned Azure having an option to download RDP files—it occurred to me that none of my functions include an option to provide AccessKey and SecretKey parameters. All of them, that need it (two of them now), rely on persistent credentials having been saved.
Well, I’ll be going to go back through these two functions and add a way to accept an AccessKey and SecretKey parameter. First, however, was to figure out how. I literally typed “PowerShell add AccessKey and SecretKey to function” into Google (because I was being lazy,… and didn’t feel the need to write something that must surely be out there). Well, there wasn’t anything I could use, so I’ve done the work myself. Now, if anyone else types that, or something like that into Google or Bing, maybe they’ll get this answer.
Before I consider moving this to an existing function, I needed to make it work. I did just that, using parameter sets. I’ve long known about them, but haven’t really had a need for them in more than a few instances. This of course led me to view the parameter sets on an AWS cmdlet. Ugh, they aren’t even parameter sets on something like Get-EC2Instance
. Try it yourself: Show-Command -Name Get-EC2Instance
. I suspect there’s internal logic in the cmdlet itself to handle whether or not an AccessKey and SecretKey have been provided. Don’t have persistent, shell credentials: error*. Only provide an AccessKey: error*. Only provide a SecretKey: error*. Well, I went with parameter sets anyway.
* “No credentials specified or obtained from persisted/shell defaults.”
Here’s the complete function used to work through this desire. Take a look and continue reading about it further below.
Function Test-AWSParameterSets { [CmdletBinding(DefaultParameterSetName='NoAccessKeys')] Param( [Parameter(ParameterSetName='NoAccessKeys',Mandatory = $true)] [Parameter(ParameterSetName='AccessKeys',Mandatory=$true)] [String]$InstanceID, [Parameter(ParameterSetName='AccessKeys',Mandatory=$true)] [string]$AccessKey, [Parameter(ParameterSetName='AccessKeys',Mandatory=$true)] [string]$SecretKey ) $PSBoundParameters '-----------------------------------------' "InstanceID: $InstanceID" "AccessKey: $AccessKey" "SecretKey: $SecretKey" "ParameterSet: $($PSCmdlet.ParameterSetName)" }
In this first example, we’ll run the function without supplying any parameter names, or values. Because the InstanceID parameter is mandatory, and the NoAccessKeys
parameter set is the default, the PowerShell engine prompts me to enter a value for InstanceID. After I entered i-1234554321, the function returns the $PSBoundParameters
hash tables. This includes the parameter names and values that were supplied to the function at run time. Additionally, it returns the values for the InstanceID, AccessKey, SecretKey, and which of the two, parameter sets were used: NoAccessKeys
or AccessKeys
.
Test-AWSParameterSets
cmdlet Test-AWSParameterSets at command pipeline position 1 Supply values for the following parameters: InstanceID: i-1234554321 Key Value --- ----- InstanceID i-1234554321 ----------------------------------------- InstanceID: i-1234554321 AccessKey: SecretKey: ParameterSet: NoAccessKeys
The next example includes an InstanceID parameter when the function is invoked. Therefore, I’m not prompted to enter any additional information. It produces the same output as it did above.
Test-AWSParameterSets -InstanceID i-1234554321
Key Value --- ----- InstanceID i-1234554321 ----------------------------------------- InstanceID: i-1234554321 AccessKey: SecretKey: ParameterSet: NoAccessKeys
The below example includes both an InstanceID parameter and an AccessKey parameter when the function is invoked. The moment the AccessKey parameter name was included, we switched to using the AccessKeys
parameter set. Therefore, I was prompted to enter a SecretKey parameter value, as it’s a required parameter in that parameter set.
Test-AWSParameterSets -InstanceID i-1234554321 -AccessKey aacccceesssskkeeyy
cmdlet Test-AWSParameterSets at command pipeline position 1 Supply values for the following parameters: SecretKey: ssseeecccrrreeetttkkkeeeyyy Key Value --- ----- InstanceID i-1234554321 AccessKey aacccceesssskkeeyy SecretKey ssseeecccrrreeetttkkkeeeyyy ----------------------------------------- InstanceID: i-1234554321 AccessKey: aacccceesssskkeeyy SecretKey: ssseeecccrrreeetttkkkeeeyyy ParameterSet: AccessKeys
This is basically the opposite of the above example. I included the SecretKey parameter and it prompted me to enter the AccessKey parameter—we can’t have one without the other; they’re both mandatory in the AccessKeys
parameter set.
Test-AWSParameterSets -InstanceID i-1234554321 -SecretKey ssseeecccrrreeetttkkkeeeyyy
cmdlet Test-AWSParameterSets at command pipeline position 1 Supply values for the following parameters: AccessKey: aacccceesssskkeeyy Key Value --- ----- InstanceID i-1234554321 SecretKey ssseeecccrrreeetttkkkeeeyyy AccessKey aacccceesssskkeeyy ----------------------------------------- InstanceID: i-1234554321 AccessKey: aacccceesssskkeeyy SecretKey: ssseeecccrrreeetttkkkeeeyyy ParameterSet: AccessKeys
The final example includes values for all the parameter names at the time the function is invoked. If someone wasn’t using a persistent set of credentials, then this is how you might expect an AWS function you’ve written to be used.
Test-AWSParameterSets -InstanceID i-1234554321 -AccessKey aacccceesssskkeeyy -SecretKey ssseeecccrrreeetttkkkeeeyyy
Key Value --- ----- InstanceID i-1234554321 SecretKey ssseeecccrrreeetttkkkeeeyyy AccessKey aacccceesssskkeeyy ----------------------------------------- InstanceID: i-1234554321 AccessKey: aacccceesssskkeeyy SecretKey: ssseeecccrrreeetttkkkeeeyyy ParameterSet: AccessKeys
Well, that’s the first part of the challenge. Now to incorporate what I’ve done here, into the functions that need it. Maybe, I’ll be back with that.