在AWS Node.js中,getParametersByPath() SSM方法返回分页数据,这意味着我必须在一个循环中进行几次调用。是否有一种方法可以禁用分页或增加页面大小(超过10,对于MaxNumber参数是最大值)?
或者,如果需要打几个电话--结果能被收集成一系列的承诺来一次解决吗?
基本上,我们有大约12个参数,我们需要加载在Lambda启动。目前,获取参数大约需要2秒--因为连续进行两个调用。理想情况下,它必须是一个调用或两个调用并行进行。
发布于 2021-01-03 00:29:13
这是个好问题。让我概述一些概念,AWS设计决策,以及我将如何围绕它们施加的限制工作。
1. AWS服务器端SSM
所有AWS客户端SDK,包括用于Node.js的AWS,都对各自AWS服务的REST进行API调用,例如AWS端点1的API动作GetParametersByPath。
2.分页
AWS API通常实现所谓的基于游标的分页概念。这种类型的分页除了基于页面的分页(即经典的偏移-限制分页)之外,还有其他的特征--在几个媒体第2篇中描述过。
基于游标的分页的一个主要限制是:不允许为不同批发送并行请求。没有办法跳过一个特定的页面,它需要遍历所有以前的页面。
考虑到每种分页类型的优缺点,AWS工程师可能以牺牲性能为代价,做出了有利于一致性的权衡。
3. API限制
AWS声明MaxResults参数的有效范围为1-10。这意味着,客户端无法将页面大小扩展到10以上。在实现分页时,所有SDK都必须遵守这一限制。禁用分页4的唯一效果是返回多达10项的单个页面。
4.可能的解决办法
如果正确地拆分了预期的结果集,并使用 API参数1,您可以向API发送并发请求。您可以通过以下键进行拆分:使用BeginsWith或Equals选项的tag:.+|Name|Type|KeyId|Path|Label|Tier|DataType。5
此解决方案要求您可以对预期收到的结果进行假设。必须确保特定子集不包含超过10个条目。如果有马克斯的话。每个部门有10个SSM参数,您可以这样做:每个部门通过getParametersByPath()发送一个请求,指定MaxResults=10和Path=/department/<name>或ParameterFilters=[{Key=tag:department,Option=Equals,Values=["<name>"]}]。这些特定于部门的请求可以发送concurrently.。
解决方案2可以被认为是您在问题中提到的“两个并发请求”方法,而解决方法1是“一个单一请求”方法。解决方法需要放弃一致性属性或对数据分区进行假设。
参考文献
发布于 2021-01-03 00:59:27
我要给你们一个简单的答案,还有一个我不得不解决几次的问题:
或者,如果需要进行多个调用--结果可以收集到一系列承诺中以立即解决吗?
是的,下面是-
const { SSM } = require('aws-sdk');
const ssm = new SSM();
function getSSMStuff(path, memo = [], nextToken) {
return ssm
.getParametersByPath({ Path: path, WithDecryption: true, Recursive: true, NextToken: nextToken, MaxResults: 10 })
.promise()
.then(({ Parameters, NextToken }) => {
const newMemo = memo.concat(Parameters);
return NextToken ? getSSMStuff(path, newMemo, NextToken) : newMemo;
});
}
如果您使用路径调用它,它将递归地调用自己以获取该路径中的所有参数,最后解析为一个完整参数数组。显然,您应该自己处理错误,但这才是要点。
发布于 2022-10-09 17:47:56
是的,这是可以实现的。我用下面的逻辑收集了92个参数(它是用java编码的,但可以用作引用)
//initialize
List<Parameter> parameters = new ArrayList<>();
String nextToken = null;
//logic
do {
GetParametersByPathRequest request = new GetParametersByPathRequest();
request.setWithDecryption(true);
request.setPath("......");
request.setRecursive(true);
request.setNextToken(nextToken);
GetParametersByPathResult parametersByPathResult = source.getParametersByPath(request);
nextToken = parametersByPathResult.getNextToken();
parameters.addAll(parametersByPathResult.getParameters());
} while(nextToken!=null);https://stackoverflow.com/questions/65513176
复制相似问题