通过 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 以检查它是否匹配这两个之一。