【免费下载链接】aws-cdk-examplesExample projects using the AWS CDK项目地址https://gitcode.com/gh_mirrors/aw/aws-cdk-examples点击查看免费下载导读本文以aws-cdk-examples仓库中的 go/rekognition-lambda-s3-trigger 示例为主线系统讲解如何用 AWS CDKGo 语言搭建一条对象存储 → 事件触发 → AI 图像识别 → 结果落库的完整链路。读完本文你将掌握 CDK 基础设施代码S3、DynamoDB、Lambda、IAM、事件通知与 Lambda 处理器RekognitionDetectLabels调用、DynamoDB 写入的完整实现并能直接cdk deploy部署验证。架构与工作原理该示例在 AWS 账户中创建以下资源源自 README 的 How it works 一节S3 存储桶用于存放待识别的图片对象DynamoDB 表存储 Rekognition 识别出的标签labels结果Lambda 函数当新图片上传到 S3 时被自动触发调用 AWS Rekognition 执行图像分类标签识别角色与策略Roles and Policies为上述资源之间的访问授予最小必要权限Rekognition 标签结果被写入 DynamoDB 表。整体数据流为开发者通过 AWS CLI 或 SDK 向 S3 上传.jpg/.jpeg/.png图片 → S3 产生OBJECT_CREATED事件通知 → Lambda 被触发 → Lambda 用 AWS SDK 调用 RekognitionDetectLabels识别图片中的物体/场景标签 → 将图片名 标签列表写入 DynamoDB 表。基础设施代码解析CDK Go 栈核心栈定义位于 rekognition-lambda-s3-trigger.go入口main()通过awscdk.NewApp创建应用并合成RekognitionLambdaS3TriggerStack。env()函数返回nil表示按默认账户/区域部署由环境变量或本地配置决定。1. 创建 S3 存储桶// Create S3 Bucket bucket : awss3.NewBucket(stack, jsii.String(Bucket), awss3.BucketProps{ RemovalPolicy: awscdk.RemovalPolicy_DESTROY, })RemovalPolicy_DESTROY表示删除栈cdk destroy时一并删除桶适合示例/开发环境生产环境建议改为RETAIN防止误删数据。2. 创建 DynamoDB 表// Create DynamoDb table table : awsdynamodb.NewTable(stack, jsii.String(Classifications), awsdynamodb.TableProps{ PartitionKey: awsdynamodb.Attribute{ Name: jsii.String(image_name), Type: awsdynamodb.AttributeType_STRING, }, RemovalPolicy: awscdk.RemovalPolicy_DESTROY, })表逻辑 ID 为Classifications分区键image_name字符串类型对应每个 S3 对象的 key默认按需计费on-demand计费模式未显式配置BillingMode时使用默认值对于低频演示场景足够。3. 创建 Go Lambda 函数含本地打包//Create Lambda function function : awscdklambdagoalpha.NewGoFunction(stack, jsii.String(main), awscdklambdagoalpha.GoFunctionProps{ Runtime: awslambda.Runtime_PROVIDED_AL2023(), Entry: jsii.String(./lambda-handler), Bundling: awscdklambdagoalpha.BundlingOptions{ GoBuildFlags: jsii.Strings(-ldflags -s -w), }, Environment: map[string]*string{ BUCKET_NAME: bucket.BucketName(), TABLE_NAME: table.TableName(), }, })使用 alpha 模块awscdklambdagoalpha/v2的NewGoFunctionCDK 在合成阶段自动对./lambda-handler目录下的 Go 代码执行编译与打包bundling无需手动预编译二进制运行时为PROVIDED_AL2023Go 自定义运行时基于 Amazon Linux 2023-ldflags -s -w用于剥离符号表与调试信息减小产物体积通过环境变量把BUCKET_NAME与TABLE_NAME注入 Lambda处理器运行时无需硬编码资源名。4. 授权 Rekognition 识别权限statement : awsiam.NewPolicyStatement(awsiam.PolicyStatementProps{ Actions: []*string{jsii.String(rekognition:DetectLabels)}, Resources: []*string{jsii.String(*)}, }) function.AddToRolePolicy(statement)为 Lambda 执行角色追加一条内联策略仅授予rekognition:DetectLabels一个动作注意Resources: *Rekognition 的DetectLabels接口不需要指定具体的资源 ARN属于 API 级权限此处通配符是必要的。5. S3 事件通知按文件后缀过滤触发//Add event notifications for bucket bucket.AddEventNotification(awss3.EventType_OBJECT_CREATED, awss3notifications.NewLambdaDestination(function), awss3.NotificationKeyFilter{ Suffix: jsii.String(.jpg), }) bucket.AddEventNotification(awss3.EventType_OBJECT_CREATED, awss3notifications.NewLambdaDestination(function), awss3.NotificationKeyFilter{ Suffix: jsii.String(.jpeg), }) bucket.AddEventNotification(awss3.EventType_OBJECT_CREATED, awss3notifications.NewLambdaDestination(function), awss3.NotificationKeyFilter{ Suffix: jsii.String(.png), })监听OBJECT_CREATED对象创建事件将 Lambda 作为事件目标destinationCDK 会自动生成对应的 Lambda 资源策略resource policy允许 S3 调用通过NotificationKeyFilter.Suffix限定只处理.jpg、.jpeg、.png三种图片格式避免其他类型对象如文本、视频触发无意义的识别调用。6. 授予读写权限table.GrantReadWriteData(function) bucket.GrantReadWrite(function, nil)table.GrantReadWriteData自动为 Lambda 执行角色附加 DynamoDB 表的读写策略bucket.GrantReadWrite附加 S3 桶的读写策略让 Lambda 能从桶中读取图片对象供 Rekognition 拉取。7. CloudFormation 输出Outputs栈末尾定义了 4 个输出见 rekognition-lambda-s3-trigger.go#L82-L96输出逻辑名含义UploadImageToS3直接给出可复制的上传命令aws s3 cp local-path-to-image s3://bucket/用于触发识别流程DynamoDBTableDynamoDB 表名识别结果存储位置LambdaFunctionLambda 函数名LambdaFunctionLogsLambda 对应的 CloudWatch 日志组名方便排查运行日志Lambda 处理器源码解析处理器位于 lambda-handler/main.go通过lambda.Start(handler)注册入口使用 AWS SDK for Go v2aws-sdk-go-v2访问 Rekognition 与 DynamoDB。事件结构解析type Event struct { Records []struct { S3 struct { Object struct { Key string json:key } json:object } json:s3 } json:Records }只解析所需字段Records[0].S3.Object.Key即被上传对象的 key图片名并以此为图片名与识别结果的关联键。调用 Rekognition DetectLabelsdetectLabelsInput : rekognition.DetectLabelsInput{ Image: rekognitionTypes.Image{ S3Object: rekognitionTypes.S3Object{ Bucket: aws.String(os.Getenv(BUCKET_NAME)), Name: aws.String(key), }, }, MaxLabels: aws.Int32(10), MinConfidence: aws.Float32(70), } detectLabelsOutput, err : rekognitionClient.DetectLabels(context.TODO(), detectLabelsInput)图片源直接指向 S3 对象Rekognition 服务端从桶中拉取图片Lambda 无需下载图片再上传当然读取桶对象仍需 S3 读权限即前面bucket.GrantReadWrite的作用MaxLabels 10最多返回 10 个标签MinConfidence 70只保留置信度 ≥ 70% 的标签过滤掉低置信度的噪声结果识别出的标签名收集进labels切片并通过fmt.Println输出到 CloudWatch 日志。写入 DynamoDB防重复putItemInput : dynamodb.PutItemInput{ TableName: aws.String(tableName), Item: map[string]types.AttributeValue{ image_name: types.AttributeValueMemberS{Value: key}, labels: types.AttributeValueMemberS{Value: fmt.Sprintf(%v, labels)}, }, ConditionExpression: aws.String(attribute_not_exists(image_name)), }主键image_name存入图片 key属性labels存入标签列表以 Go 切片格式化字符串存储通过ConditionExpression: attribute_not_exists(image_name)保证同一图片只写入一次重复上传同名对象不会产生多条记录——这是一个容易被忽略的幂等细节。部署与验证依赖与运行环境先确认满足前置条件已配置 AWS 凭证aws configure或环境变量且本机已安装 AWS CDK CLI 与 Go 1.25go.mod 声明go 1.25.0。管理 Go 依赖按 README 的说明运行go mod tidy该命令根据go.mod/go.sum整理依赖。本项目依赖包括 CDK Go 模块awscdk/v2 v2.262.0、alpha 模块awscdklambdagoalpha/v2以及aws-lambda-go、aws-sdk-go-v2dynamodb、rekognition等详见 go.mod。合成 CloudFormation 模板cdk synthcdk.json 中的app字段定义为{ app: go mod download go run rekognition-lambda-s3-trigger.go }即每次合成时先自动下载 Go 依赖再运行栈程序把生成的 CloudFormation 模板输出到cdk.out目录。cdk synth不产生任何真实云资源适合在部署前审查生成的模板。部署cdk deploycdk deploy将栈部署或重新部署到你的 AWS 账户。部署完成后根据控制台输出的UploadImageToS3提示上传一张图片触发流程aws s3 cp local-path-to-image s3://bucket/随后可到 DynamoDB 控制台查看以image_name为分区键的记录或在 CloudWatch 日志组中查看 Lambda 打印的标签列表。单元断言测试仓库附带 rekognition-lambda-s3-trigger_test.go属于 CDK 模板断言测试无需真实部署即可运行通过assertions.Template_FromStack合成栈模板断言资源数量与属性例如AWS::S3::Bucket资源数量为 1AWS::DynamoDB::Table的AttributeDefinitions包含image_name类型S。可运行go test ./...或cdk test验证基础设施代码的正确性防止后续改动破坏资源配置。扩展与注意事项支持更多图片格式若需处理.gif、.webp等格式参照 rekognition-lambda-s3-trigger.go#L69-L77 追加AddEventNotification与对应的NotificationKeyFilter.Suffix即可调整识别精度MaxLabels与MinConfidence两个参数可根据业务在 lambda-handler/main.go#L41-L50 中调整例如电商图片可提高置信度阈值生产化改造示例中使用RemovalPolicy_DESTROY、env()返回nil等开发友好的默认值生产部署应显式指定环境account/region并为桶、表设置合适的删除保护与备份策略结果存储结构labels以字符串形式存储 Go 切片格式化结果若需要结构化查询如按标签检索可考虑将标签拆分为 List 类型属性或单独建立二级索引。本文所涉及的完整代码、测试与配置均可直接参考 go/rekognition-lambda-s3-trigger 目录下的源码进行二次开发。赞分享【免费下载链接】aws-cdk-examplesExample projects using the AWS CDK项目地址https://gitcode.com/gh_mirrors/aw/aws-cdk-examples点击查看免费下载相关推荐AWS CDK Go 实战构建 Lambda 函数写入 DynamoDB 的无服务器示例AWS CDK Go 实战构建 Lambda 函数写入 DynamoDB 的无服务器示例 本指南基于 aws cdk examples 仓库中的 Go 语言示aws-cdk-examples Go 实战从容器镜像部署 Lambda 并触发 S3 事件通知aws cdk examples Go 实战从容器镜像部署 Lambda 并触发 S3 事件通知 本指南以 aws cdk examples 仓库中 go/l30分钟上手用AWS SDK for Go Rekognition构建企业级图像识别系统30分钟上手用AWS SDK for Go Rekognition构建企业级图像识别系统 AWS SDK for Go是Go编程语言的AWS开发工具包它后端云原生开发工具上一篇CyclopsLevelBuilder性能优化技巧让你的大型关卡运行如丝般顺滑下一篇Flutter GetX网络请求终极指南掌握API错误处理与重试机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考