【问题标题】:How to use Get-SSMParameterList CmdLet to process parameters with a specific prefix如何使用 Get-SSMParameterList CmdLet 处理带有特定前缀的参数
【发布时间】: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 是否包含在大多数中。

我陷入了以下困境:

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

  2. 我想确认我不需要使用 -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


    【解决方案1】:

    关于您关于显式加载 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”

    【讨论】:

    • 我在 Windows 10 上使用 Powershell 5.1.16299.492 和 AWSPowerShellVersion 3.3.283.0,如果我没有显式加载程序集,我仍然会收到以下错误:New-Object:找不到类型 [Amazon .SimpleSystemsManagement.Model.ParameterStringFilter]:验证是否加载了包含此类型的程序集。
    【解决方案2】:

    迟到了,但和 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...'
    

    【讨论】:

      【解决方案3】:

      正如the answer from Nick Cox中指出的:

      DLL 为我加载了 AWSPowerShell 模块

      在 Nick 发布的示例中,它是由之前对 Get-AWSPowerShellVersion 的调用加载的:实际上它是在第一次调用任何 AWS cmdlet 时自动加载的(顺便说一句,加载最多需要 30 秒! !!)。我知道亚马逊是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 之前可能不可用的自定义类型?

      【讨论】:

        猜你喜欢
        • 2014-05-24
        • 1970-01-01
        • 2016-09-13
        • 2014-11-26
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多