访问CloudTrail Events触发UnrecognizedClientException的原因及代码问题咨询
排查CloudTrail LookupEvents调用时的UnrecognizedClientException异常
你遇到的UnrecognizedClientException(请求中的安全令牌无效),核心问题出在临时凭证的处理和重复配置上,以下是具体问题点和修正方案:
代码中的两个关键问题
- 临时凭证存储错误:AssumeRole返回的临时凭证包含
accessKeyId、secretAccessKey和**sessionToken**三个字段,但你使用的BasicAWSCredentials仅支持前两个字段,无法携带session token,导致CloudTrail服务无法识别有效凭证。 - 重复配置凭证提供者:已经通过
AWSCloudTrailClientBuilder为客户端设置了凭证,再在LookupEventsRequest中调用withRequestCredentialsProvider属于冗余操作,可能引发凭证逻辑冲突。
修正后的代码
AWSCloudTrailClientBuilder awsCloudTrailClientBuilder = AWSCloudTrailClientBuilder.standard(); // 使用BasicSessionCredentials存储完整的临时凭证(包含sessionToken) AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider( new BasicSessionCredentials( awsCredentials.getAccessKeyId(), awsCredentials.getSecretAccessKey(), awsCredentials.getSessionToken() // 补充sessionToken ) ); AWSCloudTrail awsCloudTrailClient = awsCloudTrailClientBuilder .withClientConfiguration(new ClientConfiguration() .withSocketTimeout(5000) .withConnectionMaxIdleMillis(30000L)) .withCredentials(awsCredentialsProvider) .withRegion(Regions.US_EAST_1) .build(); // 移除request中的凭证配置,直接使用客户端已有的凭证 LookupEventsRequest request = new LookupEventsRequest(); LookupEventsResult lookupEventsResult = awsCloudTrailClient.lookupEvents(request);
额外验证点
- 确认
awsCredentials对象确实包含有效的sessionToken值,避免AssumeRole调用后未正确提取该字段。 - 再次验证RoleA的权限策略是否包含
cloudtrail:LookupEvents动作,且资源范围正确(可临时设为*测试)。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

