【问题标题】:Presigned URL generation code times-out as Lambda, works locallyLambda 的预签名 URL 生成代码超时,在本地工作
【发布时间】:2021-01-10 07:16:21
【问题描述】:

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

在 Lambda 下运行时我必须解决的一个问题是 HTTP 请求超时。原来是因为事件循环不是空的。我必须在 Lambda context 上设置一个特殊标志,现在请求返回正常,除了一个 - 为 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);
    });
  });
};

当从 Lambda 调用/在 Lambda 下调用此函数时会导致超时,而它在 Docker 和/或虚拟/物理主机下本地执行得非常好。

有什么建议吗?

【问题讨论】:

  • lambda 函数是否与 VPC 关联?
  • @Marcin 有什么区别?显然,在主机上 s3.createPresignedPost() 会返回,而在 Lambda 下则不会。
  • VPC 中的 Lambda 默认没有互联网连接。因此,如果您想访问 S3,您将超时,除非您正确设置您的 VPC 和 lambda。
  • 是公共 RDS,还是您在私有子网中创建了私有 RDS,然后将 lambda 连接到该子网以与 RDS 交互?
  • 我使用公共 FQDN 进行连接

标签: node.js amazon-web-services amazon-s3 aws-lambda pre-signed-url


【解决方案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);
    });
  });
};

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 2021-12-28
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多