Время ожидания кода генерации исходного URL-адреса как лямбда, работает локально

#node.js #amazon-web-services #amazon-s3 #aws-lambda #pre-signed-url

#node.js #amazon-веб-сервисы #amazon-s3 #aws-lambda #предварительно подписанный url

Вопрос:

Я использую прокси-сервер, используя aws-lambda-fastify пакет, чтобы заставить мой REST API на основе Fastify работать под AWS Lambda.

Одной из проблем, которую мне пришлось решить для запуска под Lambda, было время ожидания HTTP-запросов. Оказалось, что это было вызвано тем, что цикл событий не был пустым. Мне пришлось установить специальный флаг для лямбды context , и теперь запросы возвращаются нормально, все, кроме одного — маршрут для генерации предварительно подписанных URL-адресов для загрузки S3.

 const S3 = require('aws-sdk/clients/s3');

module.exports = createPresignedPost = ({ key, contentType }) => {
  const s3 = new S3();
  s3.config.accessKeyId = process.env.AWS_SECRET_ACCESS_KEY;
  s3.config.secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
  s3.config.region = process.env.AWS_REGION;
  const params = {
    Expires: 60,
    Bucket: process.env.AWS_BUCKET_NAME,
    Conditions: [['content-length-range', 100, 10000000]], // 100Byte - 10MB
    Fields: {
      'Content-Type': contentType,
      'Cache-Control': 'max-age=31536000',
      key
    }
  };
  return new Promise(async (resolve, reject) => {
    s3.createPresignedPost(params, (err, data) => {
      if (err) {
        reject(err);
        return;
      }
      resolve(data);
    });
  });
};
  

Эта функция вызывает тайм-аут при вызове из / под Lambda, в то время как локально она отлично работает под Docker и / или виртуальными / физическими хостами.

Есть предложения?

Комментарии:

1. Связана ли функция lambda с VPC?

2. @Marcin в чем разница? очевидно, что на хосте s3.createPresignedPost() возвращается, а под Lambda — нет.

3. У Lambda в VPC по умолчанию нет подключения к Интернету. Таким образом, у вас будет тайм-аут, если вы хотите получить доступ к S3, если вы не настроили свой VPC и lambda правильно.

4. Это общедоступный RDS или вы создали частный RDS в частной подсети и подключили lambda к этой подсети для взаимодействия с RDS?

5. Я подключаюсь, используя общедоступное полное доменное имя

Ответ №1:

Это работает:

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

AWS.config.update({
  region: process.env.AWS_DEFAULT_REGION,
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
  }
});

module.exports = createPresignedPost = ({ key, contentType }) => {
  const s3 = new AWS.S3();
  const params = {
    Expires: 60,
    Bucket: process.env.AWS_BUCKET_NAME,
    Conditions: [['content-length-range', 100, 10000000]], // 100Byte - 10MB
    Fields: {
      'Content-Type': contentType,
      'Cache-Control': 'max-age=31536000',
      'Access-Control-Allow-Origin': '*',
      key
    }
  };

  return new Promise(async (resolve, reject) => {
    s3.createPresignedPost(params, (err, data) => {
      if (err) {
        reject(err);
      }
      resolve(data);
    });
  });
};