如何使用 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 包含在大多数中,我从文档中不清楚.
我卡在了以下内容上:
我不知道 -ParameterFilter
参数使用什么语法来匹配前缀为 /MyApp/
的所有参数
我想确认我不需要使用 -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 之前可能不可用?
我想编写一个 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 包含在大多数中,我从文档中不清楚.
我卡在了以下内容上:
我不知道
-ParameterFilter
参数使用什么语法来匹配前缀为/MyApp/
的所有参数
我想确认我不需要使用
-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 之前可能不可用?