You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:51:30