我的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();
};
答案 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();