Функция AWS Textract StartDocumentAnalysis не публикует сообщение в теме SNS - PullRequest
3 голосов
/ 24 июня 2019

Я работаю с AWS Textract и хочу проанализировать многостраничный документ, поэтому мне нужно использовать параметры асинхронности, поэтому я сначала использовал функцию startDocumentAnalysis и получил JobId в качестве возврата, но он должен вызватьфункция, которую я установил для запуска, когда тема SNS получила сообщение.

Это мой файл и файл обработчика без сервера.

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: us-east-1
  iamRoleStatements:
    - Effect: "Allow"
      Action:
       - "s3:*"
      Resource: { "Fn::Join": ["", ["arn:aws:s3:::${self:custom.secrets.IMAGE_BUCKET_NAME}", "/*" ] ] }
    - Effect: "Allow"
      Action:
        - "sts:AssumeRole"
        - "SNS:Publish"
        - "lambda:InvokeFunction"
        - "textract:DetectDocumentText"
        - "textract:AnalyzeDocument"
        - "textract:StartDocumentAnalysis"
        - "textract:GetDocumentAnalysis"
      Resource: "*"

custom:
  secrets: ${file(secrets.${opt:stage, self:provider.stage}.yml)}

functions:
  routes:
    handler: src/functions/routes/handler.run
    events:
      - s3:
          bucket: ${self:custom.secrets.IMAGE_BUCKET_NAME}
          event: s3:ObjectCreated:*

  textract:
    handler: src/functions/routes/handler.detectTextAnalysis
    events:
      - sns: "TextractTopic"

resources:
  Resources:
    TextractTopic:
        Type: AWS::SNS::Topic
        Properties:
          DisplayName: "Start Textract API Response"
          TopicName: TextractResponseTopic

Handler.js

module.exports.run = async (event) => {
  const uploadedBucket = event.Records[0].s3.bucket.name;
  const uploadedObjetct = event.Records[0].s3.object.key;

  var params = {
    DocumentLocation: {
      S3Object: {
        Bucket: uploadedBucket,
        Name: uploadedObjetct
      }
    },
    FeatureTypes: [
      "TABLES", 
      "FORMS"
    ],
    NotificationChannel: {
      RoleArn: 'arn:aws:iam::<accont-id>:role/qvalia-ocr-solution-dev-us-east-1-lambdaRole', 
      SNSTopicArn: 'arn:aws:sns:us-east-1:<accont-id>:TextractTopic'
    }
  };

  let textractOutput = await new Promise((resolve, reject) => {
    textract.startDocumentAnalysis(params, function(err, data) {
      if (err) reject(err); 
      else resolve(data);
    });
  });
}

Я вручную опубликовал сообщение sns в теме, а затем оно запускает лямбду textract, которая в настоящее время имеет это,

module.exports.detectTextAnalysis = async (event) => {
  console.log('SNS Topic isssss Generated');
  console.log(event.Records[0].Sns.Message);
};

В чем заключается моя ошибка, и почему textract startDocumentAnalysis не публикует сообщениеи заставить его запускать лямбду?

Примечание: я не использовал startDocumentTextDetection перед использованием функции startTextAnalysis, хотя вызывать его до этого не нужно.

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Убедитесь, что в ваших Доверенных отношениях есть роль, которую вы используете:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "textract.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
0 голосов
/ 04 июля 2019

Если у вас есть зашифрованное ведро, вы должны предоставить разрешения в KMS, иначе оно не будет работать

...