2

我正在尝试使用 SSM 的GetParametersByPath API,但我得到了过时的结果,看起来像是按Path参数缓存约 3 秒。

我正在测试以下场景:

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

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

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

正确行为场景一:

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

正确行为场景二:

  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. 那么这种行为是否被认为是正确的?这是否意味着我无法以可靠的方式通过路径获取所有参数?

4

1 回答 1

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"

所以它似乎有效,但并不像人们预期的那样。

于 2020-05-07T11:49:22.907 回答