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
相关产品推荐
相关产品推荐

