AWS Systems Manager`GetParametersByPath` API返回过时的结果

时间:2019-09-18 16:28:58

标签: amazon-web-services aws-sdk boto3 aws-ssm aws-parameter-store

我正在尝试利用SSM的GetParametersByPath API,并且得到的结果已经过时,看起来好像是通过Path参数进行缓存的时间大约为3秒。

我正在测试以下情况:

  1. 通过路径递归获取参数
  2. 在测试路径下放置一个参数
  3. 使用与(1)中相同的参数再次按路径获取参数

无论步骤(2)的变化如何,我在步骤(3)中得到的响应都与步骤(1)中的响应相同。

我认为这与缓存有关,因为以下两种情况按预期工作。

正确的行为场景1:

  1. 通过路径递归获取参数
  2. 在测试路径下放置一个参数
  3. 睡眠3秒
  4. 使用与(1)中相同的参数再次按路径获取参数

正确的行为场景2:

  1. 在测试路径下放置一个参数
  2. 通过路径递归获取参数

在我尝试过的不同SDK中,此行为是一致的:.Net,Python(boto3)和CLI,因此这不是SKD问题。

这是 Python 中带有 boto3 的代码段,可复制错误的行为:

import boto3

client = boto3.client('ssm')

first = client.get_parameters_by_path(
    Path='/param-store-test/1',
    Recursive=True,
    WithDecryption=True,
    MaxResults=10)

print(first['Parameters'][0]['Version'] if first['Parameters'] else None)

put_response = client.put_parameter(
    Name='/param-store-test/1/2',
    Value='test',
    Type='SecureString',
    KeyId='alias/aws/ssm',
    Overwrite=True,
    Tier='Standard')

print("v{}".format(put_response['Version']))

second = client.get_parameters_by_path(
    Path='/param-store-test/1',
    Recursive=True,
    WithDecryption=True,
    MaxResults=10)

print(second['Parameters'][0]['Version'] if second['Parameters'] else None)

此代码在首次运行时会为我提供以下输出:

None
v1
None

第二次运行时:

1
v2
1

您可以看到模式-第一个请求正在缓存。

根据API文档:Request results are returned on a best-effort basis. 那么,这种行为被认为是正确的吗? 这是否意味着我没有办法以可靠的方式按路径获取所有参数?

1 个答案:

答案 0 :(得分:0)

我注意到get_parameters_by_path()不能按预期工作。

您可能会认为(简化代码):

put_parameter('/abc/def', "123")
get_parameters_by_path('/abc/def')

将返回“ 123”,而似乎不返回[]。

但是

get_parameter('/abc/def')

正确返回“ 123”。

也是

get_parameters_by_path('/abc')

将返回'/ abc / def'=>“ 123”

因此,它似乎可行,但并不像人们期望的那样。