0

试图让 AWS Rekognition 为我上传到 S3 的图像添加标签时真的陷入了困境。我仍在学习如何获得正确的角色和访问权限(我已将“所有”Rekognition 服务作为内联策略添加到我在 IAM 中的所有角色中,我正在构建这个应用程序以获得一些 AWS 的实践经验。

以下是所有代码(为混乱的代码道歉 - 仍在学习)。下面是我在 Lambda 中运行的测试的输出。

有人可以帮助建议我做错了什么以及如何进行一些调整以使 Rekognition 能够扫描图像并使用列出图像中的内容(例如,人、树、汽车等)。提前致谢!!!

'use strict';

let aws = require('aws-sdk');
let s3 = new aws.S3({ apiVersion: '2006-03-01' });
let rekognition =  new aws.Rekognition();
s3.bucket = 'arn:aws:s3:::XXXXXXX/uploads';

exports.handler = function(event, context) {

// Get the object from the event and show its content type
const eventn = event.Records[0].eventName;
const filesize = event.Records[0].s3.object.size;
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
var eventText = JSON.stringify(event, null, 2);
console.log('print this out -->' + eventText);
console.log('bucket name --> ' + s3.bucket);
var filesizemod = "-";
if (typeof filesize == "number") {
    if      (filesize>=1000000000) {filesizemod=(filesize/1000000000).toFixed(2)+' GB';}
    else if (filesize>=1000000)    {filesizemod=(filesize/1000000).toFixed(2)+' MB';}
    else if (filesize>=1000)       {filesizemod=(filesize/1000).toFixed(2)+' KB';}
    else                           {filesizemod=filesize+' bytes';}
} else if (typeof filesize !== 'undefined' && filesize) {
    filesizemod = filesize;
}

var Rekparams = {
    Image: {
        S3Object: {Bucket: s3.bucket, Name: key }},
    MaxLabels: 10,
    MinConfidence: 0.0
};

console.log("s3object is = " + JSON.stringify(Rekparams));

var request = rekognition.detectLabels(Rekparams, function(err, data) {
    if(err){
        var errorMessage =  'Error in [rekognition-image-assessment].\r' + 
                            '   Function input ['+JSON.stringify(event, null, 2)+'].\r' +  
                            '   Error ['+err+'].';
        // Log error
        console.log(errorMessage, err.stack); 
        return(errorMessage, null);
    }
    else{
        console.log("i get to here!!!! ****")
        console.log('Retrieved Labels ['+JSON.stringify(data)+']');

        console.log("i have got all the labels i need!!")

        // Return labels as a JavaScript object that can be passed into the 
        // subsequent lambda function.
        return(null, Object.assign(data, event));
    }
});

 console.log("not in label getting function!!")
// Call detectLabels
//var request = rekognition.detectLabels(Rekparams);
//var request1 = rekognition.detectLabels(bucket, key);
//var labels = JSON.stringify(request1);

//console.log('Retrieved Labels ['+JSON.stringify(data)+']');

//DetectLabelsRequest request = new DetectLabelsRequest()
         // .withImage(new Image().withS3Object(new S3Object().withName(key).withBucket(s3.bucket))).withMaxLabels(10).withMinConfidence(75F);

var subjecttext="Myfirstapp -> New image uploaded";
var eventText2 = "\n\nFile: " + key + "\nSize: " 
    + filesizemod 
    + "\n\nPlease see my S3 bucket for images."
    + "\nThis is what is in the image:"
    + request;

var sns = new aws.SNS();
var params = {
    Message: eventText2, 
    Subject: subjecttext,  
    TopicArn: "arn:aws:sns:XXXXXX"
};
sns.publish(params, context.done);
};

来自 Lambda 的测试输出。另请注意,我的 S3 存储桶与我的 Lambda 函数位于同一区域:

Response:
{
  "ResponseMetadata": {
    "RequestId": "a08afc8a-d2a4-5a8a-a435-af4503295913"
  },
  "MessageId": "5f1c516b-c52f-5aa1-8af3-02a414a2c938"
}

Request ID:
"1b17d85f-8e77-11e8-a89d-e723ca75e0cf"

Function Logs:
 "1970-01-01T00:00:00.000Z",
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "s3": {
        "configurationId": "testConfigRule",
        "object": {
          "eTag": "0123456789abcdef0123456789abcdef",
          "key": "HappyFace.jpg",
          "sequencer": "0A1B2C3D4E5F678901",
          "size": 1024
        },
        "bucket": {
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "name": "sourcebucket",
          "arn": "arn:aws:s3:::mybucket"
        },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
        "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
    }
  ]
}
2018-07-23T12:51:24.864Z    1b17d85f-8e77-11e8-a89d-e723ca75e0cf    bucket name --> arn:aws:s3:::XXXXXXXX/uploads
2018-07-23T12:51:24.865Z    1b17d85f-8e77-11e8-a89d-e723ca75e0cf    s3object is = {"Image":{"S3Object":{"Bucket":"arn:aws:s3:::XXXXXXX/uploads","Name":"HappyFace.jpg"}},"MaxLabels":10,"MinConfidence":0}
2018-07-23T12:51:25.427Z    1b17d85f-8e77-11e8-a89d-e723ca75e0cf    not in label getting function!!
2018-07-23T12:51:25.925Z    1b17d85f-8e77-11e8-a89d-e723ca75e0cf    Error in [rekognition-image-assessment].
   Function input [{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "s3": {
        "configurationId": "testConfigRule",
        "object": {
          "eTag": "0123456789abcdef0123456789abcdef",
          "key": "HappyFace.jpg",
          "sequencer": "0A1B2C3D4E5F678901",
          "size": 1024
        },
        "bucket": {
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "name": "sourcebucket",
          "arn": "arn:aws:s3:::mybucket"
        },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
        "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "us-east-1",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
    }
  ]
}].
   Error [ValidationException: 1 validation error detected: Value 'arn:aws:s3:::XXXXXX/uploads' at 'image.s3Object.bucket' failed to satisfy constraint: Member must satisfy regular expression pattern: [0-9A-Za-z\.\-_]*]. ValidationException: 1 validation error detected: Value 'arn:aws:s3:::XXXXXXXX/uploads' at 'image.s3Object.bucket' failed to satisfy constraint: Member must satisfy regular expression pattern: [0-9A-Za-z\.\-_]*
    at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:48:27)
    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:683:14)
    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22: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:38:9)
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:685:12)
    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
END RequestId: 1b17d85f-8e77-11e8-a89d-e723ca75e0cf
REPORT RequestId: 1b17d85f-8e77-11e8-a89d-e723ca75e0cf  Duration: 1309.41 ms    Billed Duration: 1400 ms    Memory Size: 128 MB Max Memory Used: 36 MB  
4

1 回答 1

0

Bucket 不应该是 ARN,而是存储桶的名称。

于 2018-07-23T13:25:00.130 回答