AWS Developer Blog

Preview of AWS Tools for PowerShell v4 features

In August, the AWS .NET Team released the first preview of AWS.Tools: the modular version of AWS Tools for PowerShell. As we are close to declaring AWS.Tools ready for production use, we can now announce that the generally available version of AWS.Tools will be part of a major version update of AWS Tools for PowerShell (version 4.0).

We have included a preview of the new v4 features in today’s AWS.Tools prerelease (version 3.3.618). So, if you are already testing the new modular version of AWS Tools for PowerShell, you can try out the new features as well. When v4 is released, most new features will be available to users of the AWSPowerShell and AWSPowerShell.NetCore modules as well.

AWS Tools for PowerShell version 4.0 will be a highly backwards compatible update to AWS Tools for PowerShell 3.3. This new major version includes some significant improvements while maintaining existing cmdlet behavior. Your scripts should still work when upgrading to the new version but we recommend testing them thoroughly before upgrading production environments.

AWS Tools for PowerShell is available in three different variants:

  • AWS.Tools is the new modular variant which allow faster import times and a smaller footprint. AWS.Tools is compatible with both PowerShell Core 6+ and Windows PowerShell 5.1 when .NET Framework 4.7.2 is installed. Starting with version 4.0 of AWS Tools for PowerShell, we suggest all users use AWS.Tools as their preferred option.
  • AWSPowerShell.NetCore is the monolithic variant that supports all AWS services in a single large module. AWSPowerShell.NetCore is also compatible with both PowerShell Core 6+ and Windows PowerShell 3+ when .NET Framework 4.7.2 is installed.
  • AWSPowerShell is a legacy variant for older systems which are either running Windows PowerShell 2 or cannot be updated to .NET Framework 4.7.2. Following the end of support of Windows Server 2008 R2, in 2020, we plan to stop releasing new AWSPowerShell versions compatible with Windows PowerShell 2.

The following are the most significant changes in version 4.0 of AWS Tools for PowerShell.

Select Parameter

Most cmdlets in version 4.0 have a new parameter: -Select. Select can be used to change the value returned by the cmdlet.
For example the service API used by Get-S3Object returns a ListObjectsResponse object but the cmdlet is configured to return only the S3Objects field. Resulting in:

PS> Get-S3Object -BucketName mybucket

ETag : "01234567890123456789012345678901234"
BucketName : mybucket
Key : file1.txt
LastModified : 9/30/2019 1:31:40 PM
Owner : Amazon.S3.Model.Owner
Size : 568
StorageClass : STANDARD

ETag : "01234567890123456789012345678901235"
BucketName : mybucket
Key : file2.txt
LastModified : 7/15/2019 9:36:54 AM
Owner : Amazon.S3.Model.Owner
Size : 392
StorageClass : STANDARD

Sometimes the service response contains additional data and metadata that might be of interest. Now you can specify -Select * to receive the full API response.

PS> Get-S3Object -BucketName mybucket -Select *

IsTruncated : False
NextMarker :
S3Objects : {file1.txt, file2.txt}
Name : mybucket
Prefix :
MaxKeys : 1000
CommonPrefixes : {}
Delimiter :

You can also specify the path to a nested result property like -Select S3Objects.Key.

PS> Get-S3Object -BucketName mybucket -Select S3Objects.Key
file1.txt
file2.txt

In certain situations it may be useful to return a cmdlet parameter. This can be achieved with -Select ^ParameterName. This feature supplants the -PassThru parameter which is still available but deprecated.

PS> Get-S3Object -BucketName mybucket -Select S3Objects.Key |
>>  Write-S3ObjectTagSet -Select ^Key -BucketName mybucket -Tagging_TagSet @{ Key='key'; Value='value'}
file1.txt
file2.txt

Simplified auto-iteration

AWS Tools for PowerShell support auto-pagination. Cmdlets like Get-S3Object will internally use multiple service calls, if necessary, in order to retrieve all the values.
The AWSPowerShell.NetCore and AWSPowerShell modules have special behavior that allows use of the -MaxItems parameter to limit the number of returned items. This behavior is now considered obsolete and is not available in AWS.Tools. You can instead pipe the output of the cmdlet into | select -first $n.

PS> Get-S3Object -BucketName mybucket -MaxItems 1 -Select S3Objects.Key
WARNING: AWSPowerShell and AWSPowerShell.NetCore use the MaxKey parameter to limit the total
number of items returned by the cmdlet. This behavior is obsolete and will be removed in a
future version of these modules. Pipe the output of this cmdlet into Select-Object -First to
terminate retrieving data pages early and control the number of items returned. AWS.Tools
already implements the new behavior of simply passing MaxKey to the service to specify how
many items should be returned by each service call.
file1.txt
PS> Get-S3Object -BucketName mybucket -Select S3Objects.Key | select -first 1
file1.txt

There are multiple reasons for this change:

  • This functionality is not guaranteed directly by the services, so it is not always possible to return the exact number of items requested.
  • Not all services allow small values for MaxItems, so requesting just 1 or 2 items frequently results in an error.
  • Not all paginated service operations have a MaxItems parameter.
  • The usage of -MaxItems and -Select together can be confusing.

Leveraging the new -Select parameter and this simplified pagination approach, we were able to enable auto-pagination for an additional 70 cmdlets in AWS.Tools.

Auto-paginated cmdlets also have a new -NoAutoPagination parameter which provides an explicit way to disable auto-pagination.

Easier to use Stream parameters

Parameters of type Stream or byte[] can now accept string, string[] or FileInfo values.
For example, you can use any of the following:

PS> Invoke-LMFunction -FunctionName MyTestFunction -PayloadStream '{
>>    "some": "json"
>>  }'

PS> Invoke-LMFunction -FunctionName MyTestFunction -PayloadStream (ls .\file.json)

PS> Invoke-LMFunction -FunctionName MyTestFunction -PayloadStream @('{', '"some": "json"', '}')

All strings are converted to byte[] using UTF8 encoding.

Conclusion

You can find more detailed information about AWS Tools for PowerShell version 4 features on the GitHub announcement.

As always, all modules are available on PowerShell Gallery. If you experience any issue with the new preview modules or you have any feedback, let us know on our GitHub issues repository.