首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getParametersByPath页面大小

问getParametersByPath页面大小
EN

Stack Overflow用户
提问于 2020-12-30 20:29:39
回答 3查看 1.8K关注 0票数 1

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

或者,如果需要打几个电话--结果能被收集成一系列的承诺来一次解决吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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.可能的解决办法

  1. 您可以将SSM结果同步到自定义DynamoDB表,并查询DynamoDB而不是SSM。如果此解决方案是可行的,则取决于几个特性,例如一致性要求、SSM参数更改的频率和参数值的保密性(或者哪些参数属性由Lambda函数读取)。

如果正确地拆分了预期的结果集,并使用 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是“一个单一请求”方法。解决方法需要放弃一致性属性或对数据分区进行假设。

参考文献

1

2

3

4

5

票数 2
EN

Stack Overflow用户

发布于 2021-01-03 00:59:27

我要给你们一个简单的答案,还有一个我不得不解决几次的问题:

或者,如果需要进行多个调用--结果可以收集到一系列承诺中以立即解决吗?

是的,下面是-

​

代码语言:javascript
复制
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;
});
}

​

如果您使用路径调用它,它将递归地调用自己以获取该路径中的所有参数,最后解析为一个完整参数数组。显然,您应该自己处理错误,但这才是要点。

票数 3
EN

Stack Overflow用户

发布于 2022-10-09 17:47:56

是的,这是可以实现的。我用下面的逻辑收集了92个参数(它是用java编码的,但可以用作引用)

代码语言:javascript
复制
 //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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65513176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档