Вызовы AWS Lambda SSM случайным образом срабатывают по таймауту

У меня лямбда развернута на AWS в VPC с доступом в Интернет через NAT. Развертывание выполняется с использованием Serverless. Лямбда использует некоторые промежуточные программы Middy и получает некоторые учетные данные из SSM.

Проблема в том, что выборка SSM случайным образом идет по таймауту!

Вот лямбда-код:

/* requirements are omitted */

const authorize = async (_event, _context) => {
  try {
    const ssm = new SSM({
      maxRetries: 6, // lowers a chance to hit service rate limits, default is 3
      retryDelayOptions: { base: 200 }
    })
    const params = {
      Names: ["param1", "param2"],
      WithDecryption: true
    }
    const fetch = () => new Promise(resolve => {
      ssm.getParameters(params, function(err, data) {
        if (err) resolve(err, err.stack); // an error occurred
        else     resolve(data);           // successful response
      })
    })
    const res = await fetch()
    return {
      statusCode: 200,
      body: JSON.stringify(res)
    }
  } catch (_err) {
    console.error(_err)
    return {
      statusCode: 500,
      body: 'error'
    }
  }
}

export default middy(authorize)
  .use(warmup({ waitForEmptyEventLoop: false }))
  .use(doNotWaitForEmptyEventLoop({ runOnError: true }))
  .use(httpSecurityHeaders())

person maxdelia    schedule 29.01.2021    source источник


Ответы (1)


Лямбда истекает по тайм-ауту, потому что ssm регулирует вашу текущую конфигурацию (6 попыток по 200 мс), это занимает около 26 секунд, прежде чем ваша лямбда откажется.

Здесь вы работаете с стандартными ограничениями пропускной способности SSM.

Вы можете включить увеличенную пропускную способность с помощью :

aws ssm update-service-setting --setting-id arn:aws:ssm:*region*:*account-id*:servicesetting/ssm/parameter-store/high-throughput-enabled --setting-value true

Имейте в виду, что впоследствии за каждый вызов getParameter будут взиматься дополнительные расходы (0,05 $ / 10.000 запросов).

person Steven    schedule 29.01.2021
comment
Привет, спасибо за ответ! Я хотел бы задать Вам два вопроса, пожалуйста: 1) Как Вам удалось рассчитать 26 секунд, начиная с 6 попыток, 200 мс? 2) Каков предел пропускной способности, который я достиг? Я могу прочитать пропускную способность по умолчанию: 40, так что я не думаю, что это ...? - person maxdelia; 29.01.2021
comment
1) экспоненциальный откат удваивает 200 мс при каждой повторной попытке, так что это заканчивается через 25,5 с: wolframalpha. com / input /? i = 200 мс * 2% 5E7 - person Steven; 30.01.2021
comment
2) сработала ли установка службы обновления? Затем проверьте свое использование в Cloudwatch или в обозревателе затрат для этих конкретных случаев использования. - person Steven; 30.01.2021