- 示例工程
- 教程
- 后端
【免费下载链接】aws-doc-sdk-examples
Welcome 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.
导读
本文以仓库 cpp/example_code/cross-service/README.md 为主线,系统讲解 AWS SDK for C++ 的跨服务(cross-service)示例体系。跨服务示例是指使用 AWS SDK for C++ 构建的、同时调用多个 AWS 服务的应用。仓库中cpp/example_code/cross-service目录目前包含三个典型的跨服务示例:基于 Amazon Aurora Serverless 与 Amazon SES 的 Item Tracker 任务追踪 Web 应用、基于 Lambda 无服务器架构的 Photo Asset Manager 图片资产管理应用,以及基于 Amazon SNS 与 Amazon SQS 的发布订阅(含 FIFO 与消息过滤)命令行示例。读完本文,你将掌握这些示例的整体架构、核心 API 调用链、构建运行方式,以及如何结合源码理解 AWS SDK for C++ 的多服务协作模式。
跨服务示例概述
根据 cpp/example_code/cross-service/README.md,cpp/example_code/cross-service目录下的每个子文件夹都是一个跨服务示例,每个子目录中的 README 都描述了该示例的具体运行方式。当前目录包含的示例有:
| 示例 | 功能简介 | 说明文档 |
|---|---|---|
| serverless-aurora | 使用 Amazon Aurora Serverless 和 Amazon SES 创建 Item Tracker 任务追踪 Web 应用 | serverless-aurora/README.md |
| photo_asset_manager | 创建图片资产管理应用(Photo Asset Manager,PAM) | photo_asset_manager/README.md |
| topics_and_queues | 使用过滤器和队列探索 SNS 主题的发布订阅机制 | topics_and_queues/README.md |
运行费用与权限提醒
原文档对三类示例统一给出了重要的费用与权限提示,运行前务必注意:
- 运行示例代码可能产生 AWS 账户费用;
- 运行测试同样可能产生 AWS 账户费用;
- 建议为代码授予最小权限(least privilege),仅授予完成任务所需的最低权限,相关最佳实践可参考 AWS IAM 文档 "Grant least privilege";
- 这些代码并未在每个 AWS 区域进行测试,跨区域部署前请核对 AWS 区域服务可用性。
示例一:Item Tracker——Aurora Serverless 任务追踪 Web 应用
架构概览
serverless-aurora/README.md 描述了该示例的三层结构:
- HTTP 服务层:使用 C++ 编写 HTTP 服务器,通过 AWS SDK for C++ 访问 AWS 服务,核心代码位于 serverless-aurora 目录;
- 前端客户端:JavaScript React Web 应用,代码位于 resources/clients/react/elwing;
- 基础设施:Amazon Aurora Serverless 资源通过 AWS CDK 代码创建,位于 resources/cdk/aurora_serverless_app。
数据存储于 Amazon Aurora Serverless 数据库,邮件报告通过 Amazon SES 发送。
HTTP API 设计
示例创建的 HTTP 服务器实现了如下 API 集合(注意源码 ItemTrackerHTTPHandler.cpp 中实际路由以/api/items为前缀,而 README 中的描述省略了该前缀):
| 方法 | 路径 | 功能 |
|---|---|---|
| GET | /items | 查询全部条目 |
| GET | /items?archived=true | 查询已归档条目 |
| GET | /items?archived=false | 查询未归档(active)条目 |
| GET | /items/{item_id} | 查询单个条目 |
| POST | /items | 在集合中新建条目 |
| PUT | /items/{item_id} | 更新单个条目 |
| PUT | /items/{item_id}:archive | 将条目移动到archived状态 |
| POST | /items:report | 生成报告,请求体可携带email字段(字符串邮箱地址) |
从源码 ItemTrackerHTTPHandler.cpp 的handleHTTP方法可以看到完整的路由实现逻辑:GET /api/items、GET /api/items?archived=true、GET /api/items?archived=false分别对应WorkItemStatus::BOTH、WorkItemStatus::ARCHIVED、WorkItemStatus::NOT_ARCHIVED三种查询状态;PUT /api/items/{id}:archive通过判断 URI 中是否包含:archive后缀来区分归档操作与普通更新操作;POST /api/items:report解析请求体中的email字段后触发邮件发送。
源码实现剖析
serverless_aurora.cpp(serverless_aurora.cpp)的main函数严格校验命令行参数数量(argc != 5时输出用法并返回 1),随后按顺序完成以下初始化:
- 调用
Aws::InitAPI(options)初始化 AWS SDK; - 从命令行读取 4 个参数:
database、resourceArn、secretArn、sesEmailAddress; - 创建
Aws::Client::ClientConfiguration(源码中注释说明可在此通过clientConfig.region指定区域); - 调用
runServerLessAurora启动服务,内部流程为:- 创建
RDSDataHandler(数据库名、资源 ARN、密钥 ARN、表名items); - 调用
rdsDataHandler.initializeTable(false),false表示表已存在时不做重建; - 创建
SESV2EmailHandler; - 组合成
ItemTrackerHTTPHandler; - 通过
PocoHTTPServer启动监听。
- 创建
RDSDataHandler:RDS Data Service 数据访问层
RDSDataHandler.cpp 封装了对 Aurora Serverless 的所有 SQL 操作,核心是executeStatement方法:它创建RDSDataServiceClient,构造ExecuteStatementRequest并设置database、secretArn、resourceArn与sql,可选附带SqlParameter参数向量,然后调用client.ExecuteStatement。表结构由createTable定义(RDSDataHandler.cpp):
iditemVARCHAR(45)usernameVARCHAR(45)descriptionVARCHAR(400)guideVARCHAR(45)statusVARCHAR(400)archivedTINYINT(4)
值得注意的是,addWorkItem使用Aws::Utils::UUID::RandomUUID()为每条记录生成 UUID 作为主键;布尔型archived字段在写入时被编码为long值(0/1),读取时通过GetLongValue() > 0还原为布尔。查询通过SHOW TABLES IN <database>判断表是否存在,initializeTable(recreateTable)根据表是否存在决定是建表、复用还是删除重建。
SESV2EmailHandler:SES 邮件报告层
SESV2EmailHandler.cpp 展示了如何用 SES v2 API 发送一个multipart/alternative格式的原始邮件,邮件包含三部分:
- 纯文本部分(
text/plain; charset=UTF-8):报告条数、生成时间; - HTML 部分(
text/html; charset=UTF-8):格式化展示报告内容; - 附件部分(
text/csv,文件名report.csv):将所有工作条目以 CSV 形式导出,字段为ID,Name,Guide,Description,Status,Archived。
邮件通过构造SESV2Client与SendEmailRequest发送,其中RawMessage使用ByteBuffer承载原始 MIME 内容,附件内容经Aws::Utils::Base64::Base64编码后嵌入(见 SESV2EmailHandler.cpp)。
PocoHTTPServer:可复用的 HTTP 服务层
PocoHTTPServer.cpp 实现了一个基于 POCO 库的 HTTP 服务器,注释明确说明这段代码被设计为可在多个示例间原样复用。它在 8080 端口监听(Poco::Net::ServerSocket(8080)),支持 CORS 预检请求(OPTIONS),响应头设置Access-Control-Allow-Origin: *,这是浏览器端 React 应用能够跨域访问的前提。
前提条件
- 安装 AWS SDK for C++;
- 安装 Conan C++ 包管理器(本示例用它安装依赖)。
依赖清单在 conanfile.txt 中:poco/1.12.2,并关闭了activerecord、crypto、data*、jwt、mongodb、netssl、zip等非必要组件,仅开启json、net、redis、util、xml、encodings。
创建资源
- 通过 AWS CloudFormation 运行 resources/cdk/aurora_serverless_app 中的
setup.yaml脚本创建 Amazon RDS 资源,具体步骤见该目录的 README; - 在 Amazon SES 中创建已验证身份(verified identity),作为发件邮箱。
构建代码
在示例目录下依次执行:
mkdir build cd build安装 POCO 库(Linux/Mac):
conan install .. --build=missing安装 POCO 库(Windows):
conan install .. --build=missing -o poco:shared=True -s build_type=Debug使用 CMake 构建:
cmake .. make ..运行示例
以命令行参数启动 HTTP 服务器:
./run_serverless_aurora <database> <resource_arn> <secret_arn> <email>四个参数的含义如下:
| 参数 | 说明 |
|---|---|
<database> | Aurora 数据库名称,来自创建资源步骤 |
<resource_arn> | Amazon RDS 数据库的资源 ARN,来自创建资源步骤 |
<secret_arn> | AWS Secrets Manager 中数据库凭据的 ARN,来自创建资源步骤 |
<email> | 已在 Amazon SES 中验证的身份邮箱 |
随后运行 resources/clients/react/elwing 客户端应用(运行方式见其 README)。两端都启动后,在浏览器中打开客户端,在侧边栏选择 "Item Tracker" 页面,即可通过网页操作 AWS 资源(读取、写入、归档工作条目)。
测试验证
示例在 serverless-aurora/tests 目录下提供了基于 GoogleTest 的测试:gtest_serverless_aurora.cpp负责端到端测试,serverless_aurora_gtests.cpp/h提供公共测试辅助函数,test_main.cpp为测试入口。测试通过构建目录下的 CMake 配置执行,用于验证 HTTP API 与 RDS/SES 的交互行为。
清理资源
为避免持续计费,按 resources/cdk/aurora_serverless_app/README.md 中 "Destroying resources" 一节的说明销毁 Aurora Serverless CDK 部署创建的所有资源。
示例二:Photo Asset Manager——无服务器图片资产管理
架构概览
photo_asset_manager/README.md 描述了 PAM 应用:使用 Amazon Rekognition 对图片进行分类,图片存储于启用 Amazon S3 Intelligent-Tiering 的桶中以节约成本。用户可以上传新图片,系统进行标签检测(label detection),标签存入 Amazon DynamoDB 表;用户随后可按标签列表请求图片包,系统从 S3 检索图片、打包为 zip 并提供下载链接。
该应用采用无服务器架构,由以下 AWS Lambda 函数构成后端:
| 函数 | 职责 |
|---|---|
| Labels | 无服务器 API 端点,返回 S3 存储桶中图片的标签及标签计数 |
| Upload | 无服务器 API 端点,返回用于上传图片的预签名 URL(presigned URL) |
| DetectLabelsFunction | S3 事件函数,当 S3 存储桶中创建图片对象时被调用,使用 Amazon Rekognition 分析新图片并将标签信息存入 DynamoDB 表 |
| DownloadFunction | Amazon API Gateway 函数,将图片合并为 zip 文件存入 S3 存储桶并提供预签名下载链接,同时通过 Amazon SNS 发送通知消息 |
前端是使用 Cloudscape Design System 的 React 单页应用,支持通过 Amazon Cognito 流程认证,部署到 S3 桶并通过 Amazon CloudFront 分发对外公开,应用名在 CDK 部署时动态生成。
构建与部署
前提条件:AWS 账户、Docker Desktop、Node.js 18+、AWS SDK for C++。
创建资源:按 applications/photo-asset-manager/cdk/README.md 的说明,使用 AWS CDK 或 AWS CLI 创建并管理示例所需资源;执行 CDK 步骤时必须运行 Docker。
构建代码:代码在资源创建时自动构建并上传,构建使用仓库提供的 Dockerfile:
docker build . -f Dockerfile -t cpp_pam_image docker run --name pam_lambda cpp_pam_image docker cp pam_lambda:/pam_lambda/build/cpp_pam_lambdas.zip .构建产物位于容器内/pam_lambda/build/cpp_pam_lambdas.zip,docker cp可将其拷贝到本地文件系统。
Dockerfile 与 Lambda 运行时要点
从 Dockerfile 可以看出无服务器 C++ Lambda 的构建策略:
- 基础镜像为
amazonlinux:2023,安装gcc-c++、cmake3、jsoncpp-devel、libzip-devel等编译依赖; - 先编译安装
aws-lambda-cpp运行时(-DBUILD_SHARED_LIBS=OFF静态链接); - 通过
ENV SERVICES="s3;sns;rekognition;dynamodb"配合-DBUILD_ONLY=${SERVICES}仅编译 SDK 中 S3、SNS、Rekognition、DynamoDB 四个服务模块,显著缩短构建时间; - 最后执行
make aws-lambda-package-cpp_pam_lambdas打包,并unzip到/asset目录供 CDK 的lambda.Code.fromDockerBuildAPI 使用。
应用注意事项
- 图像分析的最大像素尺寸为 10000x10000,更大的图片不会被分析;
- 部分邮件客户端不支持过长的下载 URL,若下载失败可能需要去掉 URL 中的空格。
清理资源
按 applications/photo-asset-manager/cdk/README.md 的说明清理 CDK 栈资源,避免持续产生费用。
测试
测试位于 photo_asset_manager/tests,包括pam_gtests.cpp/h(PAM 功能测试)、cpp_lambda_tests.cpp(Lambda 函数测试)与test_main.cpp(测试入口),test_image.jpg作为测试图片使用。
示例三:topics_and_queues——SNS/SQS 发布订阅与 FIFO 消息过滤
架构概览
topics_and_queues/README.md 讲解发布订阅(publish/subscribe)机制:生产者发布消息、订阅者接收消息,生产者与消费者之间完全解耦。示例不构建完整的端到端应用,而是提供一个命令行交互程序,让开发者体验:
- 创建 Amazon SNS 主题;
- 订阅两个 Amazon SQS 队列到该主题;
- 可启用 FIFO(First-In-First-Out)队列;
- 可添加带过滤器的订阅;
- 向主题发布消息并查看队列中的结果。
SNS 与 SQS 的协作模型
- Amazon SNS是推送(push)服务,向邮箱、移动应用端点或 SQS 队列等端点推送消息;
- Amazon SQS通过轮询(polling)接收消息——订阅者调用接收消息 API 拉取消息,任何代码都可以轮询队列,且消息在删除之前一直保留在队列中,处理方式更灵活。
二者组合使用比单独使用 SNS 提供更大的消费灵活性。
命令行交互流程(C++ 实现界面)
创建 SNS 主题
1. 是否使用 FIFO 主题:
Would you like to work with FIFO topics? (y/n)FIFO 主题在创建时配置,选择 FIFO 会启用其他相关选项。
2. 是否使用基于内容的去重:
Use content-based deduplication instead of a deduplication ID? (y/n)去重仅对 FIFO 主题可用。SNS FIFO 主题在五分钟去重间隔内发现重复消息时,会接受但不再投递。基于内容的去重使用内容哈希作为去重 ID;若未启用,则每条消息必须携带去重 ID。
3. 输入主题名称:
Enter a name for your SNS topic:主题名称长度 1-256 个字符,可包含大小写 ASCII 字母、数字、下划线和连字符。若选择 FIFO 主题,应用会自动追加.fifo后缀(FIFO 主题的强制要求)。
创建两个 SQS 队列
1. 输入队列名称:
Enter a name for an SQS queue.队列名称长度 1-80 个字符,可包含大小写 ASCII 字母、数字、下划线和连字符。若选择 FIFO 主题,应用会自动为队列追加.fifo后缀(FIFO 队列的强制要求)。为每个订阅者创建独立队列,可以分别定制消息消费方式与消息过滤策略。
2. 是否为主题订阅添加消息过滤:
Filter messages for "<queue name>.fifo"s subscription to the topic "<topic name>.fifo"? (y/n)若选择 FIFO 主题,可以为队列的主题订阅添加过滤器。
3. 选择过滤属性(tone):
You can filter messages by one or more of the following "tone" attributes. 1. cheerful 2. funny 3. serious 4. sincere Enter a number (or enter zero to stop adding more)可选择一个或多个tone属性进行过滤,输入0结束添加。随后重复以上步骤配置第二个队列。
发布消息
配置完成后进入消息发布环节:
1. 输入消息文本:
Enter a message text to publish.所有配置都包含消息文本。
2. 输入消息组 ID:
Enter a message group ID for this message.仅 FIFO 主题需要,组 ID 最长 128 个字符,可包含字母数字(a-z, A-Z, 0-9)与标点符号(!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`)。
3. 输入去重 ID:
Enter a deduplication ID for this message.当主题为 FIFO 且未启用基于内容的去重时必须输入。去重 ID 长度限制与组 ID 相同(最长 128 字符,字母数字与标点)。
4. 是否添加消息属性:
Add an attribute to this message? (y/n) y若某个订阅添加了过滤器,可为消息添加过滤属性:
1. cheerful 2. funny 3. serious 4. sincere Enter a number for an attribute:5. 是否继续发布:
Post another message? (y/n)可发布任意多条消息。全部发布完成后,应用轮询队列并展示其中的消息。
构建与运行
前提条件:完成 AWS SDK for C++ 入门指南 中的安装与设置。
构建命令:
mkdir build cd build cmake —build ..构建产物为可执行文件run_topics_and_queues。运行该示例需要具备 SNS 与 SQS 的 IAM 权限。
测试验证
测试位于 topics_and_queues/tests:gtest_messaging_with_topics_and_queues.cpp负责消息场景测试,topics_and_queues_gtests.cpp/h提供测试辅助函数,test_main.cpp为测试入口,可验证主题创建、队列订阅、过滤与消息投递全流程。
三个示例的对比与选型参考
| 维度 | serverless-aurora | photo_asset_manager | topics_and_queues |
|---|---|---|---|
| 服务组合 | Aurora Serverless + SES + RDS Data API | S3 + Rekognition + DynamoDB + SNS + Cognito + Lambda | SNS + SQS |
| 应用形态 | HTTP 服务器 + React 前端 | 无服务器 Lambda 函数 + CDK 部署 | 命令行交互程序 |
| 关键学习点 | RDS Data API 免服务器 SQL、原始 MIME 邮件、POCO HTTP 服务 | Lambda C++ 运行时、预签名 URL、事件驱动 | FIFO 语义、消息去重、订阅过滤 |
| 构建方式 | Conan + CMake | Docker + CMake | CMake |
三个示例共同展示了 AWS SDK for C++ 在多服务协作场景下的典型模式:通过Aws::Client::ClientConfiguration统一管理区域与凭据、每个服务一个独立 Client 类、以InitAPI/ShutdownAPI管理 SDK 生命周期。
延伸阅读
- Amazon Aurora 用户指南
- Amazon RDS Data Service API 参考
- Amazon SES API 参考
- Amazon SNS 开发者指南
- Amazon SQS 开发者指南
- AWS SDK for C++ 开发者指南
- 更多 C++ 跨服务示例入口:cpp/example_code/cross-service
- 示例工程
- 教程
- 后端
【免费下载链接】aws-doc-sdk-examples
Welcome 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.
相关推荐
AWS SDK示例项目:基于SNS和SQS实现消息发布订阅模式的技术解析
AWS SDK示例项目:基于SNS和SQS实现消息发布订阅模式的技术解析 消息发布订阅模式概述 消息发布订阅(Pub/Sub)是一种广泛应用于现代软件架构的消息
示例工程教程后端AWS SDK for C++ 实战:使用 SNS 主题与 SQS 队列实现带过滤与 FIFO 的发布订阅
AWS SDK for C++ 实战:使用 SNS 主题与 SQS 队列实现带过滤与 FIFO 的发布订阅 本篇文章基于 aws doc sdk example
示例工程教程后端如何用chart-快速构建专业级图表?从安装到渲染的完整教程
如何用chart 快速构建专业级图表?从安装到渲染的完整教程 chart 是一个基于Go语言的轻量级图表库,能够帮助开发者快速创建各种专业级数据可视化图表。无论
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考