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

Spring Boot用aws-java-sdk-dynamodb连DynamoDB时遇无效安全令牌异常

解决Spring Boot连接DynamoDB时的"安全令牌无效"异常

一、安全令牌是不是必须的?

完全不需要。只有使用临时凭证(比如IAM角色临时密钥、STS生成的短期凭证)时才需要安全令牌。如果是长期IAM用户的Access Key和Secret Key,直接使用即可,无需传入令牌。

二、报错原因

你碰到的UnrecognizedClientException(安全令牌无效),大概率是以下几种情况导致:

  • 环境存在残留令牌配置:系统环境变量AWS_SESSION_TOKEN/AWS_SECURITY_TOKEN存了旧值,或本地~/.aws/credentials文件里有过期的token字段,SDK会自动读取这些配置并带入请求,引发无效错误。
  • Access Key/Secret Key本身异常:比如密钥过期、权限被撤销,或是输入时出现大小写、特殊字符错误。
  • 凭证类型混淆:误用了临时凭证的Access Key却未传入对应令牌,或是长期密钥被错误关联了令牌配置。

三、成功连接的参考方案

方案1:清除残留的令牌配置

  • 检查系统环境变量,删除AWS_SESSION_TOKEN和AWS_SECURITY_TOKEN两个变量;
  • 打开本地~/.aws/credentials文件(Windows路径为C:\Users\<你的用户名>\.aws\credentials),确保没有多余的token字段,长期密钥的正确格式如下:
[default]
aws_access_key_id = 你的Access Key
aws_secret_access_key = 你的Secret Key

方案2:在Spring Boot中显式配置凭证(规避自动读取环境残留)

在application.properties或application.yml中直接指定凭证,强制SDK使用你提供的长期密钥:

application.properties配置:

aws.access-key=你的Access Key
aws.secret-key=你的Secret Key
aws.region=us-east-1 # 替换为你的DynamoDB所在区域

对应的配置类代码:

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DynamoDBConfig {

    @Value("${aws.access-key}")
    private String accessKey;

    @Value("${aws.secret-key}")
    private String secretKey;

    @Value("${aws.region}")
    private String region;

    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        return AmazonDynamoDBClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(region)
                .build();
    }
}

这种方式会跳过SDK的默认凭证链,直接使用你配置的密钥,避免读取到环境中的残留令牌。

方案3:使用IAM角色(生产环境推荐)

如果应用部署在AWS服务(如EC2、ECS、EKS)上,直接使用IAM角色即可,无需配置任何密钥,SDK会自动从实例元数据服务获取凭证,彻底避免密钥管理的麻烦:

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DynamoDBConfig {

    @Value("${aws.region}")
    private String region;

    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        return AmazonDynamoDBClientBuilder.standard()
                .withRegion(region)
                .withCredentials(com.amazonaws.auth.DefaultAWSCredentialsProviderChain.getInstance())
                .build();
    }
}

只需给对应的AWS资源绑定一个具备DynamoDB访问权限的IAM角色即可。

四、验证步骤

  1. 先用AWS CLI测试密钥有效性,执行以下命令:
aws dynamodb list-tables --region 你的区域 --profile default

若能成功返回表列表,说明密钥没问题,问题出在应用配置或环境残留。
2. 启动Spring Boot应用时,添加日志打印SDK使用的凭证信息(注意不要泄露敏感内容),检查是否意外带入了令牌。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:31:00