有时Lambda不会将数据写入AWS S3存储桶中

时间:2020-09-10 12:14:51

标签: javascript typescript amazon-s3 aws-lambda

我的Lambda代码使用TypeScript编写,这会创建S3存储桶并向其中写入JSON数据数组,这是一个令人震惊的问题。根据到达SQS队列的消息触发此Lambda。有时候,突然之间会有很多消息。

我怀疑只有1条消息时,我的Lambda可以通过首先创建一个S3存储桶并向其中写入JSON数组来正常工作,但是当消息一次增长说10条消息时,Lambda只会创建一个存储桶,无法写入其中的内容,结果我只能像{}这样在其中得到一个空的JSON。

不确定是否是由于否。消息是否存在。因为所有消息都必须执行创建相同存储桶(如果尚不存在)的相同任务,并将相似的内容写入其中,或者可以执行以下描述的CacheControl属性。 以下是我的代码段:-

exports.createBucketAndUploadToS3 = async (s3Client, bucket, prefix, contents) => {
const params = {
Bucket: bucket,
Key: `${prefix}/data.json`,
Body: JSON.stringify(contents),
ContentType: 'application/json; charset=utf-8',
CacheControl: 'max-age=60'
};
await s3Client.createBucket({ Bucket: bucket }).promise();
return await s3Client.putObject(params).promise();
};

1 个答案:

答案 0 :(得分:1)

我建议在调用createBucket命令之前检查存储桶是否存在,当您尝试再次创建现有对象时,这通常会导致异常。您可以使用以下代码执行此操作:

const checkBucketExists = async bucket => { 
  const s3 = new AWS.S3();
  const options = {
    Bucket: bucket,
  };
  try {
    await s3.headBucket(options).promise();
    return true;
  } catch (error) {
    if (error.statusCode === 404) {
      return false;
    }
    throw error;
  }
};

// in your code

let isBucketExisting = await checkBucketExists(bucket);

if (isBucketExisting) {
 await s3Client.createBucket({ Bucket: bucket }).promise();
}

return await s3Client.putObject(params).promise();