首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS T Textract函数不向SNS主题发布消息

问AWS T Textract函数不向SNS主题发布消息
EN

Stack Overflow用户
提问于 2019-06-24 07:53:52
回答 5查看 2.1K关注 0票数 7

我正在使用AWS Textract,我想要分析一个多页文档,因此我必须使用异步选项,所以我首先使用了startDocumentAnalysis函数,我得到了一个JobId作为返回值,但它需要触发一个函数,该函数是我设置为在SNS主题收到消息时触发的。

这些是我的无服务器文件和处理程序文件。

代码语言:javascript
复制
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

代码语言:javascript
复制
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 lambda,它当前具有以下内容:

代码语言:javascript
复制
module.exports.detectTextAnalysis = async (event) => {
  console.log('SNS Topic isssss Generated');
  console.log(event.Records[0].Sns.Message);
};

我的错误是什么?为什么textract startDocumentAnalysis没有发布消息并使其触发lambda?

注意:在使用startTextAnalysis函数之前,我没有使用过startDocumentTextDetection,尽管在此之前没有必要调用它。

EN

回答 5

Stack Overflow用户

发布于 2019-07-12 05:38:06

确保您的信任关系中包含您正在使用的角色:

代码语言:javascript
复制
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "textract.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
票数 10
EN

Stack Overflow用户

发布于 2021-04-29 11:20:45

SNS主题名称必须为AmazonTextract

最后,您的arn应该如下所示:

代码语言:javascript
复制
arn:aws:sns:us-east-2:111111111111:AmazonTextract
票数 1
EN

Stack Overflow用户

发布于 2020-10-29 04:56:31

通过在我的serverless.yml文件中添加一个Lambda执行资源,我可以直接通过Serverless Framework来实现这个功能:

代码语言:javascript
复制
resources:
  Resources:
    IamRoleLambdaExecution:
      Type: AWS::IAM::Role
      Properties:
        AssumeRolePolicyDocument:
          Version: "2012-10-17"
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - lambda.amazonaws.com
                  - textract.amazonaws.com
              Action: sts:AssumeRole

然后,我使用Serverless (用于lambda函数)生成的相同角色作为启动Textract文档分析时的通知通道角色参数:

感谢这个this post为我指明了正确的方向!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56728521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档