Amazon web services 如何使用Get-SSMPareterList CmdLet处理具有特定前缀的参数
我想编写一个Powershell脚本,从AWS SSM参数存储中获取属于我的应用程序的所有参数,然后迭代这些参数并对每个参数执行操作。我的应用程序的参数通过具有特定前缀来标识,例如,它们被命名为:Amazon web services 如何使用Get-SSMPareterList CmdLet处理具有特定前缀的参数,amazon-web-services,powershell,aws-sdk,amazon-systems-manager,Amazon Web Services,Powershell,Aws Sdk,Amazon Systems Manager,我想编写一个Powershell脚本,从AWS SSM参数存储中获取属于我的应用程序的所有参数,然后迭代这些参数并对每个参数执行操作。我的应用程序的参数通过具有特定前缀来标识,例如,它们被命名为: /MyApp/Component1/Param1 /MyApp/Component1/Param2 /MyApp/Component2/Param1 ... 我是Powershell初学者,但我的出发点是使用AWS CmdLet,并按前缀/MyApp/过滤结果 我从链接的文档中看到,对Get SSM
/MyApp/Component1/Param1
/MyApp/Component1/Param2
/MyApp/Component2/Param1
...
我是Powershell初学者,但我的出发点是使用AWS CmdLet,并按前缀/MyApp/
过滤结果
我从链接的文档中看到,对Get SSMParameterList
的单个调用会以最大努力的方式返回结果,也就是说,我可能需要通过传递从上一次调用接收到的-NextToken
参数来重复调用它,以确保我获得所有结果。声明如果未指定-NextToken
和-MaxResult
则“绝大多数”AWS CmdLet会自动处理分页,但从文档中我不清楚此CmdLet是否包含在大多数中
我陷入了以下困境:
-ParameterFilter
参数使用什么语法来匹配前缀为/MyApp/
的所有参数-NextToken
来获得所有结果,或者,如果我确实需要,我想知道如何捕获API返回的NextToken
值,这样我就可以循环并获得下一页的结果[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.simplesystemmanagement.dll
程序集安装在哪里,以便使用Get-ssmpareterlist
CmdLet。我希望至少能够使用:
$p = New-SSMParameterFilter -Key "Name" -Option "BeginsWith" -Values "..."
Get-SSMParameterList -ParameterFilter $p
另一个似乎需要我加载AWSSDK.simplesystemmanagement.dll
程序集的SSM CmdLet是Add SSMResourceTag
,其-Tags
参数需要一个Amazon.simplesystemmanagement.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在聚会上很晚才返回“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>
或者,您可以使用获取SSMParametersByPath
Get-SSMParametersByPath -Path '/...myPrefix...'
正如报告中指出的:
DLL为我加载了AWSPowerShell模块
在Nick发布的示例中,它是通过上一次调用来加载的Get AWSPowerShellVersion
:事实上,它是在第一次调用任何AWS cmdlet时自动加载的(顺便说一句,加载最长需要30秒!!!)。我了解Amazon,但到目前为止我还没有看到这一点(特别是我目前使用的AMIs中没有,这意味着UserData脚本非常慢)
因此,我看到的不一致行为是因为Amazon.simplesystemmanagement.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之前可能不可用的自定义类型?我在Windows 10上使用Powershell 5.1.16299.492和AWSPowerShellVersion 3.3.283.0,如果没有显式加载程序集,仍然会出现以下错误:新建对象:找不到类型[Amazon.SimpleSystemsManagement.Model.ParameterStringFilter]:验证是否加载了包含此类型的程序集。