Как использовать Get-SSMParameterList CmdLet для обработки параметров с определенным префиксом

Я хочу написать скрипт 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 чтобы получить все результаты, или, если мне это нужно, знать, как захватить 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 Командлет. Я бы ожидал, как минимум, чтобы иметь возможность использовать:

$p = New-SSMParameterFilter -Key "Name" -Option "BeginsWith" -Values "..."
Get-SSMParameterList -ParameterFilter $p

Другой CmdLet SSM, который, кажется, требует, чтобы я загрузил AWSSDK.SimpleSystemsManagement.dll сборка 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

Правильно ли я понял это или есть способ сделать это без загрузки сборки?

2 ответа

Что касается вашего вопроса о явной загрузке 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"

Поздно здесь, но, как и Грег, 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...'

Как указано в ответе Ника Кокса:

DLL загружается с модулем AWSPowerShell для меня

В примере, опубликованном Ником, он был загружен предыдущим вызовом Get-AWSPowerShellVersion: фактически он автоматически загружается при первом вызове любого командлета AWS (и, кстати, загрузка занимает до 30 секунд!!!). Я понимаю, что Amazon работает над временем загрузки, но я пока этого не видел (в частности, этого нет в AMI, которые я сейчас использую, что означает, что сценарий UserData работает очень медленно).

Таким образом, непоследовательное поведение, которое я наблюдал, было связано с наличием или отсутствием Amazon.SimpleSystemsManagement.Model.ParameterStringFilter Тип зависел от того, был ли AWSPowerShellмодуль был ранее загружен. Если я раньше использовал командлет AWS, он работает; в противном случае - нет.

Решение, конечно, состоит в том, чтобы явно убедиться, что он загружен, прежде чем ссылаться на любой из его типов:

Import-Module "AWSPowerShell" 
$p = New-Object Amazon.SimpleSystemsManagement.Model.ParameterStringFilter
$p.Key = "Name"
$p.Option = "BeginsWith"
$p.Values = "/...my prefix..."

Get-SSMParameterList -ParameterFilter $p ...

По-прежнему возникает вопрос: почему командлет принимает параметр, являющийся настраиваемым типом, который может быть недоступен до вызова командлета?

Другие вопросы по тегам