Node.js getParametersByPath页面大小
在AWS-SDK for Node.jsNode.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设计决策
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.可能的解决办法
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]
[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来进行详细解释。即使这个答案不能提供决定性的解决方案,我也会接受它(并在允许的情况下奖励赏金),因为它为我指明了正确的方向。