预签名 URL 生成代码超时为 Lambda,在本地工作

Presigned URL generation code times-out as Lambda, works locally

我使用代理 - 使用 aws-lambda-fastify 包使我基于 Fastify 的 REST API 在 AWS Lambda 下工作。

我必须在 Lambda 下解决 运行 的其中一个问题是 HTTP 请求超时。原来是事件循环不为空导致的。我必须在 Lambda context 上设置一个特殊标志,现在请求 return 很好,除了一个 - 一条为 S3 上传生成预签名 URL 的路由。

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);
    });
  });
};

此函数在调用 from/under Lambda 时会导致超时,而它在 Docker and/or virtual/physical 主机下在本地执行得非常好。

有什么建议吗?

这个有效:

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);
    });
  });
};