Python Boto3 使用 NextToken 通过路径从 SSM 获取参数

Posted

技术标签:

【中文标题】Python Boto3 使用 NextToken 通过路径从 SSM 获取参数【英文标题】:Python Boto3 Get Parameters from SSM by Path using NextToken 【发布时间】:2021-08-21 00:41:00 【问题描述】:

为了从 Parameter Store SSM 中收集一些值,我一直在使用 boto3,这是我使用的代码,非常简单:

def get_raw_parameters_group_by_namespace(namespace_path):
    raw_params_response = None

    try:
        if not namespace_path:
            raise Exception('Namespace path should be specified to get data')
        raw_params_response = ssm_ps.get_parameters_by_path(Path = namespace_path)
    except Exception as e:
        raise Exception('An error ocurred while trying to get parameters group: ' + str(e))

    return raw_params_response

我以前在 SSM 中有大约 7 到 10 个参数,并且该方法运行良好,但是,这些天我们需要添加一些额外的参数并且它们的数量增加到 14,所以我尝试在 boto3 ssm 中添加一个属性方法称为“MaxResults”并将其设置为 50:

ssm_ps.get_parameters_by_path(Path = namespace_path, MaxResults = 50)

但我得到以下信息:

"error": "An error ocurred while trying to get parameters group: An error occurred (ValidationException) when calling the GetParametersByPath operation: 1 validation error detected: Value '50' at 'maxResults' failed to satisfy constraint: Member must have value less than or equal to 10."

在与团队交谈后,增加帐户中的配额不是一个选项,所以我想知道使用"NextToken" 属性是否是一个不错的选择。

我不确定如何使用它,我已经搜索了示例,但找不到有用的东西。请问有人知道如何使用 NextToken 吗?或者一个关于它应该如何工作的例子?

我尝试了类似的方法:

raw_params_response = ssm_ps.get_parameters_by_path(Path = namespace_path, NextToken = 'Token')

但我不确定这个的用法。

提前致谢。

【问题讨论】:

【参考方案1】:

我记得在某个时候遇到过这种情况。

您想使用分页器 - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html#SSM.Paginator.GetParametersByPath

我是这样用的:

import boto3

client = boto3.client('ssm',region_name='eu-central-1')

paginator = client.get_paginator('get_parameters_by_path')

response_iterator = paginator.paginate(
    Path='/some/path'
)

parameters=[]

for page in response_iterator:
    for entry in page['Parameters']:
        parameters.append(entry)

您会在参数中获得类似["Name": "/some/path/param, "Value": "something"] 的列表,其中包含路径下的所有参数。

*edit:响应将比名称、值键更丰富。检查分页器文档!

【讨论】:

【参考方案2】:

让我建议使用这个库(我是作者):AWStanding

您可以轻松实现这一点,无需担心分页:

import os
from awstanding.parameter_store import load_path

load_path('/stripe', '/spotify')
STRIPE_PRICE = os.environ.get('STRIPE_PRICE', 'fallback_value')
STRIPE_WEBHOOK = os.environ.get('STRIPE_WEBHOOK', 'fallback_value')
SPOTIFY_API_KEY = os.environ.get('SPOTIFY_API_KEY', 'fallback_value')

print(f'price: STRIPE_PRICE, webhook: STRIPE_WEBHOOK, spotify: SPOTIFY_API_KEY')

>>> price: price_1xxxxxxxxxxxxxxxxxxxxxxx, webhook: fallback_value, spotify: fallback_value

【讨论】:

以上是关于Python Boto3 使用 NextToken 通过路径从 SSM 获取参数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用“nextToken”参数测试分页?

如何在 Python 中使用 boto3 模块检查 Redshift 的集群状态?

我想使用 python boto3 脚本将数据加载到 Amazon Redshift 集群中

python 使用Python和Boto3获取具有实例ID的实例标记信息

python 脚本使用boto3启动类似于给定实例的实例

Python使用boto3操作AWS S3中踩过的坑