news 2026/10/7 3:05:40

使用 AWS SDK for SAP ABAP 读取 Secrets Manager 密钥:GetSecretValue 与 BatchGetSecretValue 示例深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 AWS SDK for SAP ABAP 读取 Secrets Manager 密钥:GetSecretValue 与 BatchGetSecretValue 示例深度解析
  • 示例工程
  • 教程
  • 后端

【免费下载链接】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.

项目地址:https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples
点击查看免费下载

本文以 sap-abap/services/smr/README.md 为主线,结合仓库中smr目录下的完整 ABAP 源码与单元测试,系统讲解如何通过 AWS SDK for SAP ABAP 调用 AWS Secrets Manager 的两个核心读取动作:GetSecretValue(获取单个密钥)与BatchGetSecretValue(按过滤器批量获取密钥)。读者将掌握会话与客户端工厂的创建模式、请求参数与返回值类型、异常处理分支,以及如何用DANGEROUS级别的 ABAP 单元测试在真实 AWS 环境中验证读取逻辑。

概述:示例做了什么

Secrets Manager 是一项用于安全地加密、存储和检索数据库及其他服务凭据的 AWS 服务。本示例展示了如何在 SAP ABAP 环境中通过 AWS SDK for SAP ABAP 与之交互,覆盖两种单动作(Single actions):

  • GetSecretValue:根据密钥 ID 获取单个密钥的明文值;
  • BatchGetSecretValue:通过过滤器(Filter)一次查询并批量返回多个密钥值。

这两个动作的完整实现位于 核心实现类#awsex#cl_smr_actions.clas.abap,其类元数据声明于 类 XML 定义(类名/AWSEX/CL_SMR_ACTIONS,描述为 "Secrets-manager Code Example",已启用单元测试WITH_UNIT_TESTS),所属包定义于 package.devc.xml。测试逻辑则位于 单元测试类。

⚠ 重要提示:运行这些代码(含测试)可能在你的 AWS 账户中产生费用。建议遵循最小权限原则,仅为任务授予所需的最低权限;该代码未经所有 AWS 区域的验证,具体可用性请参考 AWS 区域服务列表。

前置条件

在运行示例之前,需要先完成以下准备工作(详见 sap-abap 目录总 README):

  1. 拥有一个 AWS 账户;
  2. 按 AWS SDK for SAP ABAP 全局配置指南 配置默认凭证(Credentials)与默认 AWS 区域(Region);
  3. 每个示例均可用事务码SE24(Class Builder)执行,各服务目录下的独立 README 提供了该服务的具体示例说明。

代码示例以 abapGit 对象格式存放于sap-abap/services/smr/目录,可直接通过 abapGit 导入 SAP 系统后运行。

单动作一:GetSecretValue 获取单个密钥

GetSecretValue是最基础的密钥读取动作。原 README 中链接的代码位置为 GetSecretValue 示例,其完整实现如下:

METHOD get_secret_value. CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). DATA(lo_smr) = /aws1/cl_smr_factory=>create( lo_session ). " snippet-start:[smr.abapv1.get_secret_value] TRY. " iv_secret_name = 'MySecretName' DATA(lo_result) = lo_smr->getsecretvalue( iv_secretid = iv_secret_name ). ov_secret_value = lo_result->get_secretstring( ). MESSAGE 'Secret value retrieved successfully.' TYPE 'I'. CATCH /aws1/cx_smrresourcenotfoundex. MESSAGE 'The requested secret was not found.' TYPE 'E'. CATCH /aws1/cx_smrdecryptionfailure. MESSAGE 'Failed to decrypt the secret.' TYPE 'E'. CATCH /aws1/cx_smrinvalidparameterex. MESSAGE 'Invalid parameter provided.' TYPE 'E'. CATCH /aws1/cx_smrinvalidrequestex. MESSAGE 'Invalid request.' TYPE 'E'. ENDTRY. " snippet-end:[smr.abapv1.get_secret_value] ENDMETHOD.

方法签名与参数类型

对应类定义中(#awsex#cl_smr_actions.clas.abap第 10~16 行)的方法签名为:

METHODS get_secret_value IMPORTING !iv_secret_name TYPE /aws1/smrsecretidtype EXPORTING !ov_secret_value TYPE /aws1/smrsecretstringtype RAISING /aws1/cx_rt_generic.
  • iv_secret_name(/aws1/smrsecretidtype):要读取的密钥 ID。注意该类型对应 Secrets Manager 的SecretId,既可以是密钥名称(Name),也可以是密钥的 Amazon Resource Name(ARN);实际使用时可传入类似'MySecretName'的字面值。
  • ov_secret_value(/aws1/smrsecretstringtype):返回的密钥明文,类型对应 API 的SecretString。对于存储 JSON 文本(如数据库连接串、用户名密码)的密钥,可直接使用该值。
  • 方法以RAISING /aws1/cx_rt_generic声明,所有 AWS 运行时异常均由此基类抛出。

执行流程拆解

  1. 创建会话:/aws1/cl_rt_session_aws=>create( cv_pfl )使用配置文件ZCODE_DEMO(/aws1/rt_profile_id类型)创建 AWS 运行时会话。配置文件承载凭证与区域设置,是 SDK for SAP ABAP 的全局设置入口。
  2. 创建服务客户端:/aws1/cl_smr_factory=>create( lo_session )通过工厂模式基于会话创建 Secrets Manager 客户端实例lo_smr。
  3. 发起调用:lo_smr->getsecretvalue( iv_secretid = iv_secret_name )对应 Secrets Manager 的GetSecretValueAPI,返回结果对象lo_result。
  4. 提取返回值:lo_result->get_secretstring( )从结果对象中取出SecretString字段并赋给输出参数ov_secret_value。
  5. 用户反馈:成功时抛出信息类消息'Secret value retrieved successfully.'(TYPE 'I')。

异常处理分支

示例对四种典型的 Secrets Manager 异常分别做了明确处理:

异常类含义示例处理
/aws1/cx_smrresourcenotfoundex请求的密钥不存在(ResourceNotFoundException)输出'The requested secret was not found.'
/aws1/cx_smrdecryptionfailure密钥解密失败(DecryptionFailure,多与 KMS 权限或密钥问题相关)输出'Failed to decrypt the secret.'
/aws1/cx_smrinvalidparameterex参数无效(InvalidParameterException)输出'Invalid parameter provided.'
/aws1/cx_smrinvalidrequestex请求无效(InvalidRequestException)输出'Invalid request.'

这种"业务异常细分 + 运行时基类兜底"的结构是 SDK for SAP ABAP 异常处理的典型写法,便于在生产环境中针对不同失败原因做差异化告警与重试策略。

单动作二:BatchGetSecretValue 批量获取密钥

BatchGetSecretValue允许通过过滤器一次查询多个密钥,适合批量拉取一批关联凭据的场景。原 README 中链接的代码位置为 BatchGetSecretValue 示例,其完整实现如下:

METHOD batch_get_secret_value. CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). DATA(lo_smr) = /aws1/cl_smr_factory=>create( lo_session ). " snippet-start:[smr.abapv1.batch_get_secret_value] TRY. " iv_filter_name = 'mySecret' DATA(lo_result) = lo_smr->batchgetsecretvalue( it_filters = VALUE /aws1/cl_smrfilter=>tt_filterslisttype( ( NEW /aws1/cl_smrfilter( iv_key = 'name' it_values = VALUE /aws1/cl_smrfiltvalsstrlist_w=>tt_filtervaluesstringlist( ( NEW /aws1/cl_smrfiltvalsstrlist_w( iv_value = iv_filter_name ) ) ) ) ) ) ). ot_secret_values = lo_result->get_secretvalues( ). MESSAGE 'Secrets retrieved successfully.' TYPE 'I'. CATCH /aws1/cx_smrresourcenotfoundex. MESSAGE 'One or more requested secrets were not found.' TYPE 'E'. CATCH /aws1/cx_smrdecryptionfailure. MESSAGE 'Failed to decrypt one or more secrets.' TYPE 'E'. CATCH /aws1/cx_smrinvalidparameterex. MESSAGE 'Invalid parameter provided.' TYPE 'E'. CATCH /aws1/cx_smrinvalidrequestex. MESSAGE 'Invalid request.' TYPE 'E'. ENDTRY. " snippet-end:[smr.abapv1.batch_get_secret_value] ENDMETHOD.

方法签名与参数类型

METHODS batch_get_secret_value IMPORTING !iv_filter_name TYPE /aws1/smrfiltervaluestringtype EXPORTING !ot_secret_values TYPE /aws1/cl_smrsecretvalueentry=>tt_secretvaluestype RAISING /aws1/cx_rt_generic.
  • iv_filter_name(/aws1/smrfiltervaluestringtype):过滤器值,即按密钥名称前缀进行匹配的字符串,例如'mySecret'或测试中使用的abap-smr-test-secret-前缀。
  • ot_secret_values(/aws1/cl_smrsecretvalueentry=>tt_secretvaluestype):批量返回的结果表,元素为SecretValueEntry类型的内部表。

过滤器结构的嵌套构建

本示例的核心难点在于it_filters参数的嵌套内部表构造,共分三层:

  1. 过滤器列表:VALUE /aws1/cl_smrfilter=>tt_filterslisttype( ... )创建过滤器类型的内部表;
  2. 单个过滤器:NEW /aws1/cl_smrfilter( iv_key = 'name' ... ),其中iv_key = 'name'表示按密钥名称过滤;
  3. 过滤值列表:VALUE /aws1/cl_smrfiltvalsstrlist_w=>tt_filtervaluesstringlist( ( NEW /aws1/cl_smrfiltvalsstrlist_w( iv_value = iv_filter_name ) ) )为当前过滤器指定匹配值(支持多值)。

调用完成后,lo_result->get_secretvalues( )返回全部匹配密钥的条目表,供上层进一步遍历读取每个条目的SecretString。

单元测试:真实 AWS 环境下的验证

示例配套的单元测试位于 单元测试类#awsex#cl_smr_actions.clas.testclasses.abap,其声明为:

CLASS ltc_awsex_cl_smr_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL DANGEROUS.

DURATION LONG与RISK LEVEL DANGEROUS意味着该测试会在测试账户中创建并删除真实的 AWS 资源,因此只能在合适的测试专用 AWS 账户中运行(该风险提示同时出现在 sap-abap 目录总 README 中)。

测试准备(class_setup)

  • 通过/awsex/cl_utils=>get_random_string( )生成随机后缀,构造三个互不冲突的密钥名:abap-smr-test-secret-{uuid}、...-2、...-3;
  • 分别写入三种典型 JSON 负载:{"username":"testuser","password":"testpass123"}、{"api_key":"test-api-key-456"}、{"database":"mydb","connection":"test-conn"};
  • 每个密钥均附加标签convert_test = true;
  • 创建后WAIT UP TO 5 SECONDS等待密钥在服务端传播完成;
  • 若捕获到/aws1/cx_smrresourceexistsex(资源已存在),则视为上次测试遗留,继续执行。

测试用例一:get_secret_value

调用get_secret_value读取已创建的密钥后,使用 ABAP 单元测试断言库cl_abap_unit_assert验证:

  • assert_not_initial:返回的密钥值不能为空;
  • assert_true:密钥值中应包含子串username,确认读取内容与写入的 JSON 一致。

测试用例二:batch_get_secret_value

  • 通过正则'(.+)-[^-]+$'从密钥名中提取前缀(即去掉末尾 UUID 部分),得到三个密钥共享的名称前缀;
  • 以该前缀作为iv_filter_name调用batch_get_secret_value;
  • 断言:至少返回 1 个密钥条目;遍历结果表中至少存在一个条目的SecretString非空。

测试清理(class_teardown)

对三个密钥依次调用deletesecret( iv_secretid = ... iv_forcedeletewithoutrec = abap_true )强制无恢复删除;捕获/aws1/cx_smrresourcenotfoundex以容忍"已删除"状态。forcedeletewithoutrec = abap_true对应 API 的ForceDeleteWithoutRecovery,表示立即永久删除而无需等待恢复窗口。

如何运行示例

  1. 将sap-abap/services/smr/目录下的 abapGit 对象(类、测试类、包定义)导入 SAP 系统;
  2. 确保已按 AWS SDK for SAP ABAP 全局配置指南 配置好默认凭证与区域,并确认配置文件 ID 为ZCODE_DEMO(与源码中cv_pfl常量一致,若使用其他配置文件需同步修改);
  3. 使用事务码SE24打开类/AWSEX/CL_SMR_ACTIONS,在测试运行器中执行上述两个测试方法,或在 ABAP 程序中实例化该类并调用两个方法,传入实际的密钥名称/前缀;
  4. 运行前请再次确认:测试会在测试 AWS 账户中创建并删除真实密钥,可能产生费用。

关于测试运行的通用说明,参见 sap-abap 目录总 README。

附加资源

  • Secrets Manager 用户指南
  • Secrets Manager API Reference
  • SDK for SAP ABAP Secrets Manager 参考文档

小结

通过本示例可以完整看到 AWS SDK for SAP ABAP 与 Secrets Manager 集成的标准范式:ZCODE_DEMO配置文件创建会话 → 工厂创建服务客户端 → 调用 CamelCase 命名的服务方法(getsecretvalue、batchgetsecretvalue)→ 结果对象 getter 提取字段 → 细分异常类处理失败。其中BatchGetSecretValue的三层嵌套过滤器构造、批量结果表遍历,以及配套测试中"随机命名、真实建删、前缀批量验证"的测试策略,均可直接迁移到实际的 SAP 系统与 Secrets Manager 凭据管理场景中。


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.

项目地址:https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 3:05:22

SpringBoot智慧校园平台实战:从架构设计到部署避坑全记录

做智慧校园这个方向之前,我其实已经带团队接过不少类似的管理系统项目,但很多都是“小切口”式的:做一个失物招领、做一个课程表、做一个报修单。真正把“综合服务平台”这个概念落地,SpringBoot才是我绕不开的选择。这篇不是来科…

作者头像 李华
网站建设 2026/10/7 3:04:57

链表真的“已死”吗?CPU缓存与内存池下的数据结构真相

1. 先泼一盆冷水:链表不是死了,是退出了“新手村”我入行那年,面试官必问“链表和数组的区别”,背得滚瓜烂熟:数组连续内存、链表节点散落、插入删除O(1)、随机访问O(n)。那时候谁要是说“链表已死”,怕不是…

作者头像 李华
网站建设 2026/10/7 3:04:32

OpenClaw部署实战:Windows WSL2 + Ollama本地模型 + Skill开发完整指南

这两天在社区里看到不少人问OpenClaw(老玩家还是习惯叫它Clawdbot)的部署问题,特别是2026年之后项目架构调整过一轮,网上很多教程还是老写法,照着抄很容易卡在环境上。我自己前前后后在不同机器上部署了七八遍&#xf…

作者头像 李华
网站建设 2026/10/7 3:04:23

TeamCenter JavaAPI接入实战:从连不上到高并发稳定调用

简介:本资源是面向PLM系统开发工程师与Java集成开发者的TeamCenter Java API实战入门包,聚焦西门子TeamCenter平台的二次开发与系统集成场景。压缩包内含API开发文档、典型功能示例代码及核心库文件,覆盖用户管理、项目与BOM配置、变更流程控…

作者头像 李华
网站建设 2026/10/7 3:04:06

开源下载工具全攻略:用 aria2 与 qBittorrent 统一管理多设备下载

这几年我把主力下载工具从 IDM 和传统 BitTorrent 客户端,一点点换成了开源方案。先说我个人的结论:BitTorrent 协议并没有过时,过时的只是老工具那种“装一个软件只管一个协议”的思路;IDM 作为经典下载器也依旧能打,…

作者头像 李华
网站建设 2026/10/7 3:04:05

局域网与广域网技术全解析:从基础原理到工程实践

在计科专业里,计算机网络这门课有个很现实的问题:教材把网络分成了OSI七层、TCP/IP四层,但翻开第五章"局域网与广域网技术"时,很多同学会突然懵掉——前面刚把HTTP、TCP、IP这些"高层"概念过了一遍&#xff0…

作者头像 李华