ECS任务执行角色令牌过期问题:S3客户端配置是否有误?
ECS任务角色令牌过期问题排查
我有一个声明了任务执行角色的ECS任务定义,该角色拥有S3存储桶的读写权限。容器会不定期抛出令牌过期错误:
com.amazonaws.services.s3.model.AmazonS3Exception: The provided token has expired.
请问是否是S3客户端的构建配置存在问题?我的Spring配置如下:
@Bean public AmazonS3 amazonS3Client() { return AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build(); }
根据AWS文档:
新版本的AWS SDK在调用AWS API时会自动从AWS_CONTAINER_CREDENTIALS_RELATIVE_URI环境变量获取这些凭证。
输出包含应用访问AWS资源所用的访问密钥对(包含访问密钥ID和秘密访问密钥),以及AWS用于验证凭证有效性的令牌。默认情况下,通过任务角色分配给任务的凭证有效期为6小时,之后由Amazon ECS容器代理自动轮换。
问题确实出在S3客户端的配置上。当前代码构建的客户端只会在初始化时一次性获取凭证,不会自动处理凭证轮换。6小时后令牌过期,客户端仍使用旧的过期令牌,就会触发这个错误。
解决办法是让客户端使用动态凭证提供者,确保它能自动刷新过期凭证。修改Spring配置,显式指定默认凭证提供者链(它会自动识别ECS容器凭证并处理轮换):
@Bean public AmazonS3 amazonS3Client() { return AmazonS3ClientBuilder.standard() .withRegion(Regions.US_EAST_1) .withCredentials(DefaultAWSCredentialsProviderChain.getInstance()) .build(); }
另外要确认你的AWS SDK版本足够新,旧版本对ECS任务角色的凭证轮换支持可能不完善。DefaultAWSCredentialsProviderChain会自动从ECS的容器凭证环境变量获取凭证,并且在凭证过期时自动重新获取新的有效凭证,避免令牌过期错误。
内容的提问来源于stack exchange,提问作者steamrolla
相关产品推荐
相关产品推荐

