2

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

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

我是 Powershell 初学者,但我的出发点是使用 AWS Get-SSMParameterList CmdLet,并按前缀过滤结果/MyApp/

我从链接的文档中看到,一次调用会Get-SSMParameterList尽最大努力返回结果,即我可能需要重复调​​用它并传递-NextToken从先前调用中接收到的参数,以保证我得到所有结果。 这个对相关问题的回答指出,如果没有指定,AWS CmdLets 的“绝大多数”会自动处理分页-NextToken-MaxResult但是从文档中我不清楚这个 CmdLet 是否包含在这个大多数中。

我坚持以下几点:

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

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

有人能帮忙吗?

更新

对于第 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-SSMParameterListCmdLet。我希望至少能够使用:

$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参数不采用 Hashtable 之类的Add-SQSResourceTag

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

我是否理解这一点,或者有没有办法在不加载程序集的情况下做到这一点?

4

3 回答 3

3

关于您关于显式加载 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返回“版本 3.3.215.0”

于 2018-11-15T16:49:27.867 回答
1

在这里聚会迟到了,但像 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...'
于 2018-11-26T22:48:21.000 回答
1

正如尼克考克斯的回答中指出的那样:

DLL 为我加载了 AWSPowerShell 模块

在 Nick 发布的示例中,它是由先前的调用加载的Get-AWSPowerShellVersion:事实上,它是在第一次调用任何 AWS cmdlet 时自动加载的(顺便说一句,加载最多需要 30 秒!!!)。我了解亚马逊正在研究加载时间,但到目前为止我还没有看到这一点(特别是它不在我当前使用的 AMI 中,这意味着 UserData 脚本非常慢)。

因此,我看到的不一致行为是因为Amazon.SimpleSystemsManagement.Model.ParameterStringFilterType 的可用性取决于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 之前可能不可用的自定义类型的参数?

于 2020-07-01T20:29:56.013 回答