AWS Как вызвать хранилище параметров SSM с помощью частной конечной точки DNS из функции Lamda Nodejs

Привет, есть требование, согласно которому учетные данные должны храниться в хранилище параметров SSM и будут считываться функцией Lambda, которая находится внутри VPC, а все подсети внутри моего VPC являются общедоступными подсетями. Поэтому, когда я вызываю хранилище SSM Param, используя приведенный ниже код, я получаю сообщение об ошибке тайм-аута.

const AWS = require('aws-sdk');

AWS.config.update({
  region: 'us-east-1'
})

const parameterStore = new AWS.SSM();

exports.handler = async (event, context, callback) => {
    console.log('calling param store'); 
    const param = await getParam('/my/param/name')
    console.log('param : ',param);

    
    //Send API Response
    return {
        statusCode: '200',
        body: JSON.stringify('able to connect to param store'),
        headers: {
            'Content-Type': 'application/json',
        },
    };
};


const getParam = param => {
  return new Promise((res, rej) => {
    parameterStore.getParameter({
      Name: param
    }, (err, data) => {
        if (err) {
          return rej(err)
        }
        return res(data)
    })
  })
}

Поэтому я создал конечную точку vpc для Secrets Manager с включенным частным DNS-именем.

Тем не менее я получаю ошибку тайм-аута для кода выше.

Нужно ли мне изменить код Lambda, чтобы указать частную конечную точку DNS в функции Lambda?

Изображение ниже содержит правило исходящего трафика для NACL подсети Изображение ниже содержит правило исходящего трафика для NACL подсети Изображение ниже содержит правило исходящего трафика для группы безопасности Ниже изображение содержит исходящее правило группы безопасности


person Priyaranjan Behera    schedule 04.05.2021    source источник
comment
Вам не нужно ничего менять в лямбда-функции. Похоже, конечная точка VPC настроена неправильно или группа безопасности или NACL в подсети не пропускают трафик.   -  person Jason Wadsworth    schedule 04.05.2021
comment
Не могли бы вы еще раз проверить, что лямбда-выражение и конечная точка VPC находятся в одной подсети?   -  person jellycsc    schedule 04.05.2021
comment
@JasonWadsworth Я обновил свой вопрос с правилом исходящего трафика NACL и SG, пожалуйста, проверьте и предложите, нужны ли какие-либо изменения   -  person Priyaranjan Behera    schedule 04.05.2021
comment
@jellycsc Да Конечная точка Lambda и VPC находится во всех доступных подсетях внутри VPC, следовательно, оба находятся в одних и тех же подсетях.   -  person Priyaranjan Behera    schedule 04.05.2021
comment
Я не думаю, что это ваша проблема, но вы можете упростить код, используя .promise() при вызове getParameter. Это избавляет вас от необходимости создавать из него обещание. Я предполагаю, что вы не попадаете в строку ведения журнала после вызова getParam.   -  person Jason Wadsworth    schedule 04.05.2021
comment
@JasonWadsworth Да, верно, я не попадаю в строку ведения журнала после вызова getParam, и я согласен с вами, что могу упростить вызов getParam, и я сделал это, но это не решает исходную проблему тайм-аута.   -  person Priyaranjan Behera    schedule 04.05.2021
comment
Есть вероятность, что твоя лямбда не в нас-восток-1?   -  person Jason Wadsworth    schedule 04.05.2021
comment
Да, все сервисы (VPC, Param Store, функция Lambda) находятся в us-east-1 @JasonWadsworth   -  person Priyaranjan Behera    schedule 04.05.2021
comment
У меня нет ничего другого. Явно что-то не так, но помочь уже ничем не могу.   -  person Jason Wadsworth    schedule 04.05.2021


Ответы (1)


Мне удалось исправить эту проблему. Основная причина этой проблемы заключалась в том, что все подсети были общедоступными. Поскольку доступ к конечным точкам VPC осуществляется в частном порядке без доступа к Интернету, подсети, связанные с функцией Lambda, должны быть частной подсетью.

Ниже приведены шаги, которые я предпринял, чтобы решить эту проблему.

  1. Создал шлюз NAT в стороннем VPC и присвоил ему один эластичный IP-адрес.
  2. Создал новую таблицу маршрутов и указал весь трафик на шлюз NAT, созданный на шаге 1.
  3. Прикреплена новая таблица маршрутов к паре подсетей (что сделало их частными)
  4. затем подключил к функции Lambda только частные подсети

Помимо этой роли IAM, связанной с функцией Lambda, должна быть политика ниже 2 для доступа к хранилищу параметров SSM.

  • AmazonSSMReadOnlyAccess
  • AWSLambdaVPCAccessExecutionRole
person Priyaranjan Behera    schedule 05.05.2021
comment
@JasonWadsworth нашел проблему - person Priyaranjan Behera; 05.05.2021