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

这个示例展示了完整的流程:

  1. 监听 S3 存储桶的文件上传事件
  2. 自动触发 Lambda 函数
  3. 调用 Textract 分析文档内容
  4. 提取并处理返回的文本块

Textract 返回的块包含丰富的元数据,您可以根据 BlockType 字段进一步分类处理(如 “LINE”, “WORD”, “PAGE” 等)。

回到顶部