【发布时间】:2020-07-02 15:30:08
【问题描述】:
我想编写一个 Powershell 脚本,该脚本将从属于我的应用程序的 AWS SSM 参数存储中获取所有参数,然后迭代参数并对每个参数执行操作。我的应用程序的参数通过具有特定前缀来标识,例如它们被命名为:
/MyApp/Component1/Param1
/MyApp/Component1/Param2
/MyApp/Component2/Param1
...
我是 Powershell 初学者,但我的出发点是使用 AWS Get-SSMParameterList CmdLet,并通过前缀 /MyApp/ 过滤结果。
我从链接的文档中看到,对Get-SSMParameterList 的一次调用会尽最大努力返回结果,即我可能需要重复调用它并传递从先前调用中收到的-NextToken 参数以保证我得到所有的结果。 This answer to a related question 表示,如果未指定 -NextToken 和 -MaxResult,则“绝大多数”AWS CmdLets 会自动处理分页,但我从文档中不清楚该 CmdLet 是否包含在大多数中。
我陷入了以下困境:
我不知道
-ParameterFilter参数使用什么语法来匹配前缀为/MyApp/的所有参数我想确认我不需要使用
-NextToken来获取所有结果,或者,如果我确实需要它,我想知道如何捕获 API 返回的NextToken值,所以我可以循环并获取下一页结果。
有人可以帮忙吗?
更新
对于第 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
我是否正确理解了这一点,或者有没有办法在不加载程序集的情况下做到这一点?
【问题讨论】:
标签: amazon-web-services powershell aws-sdk amazon-systems-manager