在亚马逊云科技上构建无服务器应用程序以自动处理发票
支持亚马逊云科技免费套餐
本教程中使用的示例代码来自 GitHub
Amazon Transcribe 是一项基于机器学习模型自动将语音转换为文本的服务。它提供了多种可以提高文本转录准确性的功能,例如语言自定义、内容过滤、多通道音频分析和说话人语音分割。Amazon Transcribe 可用作独立的转录服务,也可以集成到应用程序中提供语音转文本功能。您可以实时转录媒体内容(流式处理),也可以转录位于 Amazon S3 存储桶中的媒体文件(批处理)。
本教程将介绍如何使用 Amazon Transcribe、Amazon Lambda 和 Go 编程语言构建用于语音(音频)转文本的无服务器应用程序。
我们将介绍如何:
- 使用 Amazon CloudFormation 部署解决方案。
- 测试解决方案。
所需的 Go 库:
- Amazon Lambda 的 Go 库。
- Amazon Rekognition 的 Go SDK。
- 用于实现整个解决方案“基础设施即代码” (IaC) 的Amazon Cloud Development Kit (Amazon CDK) 的 Go 绑定 以及 Amazon CDK CLI。
应用程序概览
点击图片放大以下是应用程序的运作方式:
- 上传到 Amazon S3 的发票收据图片触发 Lambda 函数。
- Lambda 函数提取发票元数据(例如 ID、日期、金额)并将其保存到 Amazon DynamoDB 表。
前提条件
在开始之前,请了解以下信息:
- 亚马逊云科技账户(如果您还没有,可以创建一个并在此处设置您的环境)。
- Go 编程语言(v1.18 或更高版本)。
- Amazon CDK。
- Amazon CLI。
- Git。
使用 Amazon CDK 部署解决方案
克隆项目并切换到正确的目录:
git clone https://github.com/build-on-aws/amazon-textract-lambda-golang-example
cd amazon-textract-lambda-golang-example
Amazon CDK 是一个框架,支持将云基础设施定义为所支持编程语言的代码,并通过 Amazon CloudFormation 进行预配。
要开始部署,请调用 cdk deploy 命令。您会看到将要创建的资源列表,您确认之后流程才能继续。
cd cdk
cdk deploy
# output
Bundling asset TextractInvoiceProcessingGolangStack/textract-function/Code/Stage...
✨ Synthesis time: 5.26
//.... omitted
Do you wish to deploy these changes (y/n)? y
输入 y 开始创建应用程序所需的亚马逊云科技资源。
如果您想查看将在后台使用的 Amazon CloudFormation 模板,请运行 cdk synth 并查看 cdk.out 文件夹
您可以在终端跟踪堆栈创建进度,也可以前往亚马逊云科技管理控制台进行查看:CloudFormation > Stacks > TextractInvoiceProcessingGolangStack。
创建的资源:
- 一个 S3 存储桶 - 用于上传图像的源存储桶。
- Lambda 函数,用于使用 Amazon Textract 处理发票图片。
- 一张 DynamoDB 表,用于存储每个图像的标签数据。
- 其他一些组件(如 IAM 角色等)
您还将在终端看到以下输出(在您的使用场景中,资源名称会有所不同)- 这些是 CDK 创建的 S3 存储桶的名称:
✅ TextractInvoiceProcessingGolangStack
✨ Deployment time: 113.51s
Outputs:
TextractInvoiceProcessingGolangStack.invoiceinputbucketname = textractinvoiceprocessin-invoiceimagesinputbucket-bro1y13pib0r
TextractInvoiceProcessingGolangStack.invoiceoutputtablename = textractinvoiceprocessin-invoiceimagesinputbucket-bro1y13pib0r_invoice_output
.....
现在,您已准备好验证解决方案。
从发票中提取费用元数据
验证该解决方案时,可以使用自己的图像,也可以使用 GitHub 存储库中提供的示例文件,该存储库包含一些示例发票。使用 Amazon CLI 上传文件:
export SOURCE_BUCKET=<enter source S3 bucket name from the CDK output>
aws s3 cp ./invoice1.jpeg s3://$SOURCE_BUCKET
# verify that the file was uploaded
aws s3 ls s3://$SOURCE_BUCKET
此 Lambda 函数将从图片中提取发票数据(ID、总金额等),并将其存储在 DynamoDB 表中。
上传其他文件:
export SOURCE_BUCKET=<enter source S3 bucket name - check the CDK output>
aws s3 cp ./invoice2.jpeg s3://$SOURCE_BUCKET
aws s3 cp ./invoice3.jpeg s3://$SOURCE_BUCKET
在亚马逊云科技管理控制台中查看 DynamoDB 表,您应该会看到提取的发票信息。
DynamoDB 表在设计时使用 partition 键作为源文件名。这样,可以检索给定图片的所有发票数据。
您可以使用 Amazon CLI 查询 DynamoDB 表:
aws dynamodb scan --table-name <enter table name - check the CDK output>
Lambda 函数代码概览
下面简要概述了 Lambda 函数逻辑。请注意,为了简洁起见,此处省略了一些代码(错误处理、日志记录等),因为我们只需要关注重要的部分。
func handler(ctx context.Context, s3Event events.S3Event) {
for _, record := range s3Event.Records {
sourceBucketName := record.S3.Bucket.Name
fileName := record.S3.Object.Key
err := invoiceProcessing(sourceBucketName, fileName)
}
}
当发票图片上传到源存储桶时,会触发 Lambda 函数。该函数遍历发票列表,并对每张发票调用 invoiceProcessing 函数。
我们来仔细研究一下 invoiceProcessing 函数。
func invoiceProcessing(sourceBucketName, fileName string) error {
resp, err := textractClient.AnalyzeExpense(context.Background(), &textract.AnalyzeExpenseInput{
Document: &types.Document{
S3Object: &types.S3Object{
Bucket: &sourceBucketName,
Name: &fileName,
},
},
})
for _, doc := range resp.ExpenseDocuments {
item := make(map[string]ddbTypes.AttributeValue)
item["source_file"] = &ddbTypes.AttributeValueMemberS{Value: fileName}
for _, summaryField := range doc.SummaryFields {
if *summaryField.Type.Text == "INVOICE_RECEIPT_ID" {
item["receipt_id"] = &ddbTypes.AttributeValueMemberS{Value: *summaryField.ValueDetection.Text}
} else if *summaryField.Type.Text == "TOTAL" {
item["total"] = &ddbTypes.AttributeValueMemberS{Value: *summaryField.ValueDetection.Text}
} else if *summaryField.Type.Text == "INVOICE_RECEIPT_DATE" {
item["receipt_date"] = &ddbTypes.AttributeValueMemberS{Value: *summaryField.ValueDetection.Text}
} else if *summaryField.Type.Text == "DUE_DATE" {
item["due_date"] = &ddbTypes.AttributeValueMemberS{Value: *summaryField.ValueDetection.Text}
}
}
_, err := dynamodbClient.PutItem(context.Background(), &dynamodb.PutItemInput{
TableName: aws.String(table),
Item: item,
})
}
return nil
}
- invoiceProcessing 函数调用 Amazon Textract AnalyzeExpense API,以提取发票数据。
- 然后,该函数遍历 ExpenseDocument 并从特定字段提取信息 - INVOICE_RECEIPT_ID、TOTAL、INVOICE_RECEIPT_DATE、DUE_DATE。
- 然后,该函数将提取的发票元数据保存在 DynamoDB 表中。
清理资源
完成后,只需使用以下命令删除所有服务:
cdk destroy
#output prompt (choose 'y' to continue)
Are you sure you want to delete: RekognitionLabelDetectionGolangStack (y/n)?
总结
在本教程中,您使用 Amazon CDK 部署了 Go Lambda 函数,以使用 Amazon Textract 处理发票图片,并将结果存储在 DynamoDB 表中。