Как использовать 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 в это большинство.
Я застрял на следующем:
Я не знаю, какой синтаксис использовать для
-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
Командлет. Я бы ожидал, как минимум, чтобы иметь возможность использовать:
$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 ...
По-прежнему возникает вопрос: почему командлет принимает параметр, являющийся настраиваемым типом, который может быть недоступен до вызова командлета?