目前,我需要在 AWS 参数存储中检索一些参数的最后 10 个值
我在 kotlin 中使用以下代码:
val p1 = retrieveAllValidVersions("P1")
val p2 = retrieveAllValidVersions("P2")
val p3 = retrieveAllValidVersions("P3")
这是retrieveAllValidVersions的代码
private fun retrieveAllValidVersions(paramName: String): List<ParameterHistory> {
val res = mutableListOf<ParameterHistory>()
val ssmClient = AWSSimpleSystemsManagementClientBuilder.defaultClient()
var nextToken : String? = null
do {
val ssmParams = ssmClient.getParameterHistory(GetParameterHistoryRequest()
.withName(paramName)
.withWithDecryption(true)
.withNextToken(nextToken)
)
res.addAll(ssmParams.parameters)
nextToken = ssmParams.nextToken
} while (nextToken != null)
return validVersions.sortedByDescending { it.version }.take(10)
}
如https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_ssm中所述,参数的最大版本数为 100
正如https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameterHistory.html所述,您只能在 maxResults 中检索 50 个值,因此我需要为每个参数调用 2 次(因为我有超过 50 个版本)
因此,每次检索我的 3 个参数都需要对 SSM 进行 6 次查询
我将每个参数的最后 10 个值缓存在内存中 5 分钟
问题是,当我的 lambdas 的多个实例同时过期其缓存时,它们会同时进行检索并且
com.amazonaws.services.simplesystemsmanagement.model.AWSSimpleSystemsManagementException: Rate exceeded (Service: AWSSimpleSystemsManagement; Status Code: 400; Error Code: ThrottlingException; Request ID: xxx)
例如,如果涉及 3 个实例,它将在不到一秒的时间内完成 18 个请求,我会遇到错误(注意:我不知道同时命中此代码的实例数是否为 3,这只是一个猜测来说明您在某些时候遇到了错误)
所以我有两个问题:
首先,有没有办法首先检索参数的最新版本?
这样,我将完成一半的请求,这样我就不会经常遇到问题了!
其次,如何自动重试节流错误?
我发现这篇 AWS 博客 [1] 帖子说我必须解析错误消息,但这是一篇旧帖子(2013 年),这非常难看(AWS 更改消息的那一刻,所有机制都崩溃了)!
最后一点:我正在使用带有“自动加密”和 IAM 的参数存储,我不想将参数存储在我自己的数据库中,也不想将它们缓存在像 redis 这样的共享内存缓存中!