Проблема с получением 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);
};

Тестовый вывод Lambda. Также обратите внимание, что моя корзина 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  

person JavCoder512    schedule 23.07.2018    source источник


Ответы (1)


Bucket не должен быть ARN, это должно быть имя ведра.

person Chris Pollard    schedule 23.07.2018
comment
Спасибо, что указал на это, Крис! Теперь я получаю еще одну ошибку:. Ошибка [ValidationException: обнаружена 1 ошибка проверки: значение 'BUCKETNAME / uploads' в 'image.s3Object.bucket' не удовлетворяет ограничению: элемент должен соответствовать шаблону регулярного выражения: [0-9A-Za-z \. \ -] *] . ValidationException: обнаружена 1 ошибка проверки: значение 'BUCKETNAME / uploads' в 'image.s3Object.bucket' не удовлетворяет ограничению: элемент должен удовлетворять шаблону регулярного выражения: [0-9A-Za-z \. \ -] * Любые указания как к чему это приводит? - person JavCoder512; 26.07.2018
comment
Это обратная косая черта в имени объекта, а не косая черта. - person Chris Pollard; 26.07.2018
comment
Извините, если я звучу глупо или медленно, но в ответе JSON есть только косая черта в месте сегмента. s3object is = {Изображение: {S3Object: {Bucket: BUCKETNAME / uploads, Name: HappyFace.jpg}}, MaxLabels: 10, MinConfidence: 0} Не совсем уверен, где должна быть обратная косая черта в имени объекта. Вы имеете в виду ключ или какой бит? Спасибо за помощь с моими глупыми вопросами. - person JavCoder512; 27.07.2018
comment
Попробуйте заменить BUCKETNAME / uploads на BUCKETNAME \ uploads - person Chris Pollard; 27.07.2018
comment
Спасибо, Крис. Я заменяю регулярное выражение / for \ на приведенное ниже, однако, когда я проверяю вывод с помощью Rekparams stringify JSON, он добавляет в другой \. Знаете почему? var str = bucketname1, replace = \\; var replace = str.replace (/ \ // g, замена); - person JavCoder512; 28.07.2018
comment
Приносим свои извинения, но я новичок в этом и все еще учусь ... ценю ваше руководство по этому поводу! - person JavCoder512; 28.07.2018
comment
@ChrisPollard, можешь опубликовать образец? - person user269867; 25.07.2019