使用 AWS SDK for C++ 调用 AWS STS:AssumeRole 临时凭证示例详解

发布时间:2026/9/24 16:31:36
使用 AWS SDK for C++ 调用 AWS STS:AssumeRole 临时凭证示例详解 使用 AWS SDK for C 调用 AWS STSAssumeRole 临时凭证示例详解【免费下载链接】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-examplesAWS Security Token ServiceAWS STS用于为可信用户颁发可控制 AWS 资源访问权限的临时安全凭证。本文以 aws-doc-sdk-examples 仓库中 cpp/example_code/sts 目录下的官方 C 示例为主线完整讲解如何构建、运行并用 gtest 验证AssumeRole操作帮助读者掌握在 C 应用中安全换取跨账户临时凭证并以此访问外部账户 S3 资源的完整实战流程。概述示例在项目中的定位该示例展示了使用 AWS SDK for C 与 AWS STS 协同工作的标准做法覆盖两大核心场景调用AssumeRole传入角色 ARN、会话名称与外部 IDExternalId换取一组临时安全凭证Access Key、Secret Key、Session Token。临时凭证的落地使用用换取的临时凭证初始化 S3 客户端列出外部账户下的 S3 存储桶验证凭证的实际可用性。源码文件清单位于 cpp/example_code/sts文件作用assume_role.cpp核心示例assumeRole()函数实现与可执行入口mainsts_samples.h声明AwsDoc::STS::assumeRole接口CMakeLists.txt顶层构建脚本生成run_assume_role可执行文件tests/gtest_assume_role.cpp单元测试真实调用 Mock HTTP 两种模式tests/sts_gtests.cpp测试夹具创建/删除 IAM Role、构造信任策略tests/mock_input/AssumeRole.xmlMock 模式下模拟的 STS 响应报文前置条件运行示例前请先按官方指南完成 SDK 安装与凭据配置安装 AWS SDK for C并完成凭据、区域等环境初始化对应官方Getting started流程。了解本仓库代码示例的构建与运行约定每个源文件都会生成一个可执行文件位于构建目录中命名为run_ 源文件名去掉后缀。准备一个已存在的 IAM 角色且该角色需信任你的账户信任策略中授予sts:AssumeRole权限。⚠️ 注意运行本示例或测试可能产生 AWS 账户费用建议参考 AWS 定价与免费套餐说明。建议遵循最小权限原则仅授予完成任务所必需的最低权限。本示例代码未在所有 AWS 区域进行测试请确认目标服务在你所使用的区域可用。核心实现assumeRole 函数逐行解析assumeRole的完整实现位于 assume_role.cpp其函数签名声明于 sts_samples.hbool AwsDoc::STS::assumeRole(const Aws::String roleArn, const Aws::String roleSessionName, const Aws::String externalId, Aws::Auth::AWSCredentials credentials, const Aws::Client::ClientConfiguration clientConfig);参数含义与取值范围参数说明roleArn目标 IAM 角色的 Amazon Resource NameARN形如arn:aws:iam::account-id:role/role-nameroleSessionName会话名称。从源码测试可见其被限制在 62 个字符以内见 gtest_assume_role.cpp用于在 CloudTrail 等审计日志中标识该会话externalId外部 ID。可选但推荐使用用于防止混淆代理人攻击示例中采用固定值012345见 assume_role.cpp生产环境应使用随机生成的高熵值credentials输出参数用于接收临时凭证是标准的Aws::Auth::AWSCredentials实例clientConfig客户端配置可指定区域示例中以注释形式给出clientConfig.region us-east-1的用法见 assume_role.cpp调用流程Aws::STS::STSClient sts(clientConfig); Aws::STS::Model::AssumeRoleRequest sts_req; sts_req.SetRoleArn(roleArn); sts_req.SetRoleSessionName(roleSessionName); sts_req.SetExternalId(externalId); const Aws::STS::Model::AssumeRoleOutcome outcome sts.AssumeRole(sts_req); if (!outcome.IsSuccess()) { std::cerr Error assuming IAM role. outcome.GetError().GetMessage() std::endl; } else { // 从结果中取出临时凭证 const Aws::STS::Model::AssumeRoleResult result outcome.GetResult(); const Aws::STS::Model::Credentials temp_credentials result.GetCredentials(); // 将 STS 返回的凭证写入 AWSCredentials 对象 credentials.SetAWSAccessKeyId(temp_credentials.GetAccessKeyId()); credentials.SetAWSSecretKey(temp_credentials.GetSecretAccessKey()); credentials.SetSessionToken(temp_credentials.GetSessionToken()); }流程要点基于ClientConfiguration创建STSClient。构造AssumeRoleRequest并填充角色 ARN、会话名称、外部 ID 三个字段。调用sts.AssumeRole()获取AssumeRoleOutcome。通过outcome.IsSuccess()判断成败失败时用outcome.GetError().GetMessage()输出错误详情。成功时将AssumeRoleResult.GetCredentials()中的临时凭证回填到AWSCredentials输出参数。源码注释特别提醒STS 返回的Credentials对象与常规使用的AWSCredentials对象不同因此必须显式搬运 AccessKeyId、SecretAccessKey 与 SessionToken 三个字段。完整运行入口main 函数实战演示示例的可执行入口在 assume_role.cpp通过#ifndef TESTING_BUILD与测试构建隔离测试编译时定义TESTING_BUILD宏从而跳过main。命令行用法run_assume_role role_arn role_session_name完整执行逻辑校验参数个数必须为 3程序名 两个参数否则打印用法并退出。调用Aws::InitAPI(options)初始化 SDK 运行时环境。读取roleArn、roleSessionName使用固定外部 ID012345。调用assumeRole()失败则返回退出码 1。凭证落地验证用换取的临时凭证创建 S3 客户端Aws::S3::S3Client s3(credentials)调用s3.ListBuckets()列出外部账户的存储桶并逐个打印名称。注意被扮演的角色必须授予相应的 Amazon S3 权限否则该步会失败见 assume_role.cpp。退出作用域后调用Aws::ShutdownAPI(options)清理 SDK。这段代码直观展示了 STS 临时凭证最典型的应用模式扮演角色 → 获取临时凭证 → 用临时凭证驱动其他 AWS 服务客户端。构建示例CMake 配置解读顶层 CMakeLists.txt 定义了构建规则关键点如下最低 CMake 版本要求3.13C 标准为 C11默认构建共享库。通过find_package(AWSSDK REQUIRED COMPONENTS ${SERVICE_COMPONENTS})查找 SDK本示例依赖三个组件sts、iam、s3见 CMakeLists.txt。遍历所有.cpp源文件生成同名可执行文件源文件assume_role.cpp对应目标run_assume_role。支持用AWSDOC_SOURCE变量在命令行限定参与构建的源文件。当BUILD_TESTSON时通过add_subdirectory(tests)引入测试子项目。运行单元测试测试类型约定测试文件 gtest_assume_role.cpp 顶部注释明确了命名约定测试名后缀_1_表示需要凭据、权限和 AWS 资源_2_表示需要凭据和权限_3_表示无需真实凭据走 Mock。两个测试用例assume_role_2U_真实调用需要当前用户环境后缀U表示仅在用户环境运行在 EC2 实例等已扮演角色的环境中会失败。流程为通过测试夹具创建 IAM 角色并获取其 ARN生成 62 字符以内的随机会话名随后最多重试 20 次、每次间隔 1 秒调用assumeRole()以等待新创建角色在 AWS 全局传播生效见 gtest_assume_role.cpp。assume_role_3_Mock 模式通过MockHTTP加载 mock_input/AssumeRole.xml 作为模拟响应无需真实 AWS 凭据即可验证代码路径。该 XML 模拟了包含AssumedRoleUser、CredentialsAccessKeyId、SecretAccessKey、SessionToken、Expiration与ResponseMetadata的标准 STS 响应报文。测试夹具细节测试夹具定义在 sts_gtests.cpp 与 sts_gtests.hSetUpTestSuite中调用InitAPI并初始化s_clientConfig必须是指针因为配置要在InitAPI之后创建。createRole()通过 IAM 客户端创建角色并使用getAssumeRolePolicyJSON()动态生成信任策略——该策略基于当前用户的 ARN 构造Principal授予sts:AssumeRole动作见 sts_gtests.cpp。测试结束后TearDownTestSuite会调用deleteRole()清理已创建的角色避免残留资源。自定义CustomMockHTTPClient对凭据请求URI 中含/credentials/单独返回模拟的临时凭证响应其余请求才走预设的 Mock 响应确保测试过程中 SDK 内部的元数据服务/配置文件凭据请求不会被 Mock 响应污染见 sts_gtests.cpp。运行测试的命令在测试子目录的 CMakeLists.txt 中测试目标名为sts_gtest依赖sts、iam、s3组件与 GTest若系统未安装 GTest会自动通过 FetchContent 拉取 googletest release-1.12.1。测试构建会定义TESTING_BUILD宏与SRC_DIR宏用于定位 Mock 输入文件。在构建目录中执行cd BUILD_DIR cmake path-to-root-of-this-source-code -DBUILD_TESTSON make ctest⚠️ 运行assume_role_2U_这类真实调用测试会产生真实的 AWS API 调用可能产生费用。补充资料导航本示例所在源码目录cpp/example_code/sts更多 C AWS SDK 代码示例入口cpp/example_codeSTS 临时凭证概念可参阅 AWS STS 用户指南与 API 参考中关于AssumeRole的说明C SDK 的 STS 客户端 API 说明可查阅随 SDK 安装的aws-cpp-sdk-sts头文件如 assume_role.cpp 所引用的aws/sts/STSClient.h与aws/sts/model/AssumeRoleRequest.h。Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.SPDX-License-Identifier: Apache-2.0【免费下载链接】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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询