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角色即可。
四、验证步骤
- 先用AWS CLI测试密钥有效性,执行以下命令:
aws dynamodb list-tables --region 你的区域 --profile default
若能成功返回表列表,说明密钥没问题,问题出在应用配置或环境残留。
2. 启动Spring Boot应用时,添加日志打印SDK使用的凭证信息(注意不要泄露敏感内容),检查是否意外带入了令牌。
内容的提问来源于stack exchange,提问作者nsingla85
相关产品推荐
相关产品推荐

