示例工程教程后端【免费下载链接】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-doc-sdk-examples 仓库中的一个跨服务示例应用用户上传照片后Amazon Rekognition 自动识别图片标签并写入 DynamoDB用户可按标签打包下载全部匹配图片。本文将基于 PAM 主文档结合 技术规格、设计文档、开发指南 及 CDK 源码完整讲解三栈架构、核心数据流、四类 Lambda 的业务逻辑与 IAM 权限模型并说明如何新增一门语言的实现。读完本文你将掌握一套完全 Serverless 多语言可插拔的图片资产管理参考实现的全貌。应用概述与核心工作流PAM 的核心功能闭环如下用户上传新图片Amazon Rekognition 对图片做标签检测label detection识别出的标签写入 DynamoDB用户请求一个包含某些标签的图片打包bundle系统从 Amazon S3 取回图片、压缩为 ZIP并将下载链接发送给用户。成本优化上图片长期存储在 S3 Intelligent-Tiering智能分层中——PAM 属于间歇使用、图片永久保存、访问频率低的典型场景智能分层会按对象粒度自动调整存储层级例如下载山景照片不会改变星景照片的存储层级从而让存储成本随实际访问模式缩放而不是靠人工维护 EC2 实例空转。三段式 Stack 架构为什么拆成三个 CDK 栈PAM 的 CDK 定义位于 applications/photo-asset-manager/cdk共包含三个 Stack。理想情况下一个栈即可但 CDK 在创建 CloudFormation 栈时无法提前获知最终资源 ARN因此三个栈借助CFN Outputs依次衔接、层层暴露信息。Stack 名称定义文件职责{PAM_NAME}-FE-Infra-PAMinfra-stack.ts创建 CloudFront 分发其 URL 是 Cognito 用户池与 CORS 域头的前置条件CloudFront 的创建/修改/销毁耗时远长于其他资源独立成栈便于管理{PAM_NAME}-{PAM_LANG}-PAMstack.ts部署桶、表、REST API 与 Lambda含代码打包不同语言共用绝大多数资源仅 CodeAsset 不同通过 CFN Outputs 输出前端所需的 ARN 与连接信息{PAM_NAME}-FE-Assets-PAMasset-stack.ts用前两个栈的 Outputs 构建并发布一个静态 React 站点内嵌 API Gateway、Cognito 用户池等配置三个栈由 bin/app.ts 协调它通过ListExportsCommand读取已有 CFN Exports按依赖顺序决定实例化哪些栈——FE-Infra部署完成后PAM_LANG栈才可用两者都部署完成后FE-Assets才可用销毁顺序则相反。对应的部署命令见 DEVELOPMENT.mdcdk deploy ${PAM_NAME}-FE-Infra-PAM cdk deploy ${PAM_NAME}-${PAM_LANG}-PAM cdk deploy ${PAM_NAME}-FE-Assets-PAM前端私有 S3 CloudFront 的静态 SPAFE-Infra 栈的设计动机S3 桶一般不应公开访问而 S3 静态网站托管是常见的例外但并非所有组织都允许公开 S3 网站桶。为兼顾两者PAM 的做法是前端静态资源发布到私有 S3 桶通过 CloudFront 分发访问。分发 URL 是 Cognito 与 API Gateway 的必需输入但只有在栈部署完成后才知道。FE-Assets 栈与前端技术栈PAM 前端是单一 React 应用对任何后端语言实现通用由 TypeScript 经 Vite 编译为静态单页应用SPA界面采用 Cloudscape 组件库与设计系统。编译时应用需要注入 API Gateway Rest API 的 URL、Cognito 用户池信息这些均来自另外两个栈的 CDK Outputs。前端源码位于 applications/photo-asset-manager/elros-pam/src。前端三条关键交互路径对应 SPECIFICATION.md 的 Frontend 章节登录与 API静态站重定向到 Cognito Hosted UI用部署时发到邮箱的临时密码登录之后所有 API 请求携带 JWTid_tokenAuthorization头携带访问令牌上传上传按钮选择本地图片后对/upload端点发起 PUT 请求API 返回预签名presignedS3 URL客户端直接 PUT 图片到存储桶全程绕过后端见下节 API 参数表查看与下载GET/labels获取标签列表并展示用户勾选一个或多个标签后点击下载将所选标签 POST 到/download端点触发准备下载Lambda随后收到一封包含 ZIP 下载链接的通知邮件。后端公共资源Common详解后端分为两层公共资源层所有语言共用同一套 CDK 定义与语言专属 Lambda 层。公共资源包括 S3 桶及生命周期、DynamoDB 表、前端与用户资源、Lambda 骨架、IAM 策略、SNS 主题。资源命名遵循{NAME}标记由{PAM_NAME}-{PAM_LANG}拼接CDK 运行时确定每个资源追加{RANDOM}唯一 ID客户需提供{EMAIL}用于账号创建该 PII 仅用于 Cognito 用户池与 SNS 主题。API Gateway 路由API Gateway 提供三条 HTTP 路由分别集成LabelsFn、UploadFn、PrepareDownloadFn每条端点都配置了 Cognito 授权器AuthorizationType.COGNITO。所有路由参数以 JSON 对象形式放在请求 body 顶层。实际定义见 api.ts其中download路由通过X-Amz-Invocation-Type: Event头以异步事件方式调用 Lambda。方法路由参数示例响应LambdaPUT/uploadfile_name: string{url: presigned URL}UploadFnGET/labels—{labels: {maintain: {count: 5}, lake: {count: 3}}}LabelsFnPOST/downloadlabels: string[]{}(event)PrepareDownloadFnAmazon CognitoCognito 用户池由 CDK 创建见 auth.ts使用部署时提供的邮箱创建首个账号并向该邮箱发送临时密码。源码中的用户池配置包括密码策略最小 6 位不强制数字/大小写/符号、关闭 MFA、关闭自助注册selfSignUpEnabled: false、隐式授权码流implicitCodeGrant并将 CloudFront URL 注册为回调/登出地址。完整用户管理系统不在示例范围内开发者可按 Cognito 文档启用第三方注册流程以增加用户。S3 桶与生命周期策略PAM 使用两个桶定义见 resources.ts桶命名模式策略用途{NAME}-pam-pambucketsstorage-bucket{RANDOM}Storage Bucketjpeg 图片触发 DetectLabels1 天后转入 S3 Intelligent-TieringtransitionAfter: Duration.days(1)开启 CORS允许任意来源的 PUT长期存储应用内全部图片{NAME}-pam-pambucketsworking-bucket{RANDOM}Working Bucket24 小时过期删除expiration: Duration.days(1)存放生命周期极短的 manifest 与 ZIP 下载文件Storage Bucket 通过addObjectCreatedNotification为.jpg与.jpeg后缀对象注册 S3 事件通知自动触发DetectLabelsLambda见 stack.ts 的permissions()。DynamoDB LabelsTable整个应用只有一张 DynamoDB 表保存 Rekognition 识别出的标签。表名为{NAME}-PAM-PamTablesLabelsTable{RANDOM}文档中简称LabelsTable主键为Label类型S。每行包含该标签的图片计数Count与匹配图片键列表Images表结构示意图见 images/ddb_sample.png。由于存在清晰的分区键标签名且吞吐需求低先批量上传检测再单次下载请求DynamoDB 是比关系型数据库更契合的选择。Amazon Rekognition 与 IAMRekognition本例中无需任何特定配置仅凭 S3 桶与对象键即可返回识别数据。IAMCDK 为每个函数创建角色并赋予最小权限。附录 ASPECIFICATION.md 的 Appendix A给出了每个 Lambda 的完整策略且与 stack.ts 中的permissions()一一对应函数策略Uploads3:PutObjecton Storage BucketDetectLabelsdynamodb:PutItem、dynamodb:UpdateItemon LabelsTablerekognition:DetectLabelson*s3:ReadObjecton Storage BucketLabelsFndynamodb:ReadItemon LabelsTablePrepareDownloaddynamodb:ReadItemon LabelsTables3:ReadItemon StorageBuckets3:ReadItem、s3:PutItemon WorkingBucketsns:Subscribeon*sns:Publishonarn:aws:sns:{REGION}:{ACCOUNT_ID}/{NAME}-PAM-*四类语言专属 Lambda触发、入参与实现要点每个语言都要实现四个 Lambda汇总表见 SPECIFICATION.md函数触发器输入示例输出示例使用资源UploadAPIG PUT /upload{file_name: maintain01.jpg}{url: presigned URL}StorageBucketDetectLabelsS3 PutObject jpeg——StorageBucket, LabelsTableLabelsFnAPIG GET /labels—{labels: {maintain: {count: 5}, lake: {count: 3}}}LabelsTablePrepareDownloadAPIG POST /download (event){labels: [Mountain, Lake]}{}LabelsTable, WorkingBucketUpload在 Storage Bucket 创建预签名 URL对象键为提供的文件名前缀加 UUIDv4 与/如/{uuidv4}-maintain01.jpgURL 允许PUT方法、Content-Type: image/jpeg有效期5 分钟300,000 ms返回含单键url的序列化 JSON。DetectLabels由 Storage Bucket 的上传事件触发仅.jpg/.jpeg对每个传入对象调用 RekognitiondetectLabels成功后更新LabelsTable每个标签键把图片对象键追加到 Images 列、Count 列 1必须为原子操作——优先使用增强客户端Enhanced DynamoDB Client的原子计数器否则用更新表达式原子更新 Count 与 ImagesUpdateExpression: ADD Count :one, Images :img ExpressionAttributeValues: :one: AttributeValue::N(1), :img: AttributeValue::S({object_key})从设计文档DESIGN.md可知该表每行仅保留每个标签一次以保证计数准确Number 与 Set 类型的组合正好可以发挥 DynamoDB 更新表达式的优势。仓库内另有一个更早期的 Python 参考实现 rekognition_photo_analyzer/rekfunction.py展示了detect_labels(Image..., MaxLabels10, MinConfidence70)的调用方式与结果写入但注意其数据模型与本规范不同仅作 API 调用参考。LabelsFn从LabelsTable读取Label与Count列返回 JSON顶层对象每个属性键为一个标签值对象含单个count属性。PrepareDownloadFn从LabelsTable取出所选标签对应的全部图片键去重创建 ZIP 归档将所有图片放入 ZIP 并上传到 Working Bucket生成 24 小时有效的预签名 GET URL预签名 URL 最长 7 天24 小时在支持范围内通过 SNS 主题publish()发送包含该 URL 的通知消息。SNS 主题由 CDK 创建stack.ts 中new Topic(this, PamNotifier)并订阅PAM_EMAIL。需要注意一个已知限制预签名 URL 往往超过邮件客户端单行长度客户端可能插入换行或空格导致链接断裂SNS 不支持富文本 HTML且设计目标不允许 PAM 直接处理 PII团队正在寻找替代方案。Lambda 环境变量与代码结构约定Lambda 实现通过四个环境变量访问应用资源由 lambdas.ts 统一注入变量用途LABELS_TABLE_NAMELabels Table 名称STORAGE_BUCKET_NAMEStorage Bucket 名称WORKING_BUCKET_NAMEWorking Bucket 名称NOTIFICATION_TOPIC下载就绪通知所用的 SNS 主题 ARN代码结构约定便于测试每个功能应拆成三部分——① 逻辑函数接收具体参数、用 SDK 完成工作并返回结果对象② Lambda handler解析/编组事件数据到逻辑函数并把返回值序列化为 JSON③ 中间件函数使用适合该语言的 HTTP 中间件技术在本地环境执行同样逻辑便于本地测试。用户触发的函数有响应体生命周期事件函数不返回数据。多语言策略PamLambdasStrategy 与新增语言PAM 是一个应用、多种语言实现的跨服务示例。各语言的 Lambda 打包与部署策略由 strategies.ts 中的PamLambdasStrategy接口统一描述export interface PamLambdasStrategy { runtime: Runtime; timeout: Duration; // 默认 15 分钟 memorySize: number; // 单位 MB codeAsset: () Code; // 见打包代码 handlers: PamLambdasStrategyHandlers; // 见Handler 指定 architecture: Architecture; }当前STRATEGIES常量已注册的语言包括java、javascript、python、dotnet、dotnetla、rust、cpp、php与占位的empty。各策略的关键差异timeout/memorySize/runtime/handler 格式都集中在 strategies.ts例如Python 策略直接Code.fromAsset(./rekognition_photo_analyzer)handler 为模块函数Java 策略通过 Dockerbundling执行mvn install并把 JAR 复制到/asset-output/handler 为类路径如com.example.photo.handlers.UploadHandlerRust 策略本地执行cargo lambda build --release --arm64后使用bootstrap.zip运行时为PROVIDED_AL2ARM_64。打包代码Bundle codecodeAsset返回 Lambda 实际执行的代码。Code.fromAsset配合 NodeJSresolve可以加载仓库内任意路径的代码相对于resources/cdk/photo_asset_manager解析。解释型语言直接打包源码即可编译型语言需要编译产物可通过Code.fromAsset的bundling选项让 CDK 在部署时用 Docker 编译资源挂载到容器/asset-input/即工作目录命令执行编译步骤并把产物复制到/asset-output/其内容会被归档进 Lambda 的 S3 桶。Handler 指定输出 bundle 包含全部 Lambda 的代码通过每个函数各自的 handler 字符串选择执行入口格式因语言而异Java 指定类路径Python 指定整个模块与函数JavaScript 如index.handlers.upload。新增语言三步走按 DEVELOPMENT.md在对应语言目录创建新项目实现四个 Lambda 函数编辑 strategies.ts新增该语言的PamLambdaStrategy可复制/参考现有实例并注册到STRATEGIES常量更新 README 中的支持语言列表。开发/验证流程建议先用 hello-world 桩 Lambda 占位所有 handler导出PAM_NAME、PAM_EMAIL、PAM_LANG三个环境变量依次部署三个栈随后按 Upload → DetectLabels → GetLabels → PrepareDownload 的顺序逐个实现函数、更新 handler、cdk deploy ${PAM_NAME}-${PAM_LANG}-PAM并测试迭代。设计取舍背后的思考DESIGN.md 记录了 PAM 的关键架构决策理解这些有助于直接复用该模式全 Serverless应用非实时/低延迟敏感长期保留 EC2 或 ECS 集群不经济Lambda 与 Fargate 复杂度与成本相近团队最终选择 Lambda冷启动更快、自动缩容且符合云优先心智模型双桶 智能分层Storage Bucket 存图Intelligent-Tiering 自动归档冷数据Working Bucket 存 ZIP 等临时产物24 小时过期——下载触发异步 Lambda 把选中图片流式打包进 ZIP、存入工作桶并用预签名 URL 通知用户DynamoDB 而非 RDS/Aurora/Redshift/Elasticache数据模型无强关系约束、以标签为键、按键查找为主是最佳匹配SNS 而非 SQS通知是推送操作且应用不想在静态存储中保存用户地址类 PIISMS 直发也不合适故用 SNS 主题做 1:1 的下载包→通知绑定Cognito每个部署实例需独立安全IAM 面向 AWS 资源不适合面向 Web 用户Cognito Hosted UI 简化登录流本应用使用可直接鉴权的 token 而非需后端验证的 authorization codeCDKTypeScriptJSII 开销小、API 更顺手。总结PAM 是一套麻雀虽小、五脏俱全的 Serverless 参考实现三层 CDK 栈解决资源间 ARN 依赖与时序问题前端私有 S3 CloudFront 规避公开桶策略后端以存储桶事件驱动 DetectLabels、API 驱动其余三函数的方式串联 Rekognition、DynamoDB、SNSPamLambdasStrategy将语言差异收敛为单一接口使新增语言只需补一个策略与四个 handler。无论是学习 AWS SDK 跨服务集成还是作为自己图片归档类产品的架构蓝本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 SDK 构建照片资产管理应用PAMRekognition 标签检测、S3 智能分层与 DynamoDB 标签检索全解析使用 AWS SDK 构建照片资产管理应用PAMRekognition 标签检测、S3 智能分层与 DynamoDB 标签检索全解析 导读 本篇文章以 a示例工程教程后端Photo Asset Manager 前端 elros-pam 开发与部署指南基于 React Vite 的照片资产管理 Web 应用Photo Asset Manager 前端 elros pam 开发与部署指南基于 React Vite 的照片资产管理 Web 应用 本指南聚焦 AW示例工程教程后端Photo Asset Manager 技术规格解析基于 AWS Rekognition 与无服务器架构的跨语言示例应用Photo Asset Manager 技术规格解析基于 AWS Rekognition 与无服务器架构的跨语言示例应用 Photo Asset Manage示例工程教程后端上一篇从单机到多人SillyTavern如何让AI对话变成团队共创游戏下一篇如何看懂InternVL 1.0QLLaMA语言模型与双塔架构设计全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Erlang/OTP 发布资源文件(.rel)完全指南:定义发布构成、驱动启动脚本与升级流程 编程语言语言运行时标准库编译器并发编程 【免费下载链接】otp Erlang/OTP 项目地址: https://gitcode.com/gh_mirrors/ot/otp 点击查看 免费下载 rel.md 是 Erlang/OTP 中 SASL(System Architecture Support Libraries)应用发布系统的核心参… · 2026/9/24 15:41:41
Halcon九点标定实战:眼在手外与眼在手上的仿射变换矩阵求解 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:41:35
工控协议实战解构:从Modbus到S7的现场调试方法论 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:41:29
如何用 Perfetto 系统追踪 5 步定位卡顿与内存异常:Android 性能排查实战指南 如何用 Perfetto 系统追踪 5 步定位卡顿与内存异常:Android 性能排查实战指南 【免费下载链接】perfetto Production-grade client-side tracing, profiling, and analysis for complex software systems. 项目地址: https://gitcode.com/GitHub_Trending/pe/perf… · 2026/9/24 16:06:44
考研经验互助交流分享平台 考研经验互助交流分享平台选题背景与意义随着高等教育规模的持续扩大以及社会对高层次人才需求的不断增长,研究生教育已成为众多高校毕业生实现个人发展、提升职业竞争力的重要路径。近年来,全国硕士研究生招生考试报名人数屡创新高,2023年报… · 2026/9/24 16:06:37
变频水泵控制柜可以远程改压力吗?远程控制安全要点 变频水泵恒压供水控制柜可以远程控制,远程分两大类:简单远程(开关量)、物联网远程(手机/电脑看压力、调参数),很多成品变频供水柜预留接口,加模块就能实现。一、两种远程方案
方案1:简易远程(仅启停,不能看… · 2026/9/24 16:06:31
Apache Beam Runner选型指南:DirectRunner、Flink、Spark与Dataflow如何选? Apache Beam Runner选型指南:DirectRunner、Flink、Spark与Dataflow如何选? 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam4/beam … · 2026/9/24 16:06:25
OSX-Hyper-V 安装 macOS 全流程:从 OpenCore 启动菜单到安装完成的 7 个关键步骤 OSX-Hyper-V 安装 macOS 全流程:从 OpenCore 启动菜单到安装完成的 7 个关键步骤 【免费下载链接】OSX-Hyper-V OpenCore configuration for running macOS on Windows Hyper-V. 项目地址: https://gitcode.com/gh_mirrors/os/OSX-Hyper-V
OSX-Hyper-V 是一个… · 2026/9/24 16:06:25
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44