通过 Javascript 访问 s3 对象时区分文件不存在和访问被拒绝
Making a distinction between file not present and access denied while accessing s3 object via Javascript
我继承了以下代码。这是 CICD 管道的一部分。它尝试从桶中获取名为 "changes" 的对象并对其进行处理。如果它能够抓取对象,它会将成功消息发送回管道。如果由于某种原因未能抓取文件,它会将失败消息发送回 codepipeline。
此 "changes" 文件是在代码流水线的上一步中创建的。然而,有时这个文件不存在是有效的(即当没有变化时)。
目前,如果文件根本不存在或某些原因代码无法获取它(访问被拒绝等),则以下代码没有区别
期望:
如果文件根本不存在,我想将成功消息发送回代码管道。
如果存在访问问题,那么“失败”的当前结果仍然有效。
非常感谢任何帮助。不幸的是,我对 Javascript 还不够好,无法尝试任何想法。
代码的相关部分
const AWS = require("aws-sdk");
const s3 = new AWS.S3();
const lambda = new AWS.Lambda();
const codePipeline = new AWS.CodePipeline();
// GET THESE FROM ENV Variables
const {
API_SOURCE_S3_BUCKET: s3Bucket,
ENV: env
} = process.env;
const jobSuccess = (CodePipeline, params) => {
return new Promise((resolve, reject) => {
CodePipeline.putJobSuccessResult(params, (err, data) => {
if (err) { reject(err); }
else { resolve(data); }
});
});
};
const jobFailure = (CodePipeline, params) => {
return new Promise((resolve, reject) => {
CodePipeline.putJobFailureResult(params, (err, data) => {
if (err) { reject(err); }
else { resolve(data); }
});
});
};
// MAIN CALLER FUNCTION. STARTING POINT
exports.handler = async (event, context, callback) => {
try {
// WHAT IS IN changes file in S3
let changesFile = await getObject(s3, s3Bucket, `lambda/${version}/changes`);
let changes = changesFile.trim().split("\n");
console.log("List of Changes");
console.log(changes);
let params = { jobId };
let jobSuccessResponse = await jobSuccess(codePipeline, params);
context.succeed("Job Success");
}
catch (exception) {
let message = "Job Failure (General)";
let failureParams = {
jobId,
failureDetails: {
message: JSON.stringify(message),
type: "JobFailed",
externalExecutionId: context.invokeid
}
};
let jobFailureResponse = await jobFailure(codePipeline, failureParams);
console.log(message, exception);
context.fail(`${message}: ${exception}`);
}
};
S3 应该 return 一个 error code 在异常中:
您关注的如下:
- AccessDenied - Access Denied
- NoSuchKey - The specified key does not exist.
因此,在您的 catch 块中,您应该能够验证 exception.code 以检查它是否匹配这两个之一。
我继承了以下代码。这是 CICD 管道的一部分。它尝试从桶中获取名为 "changes" 的对象并对其进行处理。如果它能够抓取对象,它会将成功消息发送回管道。如果由于某种原因未能抓取文件,它会将失败消息发送回 codepipeline。
此 "changes" 文件是在代码流水线的上一步中创建的。然而,有时这个文件不存在是有效的(即当没有变化时)。
目前,如果文件根本不存在或某些原因代码无法获取它(访问被拒绝等),则以下代码没有区别
期望: 如果文件根本不存在,我想将成功消息发送回代码管道。 如果存在访问问题,那么“失败”的当前结果仍然有效。
非常感谢任何帮助。不幸的是,我对 Javascript 还不够好,无法尝试任何想法。
代码的相关部分
const AWS = require("aws-sdk");
const s3 = new AWS.S3();
const lambda = new AWS.Lambda();
const codePipeline = new AWS.CodePipeline();
// GET THESE FROM ENV Variables
const {
API_SOURCE_S3_BUCKET: s3Bucket,
ENV: env
} = process.env;
const jobSuccess = (CodePipeline, params) => {
return new Promise((resolve, reject) => {
CodePipeline.putJobSuccessResult(params, (err, data) => {
if (err) { reject(err); }
else { resolve(data); }
});
});
};
const jobFailure = (CodePipeline, params) => {
return new Promise((resolve, reject) => {
CodePipeline.putJobFailureResult(params, (err, data) => {
if (err) { reject(err); }
else { resolve(data); }
});
});
};
// MAIN CALLER FUNCTION. STARTING POINT
exports.handler = async (event, context, callback) => {
try {
// WHAT IS IN changes file in S3
let changesFile = await getObject(s3, s3Bucket, `lambda/${version}/changes`);
let changes = changesFile.trim().split("\n");
console.log("List of Changes");
console.log(changes);
let params = { jobId };
let jobSuccessResponse = await jobSuccess(codePipeline, params);
context.succeed("Job Success");
}
catch (exception) {
let message = "Job Failure (General)";
let failureParams = {
jobId,
failureDetails: {
message: JSON.stringify(message),
type: "JobFailed",
externalExecutionId: context.invokeid
}
};
let jobFailureResponse = await jobFailure(codePipeline, failureParams);
console.log(message, exception);
context.fail(`${message}: ${exception}`);
}
};
S3 应该 return 一个 error code 在异常中:
您关注的如下:
- AccessDenied - Access Denied
- NoSuchKey - The specified key does not exist.
因此,在您的 catch 块中,您应该能够验证 exception.code 以检查它是否匹配这两个之一。