Node.js getParametersByPath页面大小

Node.js getParametersByPath页面大小,node.js,aws-sdk,aws-ssm,aws-parameter-store,Node.js,Aws Sdk,Aws Ssm,Aws Parameter Store,在AWS-SDK for Node.jsgetParametersByPath()SSM方法返回分页数据,这意味着我必须在一个循环中进行多次调用。是否有办法禁用分页或增加页面大小(超过10,这是MaxNumber参数的最大值) 或者,如果必须进行多次调用,是否可以将结果收集到一系列承诺中,以便立即解决 基本上,我们需要在Lambda启动时加载大约12个参数。当前获取参数大约需要2秒钟,因为连续进行了2次调用。理想情况下,它必须是一个或两个并行调用。这是一个好问题。让我概述一些概念、AWS设计决策

在AWS-SDK for Node.js
getParametersByPath()
SSM方法返回分页数据,这意味着我必须在一个循环中进行多次调用。是否有办法禁用分页或增加页面大小(超过10,这是
MaxNumber
参数的最大值)

或者,如果必须进行多次调用,是否可以将结果收集到一系列承诺中,以便立即解决


基本上,我们需要在Lambda启动时加载大约12个参数。当前获取参数大约需要2秒钟,因为连续进行了2次调用。理想情况下,它必须是一个或两个并行调用。

这是一个好问题。让我概述一些概念、AWS设计决策,以及我将如何绕过它们施加的限制

1.AWS服务器端SSM API 所有AWS客户端SDK,包括用于Node.js的AWS-SDK,都会对相应AWS服务的REST API进行API调用,例如AWS Systems Manager端点的API操作GetParametersByPath[1]

2.标页码 AWS API通常实现所谓的基于光标的分页概念。这种类型的分页具有基于页面的分页(即经典的偏移限制分页)以外的其他特性—在几篇媒体文章[2][3]中进行了描述

基于光标的分页的一个主要限制是:它不允许为不同的批发送并行请求。无法跳转到特定页面,它需要遍历之前的所有页面

考虑到每种分页类型的优缺点,AWS工程师可能会在性能成本的一致性方面做出权衡

3.API限制 AWS声明MaxResults参数的有效范围为1-10。这意味着,客户端无法将页面大小扩展到10以上。所有SDK在执行分页时都必须遵守该限制。禁用分页[4]的唯一效果是返回最多10个项目的单个页面

4.可能的解决办法
  • 您可以将SSMAPI结果同步到自定义DynamoDB表,并查询DynamoDB而不是SSM。该解决方案是否可行取决于几个特征,例如一致性要求、SSM参数变化的频率以及SSM参数值的机密性(或Lambda函数读取哪些参数属性)

  • 如果正确拆分预期结果集并使用ParameterFilters API参数[1],则可以向API发送并发请求。您可以通过以下键进行拆分:
    tag:.+| Name | Type | KeyId | Path | Label | Tier | DataType
    使用
    BeginsWith
    Equals
    选项。[5]

    此解决方案要求您可以对预期收到的结果进行假设。您必须确保特定子集包含的条目不超过10个。例如,如果每个部门最多有10个SSM参数,则可以执行以下操作:通过getParametersByPath()为每个部门发送一个请求,指定
    MaxResults=10
    Path=/department/
    ParameterFilters=[{Key=tag:department,Option=Equals,Values=[”“]}]
    。这些部门特定的请求可以同时发送

  • 变通方法2可以被认为是您在问题中提到的“两个并发请求”方法,变通方法1是“一个单一请求”方法。解决方法需要删除一致性属性或对数据分区进行假设

    工具书类 [1]
    [2]
    [3]
    [4]

    [5] 我要给你一个简单的答案,还有一个我已经解决了好几次的问题:

    或者,如果必须进行多次调用,是否可以将结果收集到一系列承诺中,以便立即解决

    是的,这是怎么做的-

    const{SSM}=require('aws-sdk');
    常量ssm=新ssm();
    函数getSSMStuff(路径,memo=[],nextToken){
    返回ssm
    .getParametersByPath({Path:Path,with decryption:true,Recursive:true,NextToken:NextToken,MaxResults:10})
    .承诺
    .然后({Parameters,NextToken})=>{
    const newMemo=memo.concat(参数);
    return NextToken?getSSMStuff(路径,newMemo,NextToken):newMemo;
    });
    
    }
    谢谢。如果我们事先知道参数的名称,并且可以使用
    getParameters()
    ,这将对我们有用。问题是这是一个被其他代码使用的通用包,它得到的输入是parameters path,通过
    getParametersByPath()
    递归检索给定路径中的所有参数,我修改了我的解决方案,使其更适合您的特定需求。但这又回到了最初的问题-我们现在需要几个连续的阻塞调用来检索所有参数。嘿,伙计们,如果我没有遗漏什么,那么就不可能避免连续调用,因为API的设计方式。我希望找到一些解决方法,看起来我必须使用您的解决方案@MartinLöperThanks来进行详细解释。即使这个答案不能提供决定性的解决方案,我也会接受它(并在允许的情况下奖励赏金),因为它为我指明了正确的方向。