Amazon web services 如何使用Get-SSMPareterList CmdLet处理具有特定前缀的参数

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

我想编写一个Powershell脚本,从AWS 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
    值,这样我就可以循环并获得下一页的结果

  • 有人能帮忙吗

    更新

    对于第二点,我的经验表明我不需要使用-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.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]:验证是否加载了包含此类型的程序集。