На данный момент мне нужно получить последние 10 значений некоторых параметров в AWS Parameters Store.
Я использую в котлине следующий код:
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, вы можете получить только 50 значений в maxResults, поэтому мне нужно сделать 2 вызова для каждого параметра (потому что у меня более 50 версий)
Таким образом, каждое получение трех моих параметров стоит 6 запросов к SSM.
Я кэширую последние 10 значений каждого параметра в памяти на 5 минут
Проблема в том, что когда несколько экземпляров моих лямбда-выражений одновременно истекают из своего кеша, они выполняют извлечение одновременно и
com.amazonaws.services.simplesystemsmanagement.model.AWSSimpleSystemsManagementException: Rate exceeded (Service: AWSSimpleSystemsManagement; Status Code: 400; Error Code: ThrottlingException; Request ID: xxx)
Например, если речь идет о 3 экземплярах, они выполнят 18 запросов менее чем за секунду, и я столкнусь с ошибкой (примечание: я точно не знаю, равно ли количество экземпляров, которые одновременно попадают в этот код, 3, это это просто предположение, чтобы проиллюстрировать, что в какой-то момент вы столкнулись с ошибкой)
Итак, у меня 2 вопроса:
Во-первых, есть ли способ сначала получить последние версии параметра?
Таким образом, я буду выполнять половину запросов, поэтому я буду реже сталкиваться с проблемой!
Во-вторых, как автоматически повторить попытку при ошибке регулирования?
Я нашел это сообщение в блоге AWS [1], в котором говорится, что мне нужно проанализировать сообщение об ошибке, но это старый пост (2013 г.), и это очень уродливо (в момент, когда AWS меняет сообщение, весь механизм рушится)!
Последнее замечание: я использую хранилище параметров с «автоматическим шифрованием» и IAM, я не хочу ни хранить параметры в моей собственной базе данных, ни кэшировать их в кеш-памяти общего доступа, например Redis!