Golang结合AWS Lambdas与Textract的应用实践
Golang结合AWS Lambdas与Textract的应用实践 大家好,
有谁知道任何示例或易于理解的教程、课程或书籍,可以帮助阐明如何使用 Go 创建 Lambda 函数,将 S3 存储桶中的项目推送到 AWS Textract,然后与返回的块进行交互?
我目前仅处于可以部署一个非常简单的 Go Lambda 阶段(并且它能够正常工作),但在处理存储桶中的文件以调用 Textract 时感到有些困惑。
如果有任何有用的指引,我将不胜感激。
谢谢。
2 回复
感谢。我注意到 AWS Lambda 现在也支持 PowerShell 6 及以上版本了。或许可以尝试一下。
更多关于Golang结合AWS Lambdas与Textract的应用实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
以下是一个完整的 Go Lambda 函数示例,演示如何从 S3 存储桶读取文件,调用 Textract 进行分析,并处理返回的文本块:
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/textract"
)
type TextractProcessor struct {
textractClient *textract.Textract
s3Client *s3.S3
}
func NewTextractProcessor() *TextractProcessor {
sess := session.Must(session.NewSession())
return &TextractProcessor{
textractClient: textract.New(sess),
s3Client: s3.New(sess),
}
}
func (tp *TextractProcessor) ProcessS3Object(bucket, key string) (*textract.DetectDocumentTextOutput, error) {
input := &textract.DetectDocumentTextInput{
Document: &textract.Document{
S3Object: &textract.S3Object{
Bucket: aws.String(bucket),
Name: aws.String(key),
},
},
}
return tp.textractClient.DetectDocumentText(input)
}
func (tp *TextractProcessor) ExtractTextBlocks(result *textract.DetectDocumentTextOutput) []string {
var blocks []string
for _, block := range result.Blocks {
if *block.BlockType == "LINE" && block.Text != nil {
blocks = append(blocks, *block.Text)
}
}
return blocks
}
func handler(ctx context.Context, s3Event events.S3Event) error {
processor := NewTextractProcessor()
for _, record := range s3Event.Records {
bucket := record.S3.Bucket.Name
key := record.S3.Object.Key
log.Printf("Processing file: s3://%s/%s", bucket, key)
// 调用 Textract 分析文档
result, err := processor.ProcessS3Object(bucket, key)
if err != nil {
return fmt.Errorf("Textract processing failed: %v", err)
}
// 提取文本块
textBlocks := processor.ExtractTextBlocks(result)
log.Printf("Extracted %d text blocks:", len(textBlocks))
for i, block := range textBlocks {
log.Printf("Block %d: %s", i+1, block)
}
// 这里可以添加进一步处理逻辑
// 例如存储到数据库或发送到其他服务
}
return nil
}
func main() {
lambda.Start(handler)
}
部署配置文件 template.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
TextractProcessorFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: .
Handler: main
Runtime: go1.x
Policies:
- S3ReadPolicy:
BucketName: !Ref SourceBucket
- TextractFullAccess
Events:
S3Trigger:
Type: S3
Properties:
Bucket: !Ref SourceBucket
Events: s3:ObjectCreated:*
SourceBucket:
Type: AWS::S3::Bucket
Go 模块依赖 go.mod:
module textract-processor
go 1.x
require (
github.com/aws/aws-lambda-go v1.41.0
github.com/aws/aws-sdk-go v1.44.328
)
构建和部署命令:
# 构建 Lambda 函数
GOOS=linux GOARCH=amd64 go build -o main
# 使用 SAM 部署
sam deploy --guided
这个示例展示了完整的流程:
- 监听 S3 存储桶的文件上传事件
- 自动触发 Lambda 函数
- 调用 Textract 分析文档内容
- 提取并处理返回的文本块
Textract 返回的块包含丰富的元数据,您可以根据 BlockType 字段进一步分类处理(如 “LINE”, “WORD”, “PAGE” 等)。

