我正在使用Amazon Textract的StartDocumentAnalysis函数从 S3 存储桶中异步扫描 .pdf 文件。正如文档所说,我应该收到有关所提供 SNS 主题的作业状态的通知。
StartDocumentAnalysis
JobId
返回用于获取操作结果的作业标识符 ( )。文本分析完成后,Amazon Textract 将完成状态发布到您在 中指定的 Amazon Simple Notification Service (Amazon SNS) 主题NotificationChannel
。
我用来开始分析的代码如下所示:
fun analyzeDocument(documentId: String) {
klogger.info { "Start Textract analysis on document '$documentId'" }
val request = StartDocumentAnalysisRequest()
.withFeatureTypes("TABLES", "FORMS")
.withDocumentLocation(DocumentLocation()
.withS3Object(S3Object()
.withName(documentId)
.withBucket(bucketName)
)
)
.withNotificationChannel(NotificationChannel()
.withSNSTopicArn(snsTopicArn)
.withRoleArn(snsRoleArn)
)
val jobId = textract.startDocumentAnalysis(request).jobId
klogger.info { "Analysis started for document '$documentId'. Job ID: '$jobId'" }
}
我在 AWS 控制台中创建了 SNS。
snsTopicArn = arn:aws:sns:us-east-1:093475263507:textract-result.fifo
snsRoleArn = arn:aws:iam::093475263507:role/SNSSuccessFeedback
我可以从控制台手动向该 SNS 发布一条消息,但来自 Textract 的任何消息都不会进入 SNS 主题。我已经等了几个小时了——我怀疑现在我已经收到了消息。
我不确定这snsRoleArn
是否正确。我只是使用了一些我在 AWS 中已经拥有的随机的。这会是个问题吗?我应该使用哪个snsRoleArn
?如果不是这样,为什么我没有收到消息?
我会在访问策略中遗漏一些东西吗?
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:GetTopicAttributes",
"SNS:SetTopicAttributes",
"SNS:AddPermission",
"SNS:RemovePermission",
"SNS:DeleteTopic",
"SNS:Subscribe",
"SNS:ListSubscriptionsByTopic",
"SNS:Publish",
"SNS:Receive"
],
"Resource": "arn:aws:sns:us-east-1:093475263507:textract-result.fifo",
"Condition": {
"StringEquals": {
"AWS:SourceOwner": "093475263507"
}
}
}
]
}