この記事は、AWS Lamabda で Amazon S3 からファイルをダウンロードする際のメモです。
環境
- AWS Lambda の実行環境
- AWS SDK for JavaScript
コード
const s3 = new AWS.S3({
apiVersion: '2006-03-01',
signatureVersion: 'v4'
});
function download(srcBucket, srcObjectKey, dstFilePath) {
return new Promise((resolve, reject) => {
const params = {
Bucket: srcBucket,
Key: srcObjectKey,
};
let error = null;
const writeStream = fs.createWriteStream(dstFilePath);
s3.getObject(params)
.createReadStream()
.on('error', (err) => {
console.error('Failed to read object from S3: ', error);
error = err;
writeStream.end();
})
.pipe(writeStream)
.on('error', (err) => {
console.error('Failed to write file to local: ', error);
error = err;
writeStream.end();
})
.on('close', () => {
if (error) {
reject(error);
return;
}
resolve();
});
});
}
ダメなコード
以下のようなコードを書くと、正常系は動作するものの、S3 の object が存在しない場合に NoSuchKey のエラーが捕捉しきれずに、Lambda が異常終了します。。。
NoSuchKey: The specified key does not exist.
const s3 = new AWS.S3({
apiVersion: '2006-03-01',
signatureVersion: 'v4'
});
function download(srcBucket, srcObjectKey, dstFilePath) {
return new Promise((resolve, reject) => {
const params = {
Bucket: srcBucket,
Key: srcObjectKey,
};
let error = null;
const writeStream = fs.createWriteStream(dstFilePath);
const request = s3.getObject(params);
request.on('error', (err) => {
console.error('Failed to read object from S3: ', error);
error = err;
writeStream.end();
});
writeStream.on('error', (err) => {
console.error('Failed to write file to local: ', error);
error = err;
writeStream.end();
});
writeStream.on('close', () => {
if (error) {
reject(error);
return;
}
resolve();
});
request.createReadStream().pipe(writeStream);
});
}