- 示例工程
- 教程
- 后端
【免费下载链接】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.
本文以 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):
- 拥有一个 AWS 账户;
- 按 AWS SDK for SAP ABAP 全局配置指南 配置默认凭证(Credentials)与默认 AWS 区域(Region);
- 每个示例均可用事务码
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 运行时异常均由此基类抛出。
执行流程拆解
- 创建会话:
/aws1/cl_rt_session_aws=>create( cv_pfl )使用配置文件ZCODE_DEMO(/aws1/rt_profile_id类型)创建 AWS 运行时会话。配置文件承载凭证与区域设置,是 SDK for SAP ABAP 的全局设置入口。 - 创建服务客户端:
/aws1/cl_smr_factory=>create( lo_session )通过工厂模式基于会话创建 Secrets Manager 客户端实例lo_smr。 - 发起调用:
lo_smr->getsecretvalue( iv_secretid = iv_secret_name )对应 Secrets Manager 的GetSecretValueAPI,返回结果对象lo_result。 - 提取返回值:
lo_result->get_secretstring( )从结果对象中取出SecretString字段并赋给输出参数ov_secret_value。 - 用户反馈:成功时抛出信息类消息
'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参数的嵌套内部表构造,共分三层:
- 过滤器列表:
VALUE /aws1/cl_smrfilter=>tt_filterslisttype( ... )创建过滤器类型的内部表; - 单个过滤器:
NEW /aws1/cl_smrfilter( iv_key = 'name' ... ),其中iv_key = 'name'表示按密钥名称过滤; - 过滤值列表:
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,表示立即永久删除而无需等待恢复窗口。
如何运行示例
- 将
sap-abap/services/smr/目录下的 abapGit 对象(类、测试类、包定义)导入 SAP 系统; - 确保已按 AWS SDK for SAP ABAP 全局配置指南 配置好默认凭证与区域,并确认配置文件 ID 为
ZCODE_DEMO(与源码中cv_pfl常量一致,若使用其他配置文件需同步修改); - 使用事务码
SE24打开类/AWSEX/CL_SMR_ACTIONS,在测试运行器中执行上述两个测试方法,或在 ABAP 程序中实例化该类并调用两个方法,传入实际的密钥名称/前缀; - 运行前请再次确认:测试会在测试 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.
相关推荐
使用 AWS SDK for Kotlin 读取 Secrets Manager 密钥:GetSecretValue 示例与测试实战
使用 AWS SDK for Kotlin 读取 Secrets Manager 密钥:GetSecretValue 示例与测试实战 导读 本文以 AWS 官方
示例工程教程后端使用 AWS SDK for .NET 读取 AWS Secrets Manager 密钥:GetSecretValue 实战指南
使用 AWS SDK for .NET 读取 AWS Secrets Manager 密钥:GetSecretValue 实战指南 本文以 AWS 官方示例仓库
示例工程教程后端使用 AWS SDK for C++ 读取 AWS Secrets Manager 密钥:getSecretValue 实战指南
使用 AWS SDK for C++ 读取 AWS Secrets Manager 密钥:getSecretValue 实战指南 本文以 cpp/example
示例工程教程后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考