基于 AWS CDK (Go) 构建 S3 上传触发 Rekognition 图像识别并写入 DynamoDB 的完整实战
【免费下载链接】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),仅供参考

相关新闻

Unity BakeMesh粒子层级问题解决:从原理到Shader排序实战

Unity BakeMesh粒子层级问题解决:从原理到Shader排序实战

简介:这份资源聚焦Unity开发中粒子特效与UI层级冲突的常见难题,面向需要将粒子效果嵌入界面、并希望像UGUI一样灵活控制层级的开发者。内容围绕BakeMesh方案展开,对比了RenderTexture渲染与多Canvas调整Sort in Layer两种传统思路的优劣&…

2026/10/15 2:19:18 阅读更多 →
空间锚点建模:打工人可复用的AI能力迁移方法论

空间锚点建模:打工人可复用的AI能力迁移方法论

1. 这不是玄学,是可复现的驾驶能力迁移实验最近刷屏的“科目二AI两把过关”视频,表面看是段子,实则藏着一套被低估的、可拆解、可复现的能力迁移路径。我连续两周蹲守驾校训练场,跟拍了6位真实学员(含3位零基础打工人&…

2026/10/15 2:19:18 阅读更多 →
Unity Cloud Content Delivery:面向热更新的原生资源分发方案

Unity Cloud Content Delivery:面向热更新的原生资源分发方案

1. 项目概述:这不是“云存储”,而是为Unity游戏量身定制的资源分发流水线Unity Cloud Content Delivery(UCD)这个名字刚出现时,我第一反应是:“又一个带‘Cloud’的营销词?”——直到在某次跨平…

2026/10/15 2:19:18 阅读更多 →

最新新闻

基于 Docker 构建 syncthing-android 应用:从 Builder 镜像到 APK 产物的完整实践指南

基于 Docker 构建 syncthing-android 应用:从 Builder 镜像到 APK 产物的完整实践指南

移动开发数据同步 【免费下载链接】syncthing-android Wrapper of syncthing for Android. 项目地址: https://gitcode.com/gh_mirrors/sy/syncthing-android 点击查看 免费下载 导读:syncthing-android 是 Syncthing 的 Android 封装版,其核…

2026/10/15 2:53:29 阅读更多 →
Vue实战技巧总结

Vue实战技巧总结

动态组件缓存失效?你可能漏了这行关键配置 上周排查一个生产环境 bug:管理后台的标签页切换时,每次都会重新请求接口,明明用了 !打开 Chrome 性能面板才发现,被缓存的组件实例在切换路由时被销毁了。你一定…

2026/10/15 2:53:29 阅读更多 →
AI识别,为什么总卡在“最后一公里”?

AI识别,为什么总卡在“最后一公里”?

很多无人机项目,问题从来不是“识别不出来”。 真正让人头疼的是—— 前端已经识别到异常,指挥中心看到的,却还是一条普通视频。 画面里,目标明明已经被锁定。 人员入侵、烟火异常、车辆滞留,算法早就看到了。 可到了大…

2026/10/15 2:53:29 阅读更多 →
Tomcat启动报错BindException:1099端口被占?Windows端口排查与解决

Tomcat启动报错BindException:1099端口被占?Windows端口排查与解决

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 2:53:29 阅读更多 →
2026论文降AIGC平台:11款工具实测谁才是真神器?

2026论文降AIGC平台:11款工具实测谁才是真神器?

本次测评基于真实论文样本实测与用户反馈汇总,对 11 款主流中英文降 AI、降重平台进行深度横向对比,目标是帮大家找到真正能稳定通过审核的解决方案。测评结果显示,千笔AI凭借超 98% 的优化准确率、全检测平台适配能力及价格超高性价比&#…

2026/10/15 2:53:29 阅读更多 →
Positron 的 McpClient 数据模型:stdio 桥接下编码 Agent 连接的结构化描述

Positron 的 McpClient 数据模型:stdio 桥接下编码 Agent 连接的结构化描述

开发工具代码编辑器数据科学 【免费下载链接】positron Positron, a next-generation data science IDE 项目地址: https://gitcode.com/gh_mirrors/po/positron 点击查看 免费下载 导读 本文围绕 Positron 开源仓库中由 OpenAPI 生成器产出的数据模型文档 McpCli…

2026/10/15 2:52:28 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →