AWS凭证过期后自动更新方案求助:SES客户端凭证过期问题
AWS STS凭证自动更新解决方案(针对SES客户端)
问题根源
你当前代码中使用的AWSStaticCredentialsProvider是静态凭证提供者,只会在Bean初始化时获取一次STS角色凭证,不会自动处理凭证过期后的刷新逻辑,这就是触发ExpiredToken错误的原因。
核心修复方案
不要手动调用getCredentials()获取静态凭证,直接将STSAssumeRoleSessionCredentialsProvider传给SES客户端构建器——AWS SDK原生支持凭证的自动过期检测与刷新。
修正后的Bean代码
@Bean public AmazonSimpleEmailService getSesClient() { STSAssumeRoleSessionCredentialsProvider stsCredentialsProvider = new STSAssumeRoleSessionCredentialsProvider.Builder( "ses-role-us-west-2", "mail-sender" ).build(); return AmazonSimpleEmailServiceClientBuilder.standard() .withCredentials(stsCredentialsProvider) // 直接传入动态STS凭证提供者 .withRegion(Regions.US_WEST_2) .build(); }
生效原理
STSAssumeRoleSessionCredentialsProvider是动态凭证提供者,AWS SDK在每次发起请求前会自动检查凭证有效期,默认提前5分钟检测到即将过期时,会自动调用STS服务刷新凭证。- 单例SES客户端Bean可安全复用,无需每次发送邮件时重新创建,符合Spring最佳实践。
可选优化:自定义刷新阈值
如果需要调整凭证提前刷新的时间,可通过withRefreshThresholdSeconds()设置,比如提前10分钟刷新:
STSAssumeRoleSessionCredentialsProvider stsCredentialsProvider = new STSAssumeRoleSessionCredentialsProvider.Builder( "ses-role-us-west-2", "mail-sender" ) .withRefreshThresholdSeconds(600) // 设置提前10分钟刷新凭证 .build();
内容的提问来源于stack exchange,提问作者Arkadiy Broun
相关产品推荐
相关产品推荐

