What is AWS Textract

由于 Textract 的 Input 可能是很大的 PDF, 也可能是图像, 所以运算时间是不确定的, 有可能长到超过 AWS Lambda 的 15 minutes 的 Limitation. 所以 AWS 提供了一个 Async 的 API: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/textract.html#Textract.Client.start_document_text_detection. 能够发起请求后立刻返回. 而如果你想要 Async 的处理结束后自动继续下一步骤, 推荐的方法是使用 SNS Topic 接受 Textract 完成的信息. 然后有两种后续处理方式. 1 是用 AWS Lambda, 直接触发一个 Lambda 进行处理. 2 是将信息发送给 SQS Queue. 然后由用户自行决定如何做 Long polling. 这两者有利有弊. 直接用 Lambda 简单, 如果数据出错, 可能还是要将出错数据保存到 Dead Letter Queue, 这就跟方法 2 的复杂程度其实差不多了.

Textract 发送给 SNS 的 Message 其实是一个 Json dump 成 String 的形式. 具体 Schema 如下 (参考 https://docs.aws.amazon.com/textract/latest/dg/api-async.html#api-async-get-status):

{
    "JobId": "d6f20ee653647d82229bed53dde14a76188a676e1218b6bc0e52ffc57dd52ac8",
    "Status": "SUCCEEDED",
    "API": "StartDocumentTextDetection",
    "JobTag": "Receipt",
    "Timestamp": 1637887077969,
    "DocumentLocation": {
        "S3ObjectName": "document",
        "S3Bucket": "bucket"
    }
}

而如果你用 SNS 直接触发 AWS Lambda, 那么 Lambda 收到的消息则是:

{
    'Records': [
        {
            'EventSource': 'aws:sns',
            'EventVersion': '1.0',
            'EventSubscriptionArn': 'arn:aws:sns:us-east-1:669508176277:textract-test:3b51e7b5-ec63-4abc-9ea3-a854d6866964',
            'Sns': {
                'Type': 'Notification',
                'MessageId': '3878d011-ed99-5d93-901b-8a0bc33fb38e',
                'TopicArn': 'arn:aws:sns:us-east-1:669508176277:textract-test',
                'Subject': null,
                'Message': '{"JobId":"d6f20ee653647d82229bed53dde14a76188a676e1218b6bc0e52ffc57dd52ac8","Status":"SUCCEEDED","API":"StartDocumentTextDetection","Timestamp":1637887077969,"DocumentLocation":{"S3ObjectName":"landing/lease.png","S3Bucket":"aws-data-lab-sanhe-text-insight-dev"}}',
                'Timestamp': '2021-11-26T00:37:58.001Z',
                'SignatureVersion': '1',
                'Signature': 'TUluYeU2...',
                'SigningCertUrl': 'https://sns.us-east-1.amazonaws.com/SimpleNotificationService-...',
                'UnsubscribeUrl': 'https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:...',
                'MessageAttributes': {}
            }
        }
    ]
}