如何使用 Get-SSMParameterList CmdLet 处理具有特定前缀的参数

How to use Get-SSMParameterList CmdLet to process parameters with a specific prefix

我想编写一个 Powershell 脚本,它将从属于我的应用程序的 AWS SSM 参数存储中获取所有参数,然后遍历这些参数并对每个参数执行一个操作。我的应用程序的参数通过具有特定前缀来标识,例如他们被命名为:

/MyApp/Component1/Param1
/MyApp/Component1/Param2
/MyApp/Component2/Param1
...

我是 Powershell 初学者,但我的起点是使用 AWS Get-SSMParameterList CmdLet,并按前缀 /MyApp/.

过滤结果

我从链接的文档中看到,对 Get-SSMParameterList returns 的一次调用会在尽力而为的基础上产生结果,即我可能需要通过 -NextToken 重复调用它从上一次调用中收到的参数,以保证我得到所有结果。 This answer to a related question 声明如果 -NextToken-MaxResult 未指定,AWS CmdLets 的 "the vast majority" 会自动处理分页,但如果这个 CmdLet 包含在大多数中,我从文档中不清楚.

我卡在了以下内容上:

  1. 我不知道 -ParameterFilter 参数使用什么语法来匹配前缀为 /MyApp/

  2. 的所有参数
  3. 我想确认我不需要使用 -NextToken 来获得所有结果,或者,如果我确实需要它,我想知道如何捕获 NextToken 由 API 返回的值,因此我可以循环并获取下一页结果。

有人可以帮忙吗?

更新

对于第 2 点,我的经验表明我不需要使用 -NextToken 并且迄今为止总是在一次调用中获得所有结果。但我猜这可能取决于结果集中参数的数量。

对于第 1 点,我找到了一种方法,即:

[System.Reflection.Assembly]::LoadFile(
    "...\AWSSDK.SimpleSystemsManagement.dll")

...
$p = New-Object Amazon.SimpleSystemsManagement.Model.ParameterStringFilter
$p.Key = "Name"
$p.Option = "BeginsWith"
$p.Values = "/...my prefix..."

Get-SSMParameterList -ParameterFilter $p ...

但这看起来很难看,因为它要求我知道 AWSSDK.SimpleSystemsManagement.dll 程序集的安装位置才能使用 Get-SSMParameterList CmdLet。我希望至少能够使用:

$p = New-SSMParameterFilter -Key "Name" -Option "BeginsWith" -Values "..."
Get-SSMParameterList -ParameterFilter $p

另一个似乎需要我加载 AWSSDK.SimpleSystemsManagement.dll 程序集的 SSM CmdLet 是 Add-SSMResourceTag,其 -Tags 参数需要一个 Amazon.SimpleSystemsManagement.Model.Tag 对象数组:

$tag = New-Object Amazon.SimpleSystemsManagement.Model.Tag
$tag.Key = ...
$tag.Value = ...
Add-SSMResourceTag -Tags ($tag)

为什么 -Tags 参数不像 Add-SQSResourceTag 那样采用哈希表?

$tags = @{}
$tags.add(key, value)
Add-SQSResourceTag -Tags $tags

我理解的对吗?有没有不加载程序集的方法?

关于您关于显式加载 DLL 的问题,我发现以下代码对我来说不是必需的:

$p = new-object -typename Amazon.SimpleSystemsManagement.Model.ParameterStringFilter -property @{key="Name";Option="BeginsWith";Values="sandbox"}
Get-SSMParameterList -ParameterFilter @($p)

这为我生成了正确的过滤结果。

请注意 -ParameterFilter 接受一个 ParameterStringFilter 数组。

我正在使用 powershell 版本 5.1.17134.228(如 $PSVERSIONTABLE 所示)和 Get-AWSPowerShellVersion returns "Version 3.3.215.0"

来晚了,但是,像 Greg 一样,DLL 为我加载了 AWSPowerShell 模块。

PS C:\Users\ncox> Get-AWSPowerShellVersion

AWS Tools for Windows PowerShell
Version 3.3.390.0
Copyright 2012-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.

Amazon Web Services SDK for .NET
Core Runtime Version 3.3.28.0
Copyright 2009-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.

...

PS C:\Users\ncox> [appdomain]::currentdomain.getassemblies() |? FullName -Like "AWSSDK.SimpleSystems*" | select fullname

FullName
--------
AWSSDK.SimpleSystemsManagement, Version=3.3.0.0, Culture=neutral, PublicKeyToken=885c28607f98e604

PS C:\Users\ncox> 

作为替代方案,也许您可​​以使用 Get-SSMParametersByPath?

Get-SSMParametersByPath -Path '/...myPrefix...'

正如中指出的:

the DLL is loaded with the AWSPowerShell module for me

在 Nick 发布的示例中,它是通过之前调用 Get-AWSPowerShellVersion 加载的:事实上,它是在第一次调用任何 AWS cmdlet 时自动加载的(顺便说一句,它最多需要 30加载秒!!!)。我知道 Amazon 是 working on the load time,但到目前为止我还没有看到它(特别是它不在我当前使用的 AMI 中,这意味着 UserData 脚本非常慢)。

所以我看到的不一致行为是因为 Amazon.SimpleSystemsManagement.Model.ParameterStringFilter 类型的可用性取决于之前是否加载了 AWSPowerShell 模块。如果我以前碰巧使用过 AWS cmdlet,它就可以工作;否则,它不会。

当然,解决方案是在引用任何类型之前明确确保它已加载:

Import-Module "AWSPowerShell" 
$p = New-Object Amazon.SimpleSystemsManagement.Model.ParameterStringFilter
$p.Key = "Name"
$p.Option = "BeginsWith"
$p.Values = "/...my prefix..."

Get-SSMParameterList -ParameterFilter $p ...

这仍然引出了一个问题:为什么 cmdlet 会采用自定义类型的参数,而该参数在调用 cmdlet 之前可能不可用?