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

Java从AWS会话获取凭证:避免硬编码密钥调用API Gateway

在AWS Lambda的Java代码中自动获取AWS凭证替代硬编码

在AWS Lambda环境中,你无需硬编码AWS凭证,AWS会自动为Lambda执行角色提供临时凭证。可以通过AWS SDK for Java的凭证提供者链来获取这些凭证,效果等同于Python Boto3里的session.get_credentials()。

步骤1:添加AWS SDK依赖

确保项目引入AWS SDK for Java核心模块(以Maven为例):

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-core</artifactId>
    <version>1.12.500</version> <!-- 使用最新稳定版本 -->
</dependency>

步骤2:修改代码自动获取凭证

替换硬编码的凭证变量,通过DefaultAWSCredentialsProviderChain自动拉取Lambda环境中的临时凭证:

import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSSessionCredentials;

import auth.AWS4SignerBase;
import auth.AWS4SignerForAuthorizationHeader;
import util.HttpUtils;

class Main {
  public static void main(String[] args) throws Exception {

    URL endpointUrl = new URL("https://lmno456.execute-api.us-east-1.amazonaws.com/prod/controlplane/model/a1");
    var regionName = "us-east-1";

    // 自动获取Lambda环境中的凭证
    DefaultAWSCredentialsProviderChain credentialsProvider = new DefaultAWSCredentialsProviderChain();
    AWSCredentials credentials = credentialsProvider.getCredentials();
    
    String awsAccessKey = credentials.getAWSAccessKeyId();
    String awsSecretKey = credentials.getAWSSecretKey();
    String awsSessionToken = null;
    
    // Lambda临时凭证包含会话令牌,需判断类型后提取
    if (credentials instanceof AWSSessionCredentials) {
        awsSessionToken = ((AWSSessionCredentials) credentials).getSessionToken();
    }

    // GET请求无请求体,使用预计算的空哈希值
    Map<String, String> headers = new HashMap<String, String>();
    headers.put("x-amz-content-sha256", AWS4SignerBase.EMPTY_BODY_SHA256);
    
    // 若存在会话令牌,添加到请求头
    if (awsSessionToken != null) {
        headers.put("X-Amz-Security-Token", awsSessionToken);
    }

    AWS4SignerForAuthorizationHeader signer = new AWS4SignerForAuthorizationHeader(endpointUrl, "GET", "execute-api", regionName);

    String authorization = signer.computeSignature(headers,
                                            null, // 无查询参数
                                            AWS4SignerBase.EMPTY_BODY_SHA256,
                                            awsAccessKey,
                                            awsSecretKey);

    headers.put("Authorization", authorization);
    String response = HttpUtils.invokeHttpRequest(endpointUrl, "GET", headers, null);
    System.out.println("--------- Response content ---------");
    System.out.println(response);
    System.out.println("------------------------------------");
  }
}

关键说明

  • DefaultAWSCredentialsProviderChain会按优先级从多个来源获取凭证,在Lambda环境中会直接取用执行角色的临时凭证,无需手动配置。
  • Lambda提供的临时凭证属于AWSSessionCredentials类型,必须判断类型后提取会话令牌并添加到请求头。
  • 需确保Lambda执行角色拥有调用目标API Gateway端点的权限(例如execute-api:Invoke权限)。

内容的提问来源于stack exchange,提问作者dredbound

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:20:28