Amazon Textract StartExpenseAnalysisCommand的NotificationChannel无法推送SNS消息问题
Amazon Textract StartExpenseAnalysis 未触发SNS通知问题排查与解决
核心问题分析
你遇到的问题是Textract完成任务后未通过NotificationChannel推送消息至SNS主题,结合你已确认Lambda订阅正常、手动发消息可触发的情况,问题大概率出在NotificationChannel配置的角色权限不足,以及环境变量引用错误这两点上。
具体解决步骤
1. 修正环境变量引用
你的serverless.yml中当前用外部环境变量传入SNS_TOPIC_ARN和ROLE_ARN,容易出现ARN不匹配的问题。直接引用CloudFormation生成的资源ARN更可靠:
provider: environment: # 替换原来的外部环境变量配置 SNS_TOPIC_ARN: !GetAtt AmazonTextractMyTopicName.TopicArn # 后续我们会创建这个专用角色,先预留引用 ROLE_ARN: !GetAtt TextractNotificationRole.Arn
2. 创建Textract专用通知角色
你当前给Lambda配置的IAM角色不能直接给Textract用,需要创建一个专门的角色,让Textract能承担该角色并向SNS发消息。在resources.Resources下添加:
TextractNotificationRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: textract.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: TextractPublishToSNS PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: sns:Publish Resource: !GetAtt AmazonTextractMyTopicName.TopicArn
3. 验证Lambda角色权限(可选)
你的Lambda角色已经配置了sns:Publish权限,但这个权限是给Lambda自身用的,和Textract的NotificationChannel无关,保持现有配置即可。
4. 确认代码中的参数正确性
确保代码中NotificationChannel的参数和环境变量一致,你的现有代码逻辑没问题,只要环境变量正确就能生效:
const command = new StartExpenseAnalysisCommand({ DocumentLocation: { S3Object: { Bucket: fileObj.s3.bucket.name, Name: fileObj.s3.object.key, }, }, NotificationChannel: { SNSTopicArn: process.env.SNS_TOPIC_ARN, RoleArn: process.env.ROLE_ARN, }, });
关于SQS订阅的疑问
不需要将SQS订阅到该SNS主题。你当前的流程是Textract → SNS → Lambda,第二个Lambda已经直接订阅了SNS主题,任务完成后Textract推送的消息会直接触发Lambda执行,完全满足你的需求,SQS是额外的中间件,当前流程不需要引入。
内容的提问来源于stack exchange,提问作者Ger
相关产品推荐
相关产品推荐

