- 示例工程
- 教程
- 后端
【免费下载链接】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.
导读
本文围绕仓库中的 Hello SNS 示例 展开,讲解如何用 AWS SDK for C++ 构建一个最小的 Amazon Simple Notification Service(Amazon SNS)入门应用:初始化 SNS 客户端、调用ListTopics列出当前账号下全部主题,并处理分页响应。读完本文,你将掌握该 CMake 工程从环境准备、编译、运行到最小权限配置的完整实战流程,并通过源码级剖析理解 SDK 客户端初始化、分页循环与结果处理的底层写法。
示例定位:仓库中的 "Hello World" 启动应用
在 cpp/example_code/sns/ 目录中,Amazon SNS 的 C++ 示例被划分为三类:
- Get started(入门示例):即本示例 hello_sns,核心动作是
ListTopics,用于验证 SDK 安装与凭证配置是否正确; - Single actions(单动作示例):如 create_topic.cpp、delete_topic.cpp、publish_to_topic.cpp、subscribe_email.cpp 等,逐一演示单个服务 API;
- Scenarios(场景示例):如 publish_sms.cpp(发送短信)、topics_and_queues(消息发布到队列)等,演示多个 API 协同完成业务。
hello_sns 是整个 SNS 示例集的"门面":它不创建任何资源、不需要任何参数,只需列出主题即可确认"SDK 可用、凭证有效、SNS 服务可达",是开发者接入 SNS 前最合适的冒烟测试(smoke test)。
环境准备与前置条件
安装并配置 AWS SDK for C++
在编译本示例前,需要先完成 AWS SDK for C++ 的安装与环境设置,包括:
- 安装 SDK 及其依赖(CMake、编译工具链、必要的第三方库);
- 配置 AWS 凭证(访问密钥、区域等),SDK 会按标准链自动读取环境变量、共享凭证文件或 IAM 角色;
- 构建并安装 SDK 时,需要包含
sns服务组件。
官方入门指引可参考 AWS SDK for C++ Developer Guide 中的 Getting started 章节(该文档在仓库的 hello_sns/README.md 和 hello_sns.cpp 头部注释中均有引用)。
凭证与最小权限
示例运行只需要列出主题,因此官方推荐直接使用 AWS 托管策略:
arn:aws:iam::aws:policy/AmazonSNSReadOnlyAccess该策略仅授予 SNS 的只读权限,符合"最小权限(least privilege)"原则。若你希望使用自定义策略,只需包含sns:ListTopics权限即可。请注意:运行本代码(以及运行相关测试)可能产生 AWS 账户费用,且代码并未在所有 AWS 区域做过测试,建议按需选择区域。
构建工程:CMake 配置逐项解读
示例使用 CMake 构建系统(官方文档明确要求 CMake 3.13 及以上)。如果使用支持 CMake 的 IDE(如 CLion、Visual Studio、VS Code + CMake Tools),可直接按 IDE 提示打开工程;也可以在命令行完成构建。
命令行构建步骤
进入hello_sns目录后执行:
mkdir build cd build cmake --build ..构建产物名为hello_sns(可执行文件)。若你使用的是原生构建系统(如 Makefiles、Ninja、Visual Studio 工程),也可先用cmake ..生成对应构建系统的输入文件,再用该系统构建。
CMakeLists.txt 关键配置
仓库中的 CMakeLists.txt 是构建的核心,各配置项作用如下:
| 配置项 | 值 | 作用说明 |
|---|---|---|
cmake_minimum_required | 3.13 | 声明所需最低 CMake 版本 |
SERVICE_COMPONENTS | sns | 指定需要链接的 AWS SDK 服务组件,find_package(AWSSDK)只会引入该组件 |
project | hello_sns | 工程名,同时也是可执行目标名 |
CMAKE_CXX_STANDARD | 11 | AWS SDK for C++ 要求至少 C++ 11 |
WINDOWS_BUILD | ${MSVC} | 用 MSVC 变量判断是否 Windows 构建 |
find_package(AWSSDK REQUIRED COMPONENTS sns) | — | 查找已安装的 AWS SDK,并定位 sns 组件头文件与库 |
add_executable | hello_sns.cpp | 将源码编译为可执行文件 |
target_link_libraries | ${AWSSDK_LINK_LIBRARIES} | 链接 SDK 库 |
值得注意的细节:
- Windows 下需要额外把
aws-cpp-sdk-all追加到CMAKE_PREFIX_PATH,否则find_package(AWSSDK)可能找不到已安装的 SDK; - 若 SDK 以动态库方式安装,Windows 构建时会通过
AWSSDK_CPY_DYN_LIBS把相关 DLL 复制到二进制输出目录,便于直接运行和调试;如果从命令行构建且 DLL 落在Debug等子目录,需要取消注释set(BIN_SUB_DIR "/Debug")并设置正确子目录; - 若构建失败(尤其 Windows 平台),优先检查并调整该 CMakeLists.txt。
源码剖析:ListTopics 分页调用全流程
示例全部逻辑位于 hello_sns.cpp 的main函数中,共分三个阶段。
阶段一:初始化 SDK
Aws::SDKOptions options; // options.loggingOptions.logLevel = Utils::Logging::LogLevel::Debug; // 可选:开启调试日志 Aws::InitAPI(options); // 整个进程只能调用一次Aws::InitAPI(options)必须在任何 SDK 调用前执行,且整个进程只调用一次;对应的Aws::ShutdownAPI(options)也必须在退出前且只调用一次。代码将主体逻辑放入独立花括号块,确保客户端析构完成后再关闭 SDK。若需要排查问题,可取消注释Debug级别的日志配置。
阶段二:创建客户端
Aws::Client::ClientConfiguration clientConfig; // clientConfig.region = "us-east-1"; // 可选:显式覆盖区域(默认读取配置) Aws::SNS::SNSClient snsClient(clientConfig);SNSClient的构造接受一个Aws::Client::ClientConfiguration,区域、超时等设置默认从 SDK 配置文件与凭证链解析;如需显式指定区域,可取消注释clientConfig.region一行。注意该模式与仓库中其他示例一致,例如 list_topics.cpp 中的listTopics函数同样接收clientConfiguration参数并构造SNSClient。
阶段三:分页列出主题并输出
Aws::Vector<Aws::SNS::Model::Topic> allTopics; Aws::String nextToken; do { Aws::SNS::Model::ListTopicsRequest request; if (!nextToken.empty()) { request.SetNextToken(nextToken); } const Aws::SNS::Model::ListTopicsOutcome outcome = snsClient.ListTopics(request); if (outcome.IsSuccess()) { const Aws::Vector<Aws::SNS::Model::Topic> &paginatedTopics = outcome.GetResult().GetTopics(); if (!paginatedTopics.empty()) { allTopics.insert(allTopics.cend(), paginatedTopics.cbegin(), paginatedTopics.cend()); } } else { std::cerr << "Error listing topics " << outcome.GetError().GetMessage() << std::endl; return 1; } nextToken = outcome.GetResult().GetNextToken(); } while (!nextToken.empty());要点解读:
- 分页处理:
ListTopics的响应是分页的,通过GetNextToken()取回下一页令牌,非空则继续请求,直到令牌为空,从而保证能拿到账号下全部主题; - Outcome 模式:SDK 采用
Outcome返回值,调用方先通过IsSuccess()判断成败,失败时从GetError().GetMessage()读取错误信息并返回非零退出码; - 结果收集:每页的
Topic对象(含TopicArn)追加到allTopics容器,最后统一打印:
std::cout << "Hello Amazon SNS! You have " << allTopics.size() << " topic" << (allTopics.size() == 1 ? "" : "s") << " in your account." << std::endl; if (!allTopics.empty()) { std::cout << "Here are your topic ARNs." << std::endl; for (const Aws::SNS::Model::Topic &topic: allTopics) { std::cout << " * " << topic.GetTopicArn() << std::endl; } }输出示例:当账号下没有主题时打印Hello Amazon SNS! You have 0 topics in your account.;有主题时额外逐行打印各主题 ARN(形如arn:aws:sns:region:account-id:topic-name)。
与单动作示例的异同
同一目录下的 list_topics.cpp 提供了等价的listTopics函数(位于AwsDoc::SNS命名空间,声明见 sns_samples.h),其分页循环与 hello_sns 完全一致,区别在于:它被编译为run_list_topics可执行文件,且通过#ifndef TESTING_BUILD包裹main,便于测试框架在TESTING_BUILD宏下直接复用该函数——这正是仓库示例"动作函数与 main 分离、可测试"的通用结构。
验证与测试:仓库内的自动化测试
仓库为 SNS 示例提供了完整的 GoogleTest 测试工程,可用于验证本示例所依赖的 SNS 客户端与凭证链路。
测试构建与运行
在 cpp/example_code/sns/README.md 中给出了标准流程:
cd <BUILD_DIR> cmake <path-to-root-of-this-source-code> -DBUILD_TESTS=ON make ctest其中<path-to-root-of-this-source-code>指向cpp/example_code/sns目录。主目录 CMakeLists.txt 在BUILD_TESTS开启时会add_subdirectory(tests);测试工程 tests/CMakeLists.txt 会查找或自动拉取 GoogleTest,并把所有gtest_*.cpp与对应的*.cpp示例源码一起编译进sns_gtest可执行文件。
与本示例直接相关的测试
gtest_list_topics.cpp 中的用例:
TEST_F(SNS_GTests, list_topics_2_) { auto result = AwsDoc::SNS::listTopics(*s_clientConfig); ASSERT_TRUE(result); }测试名后缀_2_表示该用例需要凭证与权限但不需要预先创建 AWS 资源(测试类型约定见文件头注释:_1_需要凭证、权限与 AWS 资源,_2_需要凭证与权限,_3_不需要凭证)。它直接复用listTopics,验证与 hello_sns 相同的核心调用链。
测试基础设施 sns_gtests.cpp 还提供了:
MockHTTP与CustomMockHTTPClient:对 HTTP 层进行 mock,用mock_input/*.xml文件(见 tests/mock_input)模拟服务端响应,避免真实请求;- 测试套件级(
SetUpTestSuite/TearDownTestSuite)的客户端配置、资源清理(如残留主题与订阅); TESTING_BUILD编译宏,配合源码中#ifndef TESTING_BUILD屏蔽各自的main。
运行示例
构建完成后,在build目录下直接运行:
./hello_sns程序会依次完成 SDK 初始化、客户端创建与分页列举,最终输出账号内的主题数量与全部主题 ARN。运行前请确认:
- 凭证已按标准链配置,且具备
AmazonSNSReadOnlyAccess或等价权限; - 目标区域选择正确(可通过
clientConfig.region覆盖); - 知晓运行可能产生费用。
延伸阅读
- 父级文档 cpp/example_code/sns/README.md 列出了全部 SNS 单动作与场景示例,包括创建/删除主题、发布消息、订阅(email/app/Lambda)、SMS 类型设置等;
- 单动作示例源码集中在 cpp/example_code/sns/ 目录,函数声明统一见 sns_samples.h;
- 跨服务场景 topics_and_queues 展示 SNS 主题与 SQS 队列联动的完整消息流;
- 更完整的 C++ SDK 使用指引见仓库根目录的 cpp/README.rst。
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
- 示例工程
- 教程
- 后端
【免费下载链接】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 for Java 2.x 实现 Amazon SNS 消息通知服务实践指南
AWS SDK for Java 2.x 实现 Amazon SNS 消息通知服务实践指南 概述 Amazon Simple Notification Serv
示例工程教程后端AWS Glue Hello 入门示例解析:使用 AWS SDK for C++ 调用 ListJobs
AWS Glue Hello 入门示例解析:使用 AWS SDK for C++ 调用 ListJobs 本文围绕 cpp/example_code/glue/
示例工程教程后端使用 AWS SDK for C++ 构建 Hello Amazon S3 入门项目:基于 aws-doc-sdk-examples 的完整实战指南
使用 AWS SDK for C++ 构建 Hello Amazon S3 入门项目:基于 aws doc sdk examples 的完整实战指南 本指南围绕
示例工程教程后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考