如何在Java编写的AWS Lambda函数中访问AWS SSM Parameter Store?求示例
没问题!我来给你分享一个Java编写的AWS Lambda访问Systems Manager Parameter Store的完整示例,涵盖权限配置、依赖添加和代码实现,还有一些实用的最佳实践~
一、给Lambda配置IAM权限
Lambda需要有访问SSM Parameter Store的权限,所以得给它的执行角色附加一个自定义IAM策略。比如下面这个策略,允许获取指定路径下的参数(你可以根据自己的需求调整Resource范围):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter", "ssm:GetParameters", "ssm:GetParametersByPath" ], "Resource": [ "arn:aws:ssm:你的区域:你的账号ID:parameter/your-param-path/*", "arn:aws:ssm:你的区域:你的账号ID:parameter/your-specific-param" ] } // 如果你的参数是加密的(用KMS),还要加上KMS解密权限 // { // "Effect": "Allow", // "Action": "kms:Decrypt", // "Resource": "arn:aws:kms:你的区域:你的账号ID:key/你的KMS密钥ID" // } ] }
二、添加必要的依赖
如果用Maven管理项目,需要引入AWS SDK for Java v2的SSM模块和Lambda核心依赖(如果用的是Lambda的Java运行时,核心依赖可能已经包含,但显式声明更稳妥):
<dependencies> <!-- AWS Lambda Java Core --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>lambda</artifactId> <version>2.20.0</version> <scope>provided</scope> </dependency> <!-- AWS SSM SDK --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ssm</artifactId> <version>2.20.0</version> </dependency> <!-- 如果你需要处理JSON请求/响应,可选添加Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> </dependencies>
三、Lambda函数代码实现
这里给出两种常见场景的代码:获取单个参数,以及批量获取多个参数(批量获取更高效,减少API调用次数)。
示例1:获取单个参数
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.ssm.SsmClient; import software.amazon.awssdk.services.ssm.model.GetParameterRequest; import software.amazon.awssdk.services.ssm.model.GetParameterResponse; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; public class SsmParameterLambda implements RequestHandler<Object, String> { // 静态初始化SSM客户端,复用实例(Lambda容器会复用,减少冷启动开销) private static final SsmClient ssmClient; static { ssmClient = SsmClient.builder() .region(Region.US_EAST_1) // 替换成你的AWS区域 .build(); } @Override public String handleRequest(Object input, Context context) { String paramName = "/my-app/config/db-url"; // 替换成你的参数名称/路径 try { GetParameterRequest request = GetParameterRequest.builder() .name(paramName) .withDecryption(true) // 如果参数是加密的,设为true,否则false .build(); GetParameterResponse response = ssmClient.getParameter(request); String paramValue = response.parameter().value(); context.getLogger().log("成功获取参数值: " + paramValue); return "参数值已获取:" + paramValue; } catch (Exception e) { context.getLogger().log("获取参数失败: " + e.getMessage()); throw new RuntimeException("无法获取SSM参数", e); } } }
示例2:批量获取多个参数
如果需要一次性获取多个参数,用GetParametersRequest会更高效:
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.ssm.SsmClient; import software.amazon.awssdk.services.ssm.model.GetParametersRequest; import software.amazon.awssdk.services.ssm.model.GetParametersResponse; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.List; public class SsmBatchParameterLambda implements RequestHandler<Object, String> { private static final SsmClient ssmClient; static { ssmClient = SsmClient.builder() .region(Region.US_EAST_1) .build(); } @Override public String handleRequest(Object input, Context context) { List<String> paramNames = List.of( "/my-app/config/db-url", "/my-app/config/db-username", "/my-app/config/db-password" ); try { GetParametersRequest request = GetParametersRequest.builder() .names(paramNames) .withDecryption(true) .build(); GetParametersResponse response = ssmClient.getParameters(request); // 处理成功获取的参数 response.parameters().forEach(param -> { context.getLogger().log("参数 " + param.name() + " 的值: " + param.value()); }); // 处理未找到的参数(如果有的话) response.invalidParameters().forEach(invalidParam -> { context.getLogger().log("未找到参数: " + invalidParam); }); return "批量获取参数完成,成功获取 " + response.parameters().size() + " 个参数"; } catch (Exception e) { context.getLogger().log("批量获取参数失败: " + e.getMessage()); throw new RuntimeException("无法批量获取SSM参数", e); } } }
四、一些实用提示
- 复用SSM客户端:一定要用静态初始化的方式创建SSMClient,不要在
handleRequest方法里每次都新建,这样可以利用Lambda的容器复用机制,减少冷启动时间和资源消耗。 - 权限最小化:IAM策略里的Resource尽量缩小范围,不要用
*,只给Lambda需要访问的参数路径/名称权限。 - 加密参数处理:如果参数是用KMS加密的,记得给Lambda的执行角色添加KMS的
Decrypt权限,否则会报错。 - 错误处理:代码里要捕获可能的异常(比如参数不存在、权限不足等),并做好日志记录,方便排查问题。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

