Проблема с получением AWS Rekognition для чтения изображений при помещении в корзину S3
Я действительно застрял, пытаясь заставить 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);
};
Тестовый вывод из лямбды. Также обратите внимание, что моя корзина S3 находится в том же регионе, что и моя лямбда-функция:
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