amazon-web-services - certification - aws console




एसओएस से getObject जब aws लैम्ब्डा फ़ंक्शन पहुँच पहुँच अस्वीकृत (5)

मैं अपने लैम्ब्डा फ़ंक्शन पर एस 3 एओएस सेवा से अतिरिक्त त्रुटि से वंचित हो रहा हूं

यह कोड है

// dependencies
var async = require('async');
var AWS = require('aws-sdk');
var gm = require('gm').subClass({ imageMagick: true }); // Enable ImageMagick integration.

exports.handler = function(event, context) {
    var srcBucket = event.Records[0].s3.bucket.name;
    // Object key may have spaces or unicode non-ASCII characters.
    var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
/*
{
    originalFilename: <string>,
    versions: [
        {
            size: <number>,
            crop: [x,y],
            max: [x, y],
            rotate: <number>
        }
    ]
}*/
    var fileInfo;
    var dstBucket = "xmovo.transformedimages.develop";
    try {
        //TODO: Decompress and decode the returned value
        fileInfo = JSON.parse(key);
        //download s3File

        // get reference to S3 client
        var s3 = new AWS.S3();

        // Download the image from S3 into a buffer.
        s3.getObject({
                Bucket: srcBucket,
                Key: key
            },
            function (err, response) {
                if (err) {
                    console.log("Error getting from s3: >>> " + err + "::: Bucket-Key >>>" + srcBucket + "-" + key + ":::Principal>>>" + event.Records[0].userIdentity.principalId, err.stack);
                    return;
                }

                // Infer the image type.
                var img = gm(response.Body);
                var imageType = null;
                img.identify(function (err, data) {
                    if (err) {
                        console.log("Error image type: >>> " + err);
                        deleteFromS3(srcBucket, key);
                        return;
                    }
                    imageType = data.format;

                    //foreach of the versions requested
                    async.each(fileInfo.versions, function (currentVersion, callback) {
                        //apply transform
                        async.waterfall([async.apply(transform, response, currentVersion), uploadToS3, callback]);

                    }, function (err) {
                        if (err) console.log("Error on excecution of watefall: >>> " + err);
                        else {
                            //when all done then delete the original image from srcBucket
                            deleteFromS3(srcBucket, key);
                        }
                    });
                });
            });
    }
    catch (ex){
        context.fail("exception through: " + ex);
        deleteFromS3(srcBucket, key);
        return;
    }
        function transform(response, version, callback){
            var imageProcess = gm(response.Body);
            if (version.rotate!=0) imageProcess = imageProcess.rotate("black",version.rotate);
            if(version.size!=null) {
                if (version.crop != null) {
                    //crop the image from the coordinates
                    imageProcess=imageProcess.crop(version.size[0], version.size[1], version.crop[0], version.crop[1]);
                }
                else {
                    //find the bigger and resize proportioned the other dimension
                    var widthIsMax = version.size[0]>version.size[1];
                    var maxValue = Math.max(version.size[0],version.size[1]);
                    imageProcess=(widthIsMax)?imageProcess.resize(maxValue):imageProcess.resize(null, maxValue);
                }
            }


            //finally convert the image to jpg 90%
            imageProcess.toBuffer("jpg",{quality:90}, function(err, buffer){
                if (err) callback(err);
                callback(null, version, "image/jpeg", buffer);
            });

        }

        function deleteFromS3(bucket, filename){
            s3.deleteObject({
                Bucket: bucket,
                Key: filename
            });
        }

        function uploadToS3(version, contentType, data, callback) {
            // Stream the transformed image to a different S3 bucket.
            var dstKey = fileInfo.originalFilename + "_" + version.size + ".jpg";
            s3.putObject({
                Bucket: dstBucket,
                Key: dstKey,
                Body: data,
                ContentType: contentType
            }, callback);
        }
};

क्लाउडवॉच पर यह त्रुटि है

AccessDenied: Access Denied

यह स्टैक त्रुटि है

at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/s3.js:329:35)

at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20) 

at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)

at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:596:14)

at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:21:10) 

at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12) 

at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10 

at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:37:9) 

at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:598:12) 

at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:115:18)

एस 3 बाल्टी अनुमति के बारे में किसी भी अन्य विवरण या जानकारी के बिना सभी को सूची में डाल और हटा दें

एस 3 बाल्टी तक पहुंचने के लिए मैं क्या कर सकता हूं

पीएस: लैम्ब्डा इवेंट गुणों पर प्रिंसिपल सही है और व्यवस्थापकीय विशेषाधिकार हैं


आपके लैम्ब्डा को विशेषाधिकार नहीं हैं (S3:GetObject)

आईएएम डैशबोर्ड पर जाएं, अपने लैम्ब्डा निष्पादन से संबंधित भूमिका की जांच करें। यदि आप एडब्ल्यूएस जादूगर का उपयोग करते हैं, तो यह स्वचालित रूप से एक भूमिका बनाता है जिसे oneClick_lambda_s3_exec_role कहा जाता है। Show Policy पर क्लिक करें इसे संलग्न चित्र के जैसा कुछ दिखाना चाहिए। सुनिश्चित करें कि S3:GetObject सूचीबद्ध है।


दिलचस्प रूप से पर्याप्त AWS रिटर्न 403 (प्रवेश अस्वीकृत) जब फाइल मौजूद नहीं है सुनिश्चित करें कि फ़ाइल बाल्टी में है


मैं घंटों के लिए इस मुद्दे के साथ संघर्ष कर रहा था मैं AmazonS3EncryptionClient का उपयोग कर रहा था और मैंने कुछ नहीं किया फिर मैंने देखा कि क्लाइंट को वास्तव में बहिष्कृत किया गया है, इसलिए मैंने सोचा कि मैं उनके पास बिल्डर मॉडल पर स्विच करने की कोशिश करूँगा:

var builder = AmazonS3EncryptionClientBuilder.standard()
  .withEncryptionMaterials(new StaticEncryptionMaterialsProvider(encryptionMaterials))
if (accessKey.nonEmpty && secretKey.nonEmpty) builder = builder.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey.get, secretKey.get)))
builder.build()

और ... कि इसे हल किया ऐसा लग रहा है कि लम्बेडा के पुराने मॉडल में क्रेडेंशियल्स को लगाने में परेशानी होती है, लेकिन नए एक में अच्छी तरह से काम करता है।


मैं भी इस मुद्दे पर गया था, मैंने इसे s3:GetObject* प्रदान करके एसीएल में तय किया क्योंकि वह उस ऑब्जेक्ट के संस्करण को प्राप्त करने का प्रयास कर रहा है।


यह शायद कुछ लोगों के लिए उपयोगी है

यदि आप अभी भी एसएएस अनुमति नीतियों के साथ उचित IAM भूमिका को कॉन्फ़िगर करने के बाद प्रवेश अस्वीकृत त्रुटि प्राप्त कर रहे हैं, तो सुनिश्चित करें कि आपका कोड सही है मेरे पास मेरे कोड में एक बग था और यह प्रवेश में प्रवेश के रूप में दिख रहा था।







amazon-iam