新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于 AWS SDK for .NET (v3) 构建无服务器照片资产管理应用(PAM)实战指南

发布时间:2026/9/25 8:21:38来源:尧图网络
基于 AWS SDK for .NET (v3) 构建无服务器照片资产管理应用(PAM)实战指南
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载导读本篇指南以 AWS Code Examples 仓库中 dotnetv3/cross-service/PhotoAssetManager 示例为核心完整讲解如何用 AWS SDK for .NET (v3) 与无服务器架构构建一个照片资产管理Photo Asset ManagementPAM应用用户上传图片后由 Amazon Rekognition 自动识别标签并存入 Amazon DynamoDB用户可依据标签筛选图片系统将其打包为 zip 并通过 Amazon SNS 发送可下载链接。读完本文你将掌握项目整体架构、四个 .NET 解决方案工程的角色划分、核心服务的源码级实现、CDK 资源定义、本地开发调试方法以及资源的创建与删除全流程。应用架构总览PAM 示例应用采用无服务器serverless架构核心数据流为上传图片 → 标签检测 → 标签存储 → 按标签检索打包 → 通知下载。完整的应用级说明含前端 React 应用与 CDK 基础设施位于仓库的 applications/photo-asset-manager 目录。PAM 应用架构总览架构中的关键 AWS 服务角色如下Amazon S3智能分层存储图片以 S3 Intelligent-Tiering 存储类别保存实现成本优化另设一个工作桶working bucket存放打包产物。Amazon Rekognition对上传的新图片执行标签检测label detection识别图像内容。Amazon DynamoDB存储每个标签与其关联图片列表是“按标签检索图片”的数据基础。AWS Lambda Amazon API Gateway提供无服务器 API 端点上传、查询标签、打包下载。Amazon SNS下载打包完成后向订阅者发送包含下载链接的通知消息。前端React Cloudscape 与 Cognito前端是一个基于 Cloudscape Design System 的单一 React 应用用户通过 Amazon Cognito 流程完成身份认证。应用通过 AWS CDK 堆栈部署到 S3 桶并由 Amazon CloudFront 分发对外公开分发域名在 CDK 部署期间动态生成。前端的核心源码Vite React TypeScript位于 applications/photo-asset-manager/elros-pamAPI 调用封装在 pam-api.ts。PAM 前端界面后端四类 Lambda 函数后端由以下 AWS Lambda 函数协同完成业务逻辑函数触发器职责LabelsAPI GatewayServerless API 端点返回 S3 存储桶中图片的标签列表及每个标签的计数UploadAPI GatewayServerless API 端点返回用于上传图片的预签名 URLpresigned URLDetectLabelsFunctionS3 事件对象创建新图片落入存储桶时触发调用 Amazon Rekognition 分析将标签信息写入 DynamoDBDownloadFunctionAPI Gateway按标签列表把图片打包为 zip 存入工作桶并生成预签名下载链接同时通过 SNS 发送通知前提条件要运行本示例代码需要准备一个 AWS 账号.NET 6Docker DesktopCDK 部署流程要求 Docker 处于运行状态NodeJS 18配置好 AWS SDK for .NET 开发环境可参考 AWS 官方 SDK for .NET 环境设置文档。创建 AWS 资源CDK资源创建遵循 applications/photo-asset-manager/cdk/README.md 中的指引使用 AWS CDK 或 AWS CLI 创建并管理本示例所需的基础设施。CDK 代码以 TypeScript 编写入口配置见 cdk.json核心堆栈定义位于 stack.ts。在部署时CDK 堆栈会按所选语言选项打包对应项目选择dotnet语言选项时打包并部署PamApi项目选择dotnetla选项时打包并部署PamApiAnnotations项目。资源定义的源码级细节CDK 侧的资源构造定义在 resources.ts其中存储桶storage bucket配置了允许PUT方法的 CORS 规则并通过生命周期规则在对象写入 1 天后转存至StorageClass.INTELLIGENT_TIERING智能分层存储removalPolicy: RemovalPolicy.DESTROY与autoDeleteObjects: true表示堆栈删除时同步销毁桶与桶内对象。工作桶working bucket用于存放 zip 打包产物配置了24 小时过期删除的生命周期规则避免下载链接失效后残留无用文件。标签表LabelsTableDynamoDB 表分区键为Label字符串类型与 .NET 侧实体映射的分区键属性一致。Lambda 函数、API 网关与认证Cognito的构造分别定义在 lambdas.ts、api.ts 与 auth.ts。解决方案工程结构PhotoAssetManager.slnVisual Studio 解决方案 PhotoAssetManager.sln 包含四个具有不同职责的项目Lambda 函数统一使用 AWS Powertools for Lambda (.NET) 增强日志能力PamApiLambda Serverless API 项目包含 Serverless 端点的 ApiController、开发环境用的 Swagger UI以及独立的 Download 与 DetectLabels 函数。这是选择dotnet语言选项时打包部署的项目。PamApiAnnotations基于 Lambda Annotations for .NET 的版本以注解方式实现 Serverless 端点对应 CDK 的dotnetla语言选项。PamServicesC# 类库项目承载共享类、自定义服务与业务逻辑这些服务通过各 API 项目Startup.cs中的依赖注入DI注入到 API 项目中。PamServices.TestXUnit 测试项目为 PamServices 各类提供单元测试。核心服务实现PamServices 源码剖析PamServices 是全部业务逻辑的承载层各服务分别封装对 Rekognition、DynamoDB、S3、SNS 的调用构造函数均采用接口注入的依赖注入风格便于单元测试替换为 mock。ImageServiceRekognition 标签检测ImageService.cs 中DetectLabels方法构造DetectLabelsRequest以 S3 对象Bucket Name/Key作为图片来源调用DetectLabelsAsync最终返回Labels集合中的标签名称列表public async TaskListstring DetectLabels(string objectKey, string bucket) { var detectResponses await _amazonRekognition.DetectLabelsAsync(new DetectLabelsRequest { Image new Image { S3Object new S3Object { Bucket bucket, Name objectKey } } }); return detectResponses.Labels.Select(response response.Name).ToList(); }LabelServiceDynamoDB 标签读写LabelService.cs 基于IDynamoDBContextDynamoDB Object Persistence 模型完成以下操作CreateItem通过SaveAsync写入新标签再LoadAsync回读确认GetAllItems使用FromScanAsync全表扫描并按键名LabelID升序返回AddImageLabels为一个图片名批量追加多个标签内部逐标签调用AddImageToLabelGetAllImagesForLabels按标签列表逐个LoadAsync读取合并所有关联图片名后Distinct()去重返回唯一图片集合。AddImageToLabel通过GetNewOrExistingLabelRecord读取已有标签记录若该标签下尚无此图片则追加并更新计数再SaveAsync回写。实体模型 Label.cs 用[DynamoDBTable(Label)]声明表名用[DynamoDBProperty]映射LabelID、Images列表与Count计数三个属性。StorageService预签名 URL 与 zip 打包StorageService.cs 是本例最具含金量的实现包含三类能力上传预签名 URLGetPresignedUrlForImage用Guid.NewGuid()生成全局唯一文件名uuid-fileName签发 5 分钟有效期的PUT预签名 URLContentType固定为image/jpeg。zip 打包GenerateZipFromImages依次从存储桶GetObjectAsync拉取每个图片对象的流以CompressionLevel.NoCompression写入ZipArchive内存流图片本身已是压缩格式故不再重复压缩以省 CPU随后通过 S3 分片上传multipart upload写入工作桶。下载预签名 URLGetPresignedUrlForArchive对 zip 对象签发24 小时有效的GET预签名 URL供通知消息引用。分片上传内部拆分为三步InitiateUploadZip发起上传拿到UploadIdUploadZip以 5MB5 * 2^20字节为分片大小循环UploadPartAsyncCompleteUploadZip通过AddPartETags汇总各分片 ETag 后CompleteMultipartUploadAsync完成上传。NotificationServiceSNS 通知NotificationService.cs 封装PublishRequestSubject、TopicArn、Message通过PublishAsync向主题订阅者发送通知消息。API 端点与 Lambda 函数实现ApiControllerServerless 端点ApiController.cs 通过构造函数注入StorageService、LabelService、ImageService对外暴露以下路由方法路由说明PUT/upload接收UploadRequest含file_name从环境变量读取STORAGE_BUCKET_NAME返回包含上传预签名 URL 的UploadResponseGET/labels读取全部标签以LabelsResponseDictionarystring, LabelCount每个标签带计数返回GET/test-insert测试端点直接以给定标签与图片列表写入一条标签记录GET/test-detect测试端点对指定桶/键的图片执行DetectLabels并写入标签LabelsResponse见 LabelsResponse.cs把Label列表转换为以标签名为键、以count为值的字典供前端渲染标签云。DetectLabelsFunctionS3 事件驱动DetectLabelsFunction.cs 接收S3EventFunctionHandler(S3Event evnt, ILambdaContext context)从evnt.Records[0].S3取出对象 Key 与桶名调用ImageService.DetectLabels后通过LabelService.AddImageLabels写入标签全程使用 PowertoolsLogger记录处理对象与识别结果。构造函数从LABELS_TABLE_NAME环境变量读取表名并通过AWSConfigsDynamoDB.Context.AddMapping(new TypeMapping(typeof(Label), labelsTableName))完成实体到 DynamoDB 表的动态映射。该类同时提供接收IAmazonS3的构造函数便于 Lambda 环境之外注入 mock 测试。DownloadFunction打包 通知DownloadFunction.cs 的FunctionHandler接收DownloadRequest含labels列表依次执行读取环境变量STORAGE_BUCKET_NAME、WORKING_BUCKET_NAME、NOTIFICATION_TOPIC调LabelService.GetAllImagesForLabels得到去重后的图片键集合调StorageService.GenerateZipFromImages生成 zip 并返回下载预签名 URL调NotificationService.SendNotification向NOTIFICATION_TOPIC主题发布主题为Image download、正文包含下载链接的消息。下载请求模型见 DownloadRequest.cs上传/下载相关请求与响应对象定义在 UploadRequest.cs 与 UploadResponse.cs。本地开发与调试使用 Swagger 本地调试 PamApiPamApi 项目集成了 Swagger UI 并附带若干测试端点可在 Visual Studio 中以调试模式运行PamApi项目打开该界面用于逐项验证应用功能PamApi Swagger 调试界面本地开发时需要手动设置以下环境变量CDK 部署时会自动注入 Lambda 运行环境LABELS_TABLE_NAMEDynamoDB 标签表名STORAGE_BUCKET_NAME图片存储桶名WORKING_BUCKET_NAMEzip 工作桶名NOTIFICATION_TOPICSNS 通知主题 ARN。使用 Mock Lambda Test Tool 调试函数对PamApiAnnotations项目以及Download、DetectLabels函数的本地调试可使用 AWS Lambda .NET 生态的Mock Lambda Test Tool在 Visual Studio 的Debug菜单中选中该工具即可启动调试。Mock Lambda Test Tool 调试界面单元测试PamServices.Test测试项目 PamServices.Test 采用 XUnit Moq通过 mock AWS SDK 客户端验证服务行为。以 StorageServiceTests.cs 为例GetPresignedUrlForImage_ShouldReturnUrl断言生成的 URL 请求满足目标桶、Key 以原文件名结尾、ContentType image/jpeg、Expires晚于当前时间且Verb HttpVerb.PUTGetPresignedArchiveUrl_ShouldReturnUrl断言下载链接请求满足Verb HttpVerb.GET且过期时间晚于当前时间GenerateZip_ShouldReturnUrl与GenerateZip_ShouldUseMultipleParts分别验证单个分片与多分片6MB 文件触发多个 5MB 分片上传的调用行为后者断言UploadPartAsync被调用 3 次。其余测试文件 ImageServiceTests.cs、LabelServiceTests.cs、NotificationServiceTests.cs 分别覆盖对应服务的单元行为。应用注意事项图片尺寸上限可分析的图片最大像素尺寸为 10000×10000更大尺寸的图片将不会被分析。下载链接长度部分邮件客户端不支持过长的下载 URL可能需要移除 URL 中的空格后再进行下载。删除资源与下一步为避免持续产生费用请在完成教程后删除本教程创建的全部资源清理步骤同样参考 applications/photo-asset-manager/cdk/README.md 中的 CDK 堆栈清理指引。注意RemovalPolicy.DESTROY与autoDeleteObjects意味着删除堆栈会同步删除 S3 桶及桶内对象、DynamoDB 表涉及数据的资源请谨慎操作。完成部署后你就拥有了一套完整可运行的照片资产管理应用。可继续阅读仓库中的 applications/photo-asset-manager/README.md应用全貌、DESIGN.md设计文档与 SPECIFICATION.md规格说明深入理解端到端设计。进一步学习资源AWS SDK for .NET 开发人员指南、AWS LambdaC#开发指南、Amazon API Gateway、Amazon Rekognition、Amazon DynamoDB、Amazon S3、Amazon SNS 官方开发指南见 原 README 的 Additional resources 章节更多 AWS 多服务交叉示例位于仓库 dotnetv3/cross-service 目录如 AuroraItemTracker、FeedbackSentimentAnalyzer、TopicsAndQueues 等可对照学习不同服务组合的架构模式。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐Photo Asset ManagerPAM设计解析基于 AWS 无服务器架构的照片资产管理应用Photo Asset ManagerPAM设计解析基于 AWS 无服务器架构的照片资产管理应用 Photo Asset ManagementPAM是示例工程教程后端基于 AWS Rekognition 与 S3 Intelligent-Tiering 的照片资产管理应用PAM架构解析基于 AWS Rekognition 与 S3 Intelligent Tiering 的照片资产管理应用PAM架构解析 导读 Photo Asset Ma示例工程教程后端使用 AWS SDK 构建照片资产管理应用PAMRekognition 标签检测、S3 智能分层与 DynamoDB 标签检索全解析使用 AWS SDK 构建照片资产管理应用PAMRekognition 标签检测、S3 智能分层与 DynamoDB 标签检索全解析 导读 本篇文章以 a示例工程教程后端上一篇如何快速集成PaparazzoiOS相机功能开发入门教程下一篇Seafile自动化部署工具Terraform与云平台资源编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

装了 OpenClaw 却不会用?这 20 个 Skills 让你的 AI 助手聪明(TaoToken 配置篇) 2026/9/25 8:52:24

装了 OpenClaw 却不会用?这 20 个 Skills 让你的 AI 助手聪明(TaoToken 配置篇)

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

阅读更多 →
JEB Pro v5.28实战:Android与WebAssembly跨平台逆向分析 2026/9/25 8:52:24

JEB Pro v5.28实战:Android与WebAssembly跨平台逆向分析

JEB Pro是我电脑里常年驻留的反编译器之一。很多做样本分析、协议还原、代码审计的朋友可能和我一样,桌面上既有jadx、Ghidra,也装着Frida和IDA,但遇到棘手样本时,最后真正能把整个分析流程串起来的,往往还是JEB Pro。…

阅读更多 →
手机镜防指纹手机镜源头厂家定制工厂,情侣款与出差便携款实力生产商 2026/9/25 8:52:18

手机镜防指纹手机镜源头厂家定制工厂,情侣款与出差便携款实力生产商

怀化市上怀品牌管理有限责任公司,简称上怀眼镜,是怀化本土经营40年的经典眼镜连锁品牌,累计服务超过10万近视用户,始终坚守科学配镜的舒适体验与视力管理的专业初心,是怀化本地集品牌镜片授权验配、视健康全周期管理、…

阅读更多 →
飞腾D2000/E2000/D3000平台U-Boot引导镜像制作与设备树配置实战 2026/9/25 8:52:18

飞腾D2000/E2000/D3000平台U-Boot引导镜像制作与设备树配置实战

很多人第一次拿到飞腾D2000的板子,都会习惯性先去翻内核、搞文件系统,结果卡在最前面的UBOOT引导阶段,串口什么输出都没有,或者内核起来一半就睡死。实际上飞腾平台的引导镜像制作,和x86那套完全不同,它既不…

阅读更多 →
外墙墙体渗水维修师傅 好工匠防水 高空作业 外墙裂缝修补专用材料 2026/9/25 8:52:11

外墙墙体渗水维修师傅 好工匠防水 高空作业 外墙裂缝修补专用材料

随着国内建筑使用年限逐步增加,以及北方特殊气候对建筑外墙的持续侵蚀,外墙防水维修市场的需求正在持续增长。京津冀区域受北方冬季冻融循环、春季持续返潮、沿海区域盐蚀、雨季强降水的多重影响,外墙渗水问题成为民居、商用建筑、工业厂房都…

阅读更多 →
GD32高级定时器互补PWM输出与死区控制实战 2026/9/25 8:51:58

GD32高级定时器互补PWM输出与死区控制实战

写GD32的高级定时器,绕不开三相电机控制、全桥逆变、UPS这类场景。做这类项目的人,百分之九十九都躲不过一个需求:要输出两路相位相反、中间还夹着一小段“空白”的PWM,而且这段空白还得精确可控。这段空白就是死区,控…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉