从AWS Secrets Manager获取第2个密钥时触发SdkClientException求助
AWS Secrets Manager 获取特定密钥触发中断异常排查
问题背景
从AWS Secrets Manager获取4个密钥时,3个可正常获取,但第2个密钥始终触发中断异常,已确认该密钥在AWS端存在且值符合预期。当前使用Reactiverse AWS SDK结合Vert.x与AWS SDK 2开发。
异常堆栈信息
java.util.concurrent.ExecutionException: software.amazon.awssdk.core.exception.SdkClientException at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395) at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999) at io.vertx.core.impl.ContextImpl.lambda$null$0(ContextImpl.java:159) at io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:100) at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:157) at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: software.amazon.awssdk.core.exception.SdkClientException at software.amazon.awssdk.core.exception.SdkClientException$BuilderImpl.build(SdkClientException.java:98) at software.amazon.awssdk.core.internal.http.AmazonAsyncHttpClient$RequestExecutionBuilderImpl.execute(AmazonAsyncHttpClient.java:189) at software.amazon.awssdk.core.internal.handler.BaseAsyncClientHandler.invoke(BaseAsyncClientHandler.java:271) at software.amazon.awssdk.core.internal.handler.BaseAsyncClientHandler.doExecute(BaseAsyncClientHandler.java:213) at software.amazon.awssdk.core.internal.handler.BaseAsyncClientHandler.lambda$execute$1(BaseAsyncClientHandler.java:91) at software.amazon.awssdk.core.internal.handler.BaseAsyncClientHandler.measureApiCallSuccess(BaseAsyncClientHandler.java:277) at software.amazon.awssdk.core.internal.handler.BaseAsyncClientHandler.execute(BaseAsyncClientHandler.java:74) at software.amazon.awssdk.awscore.client.handler.AwsAsyncClientHandler.execute(AwsAsyncClientHandler.java:52) at software.amazon.awssdk.services.secretsmanager.DefaultSecretsManagerAsyncClient.getSecretValue(DefaultSecretsManagerAsyncClient.java:1142) ... 8 more Caused by: software.amazon.awssdk.core.exception.SdkInterruptedException at software.amazon.awssdk.core.internal.http.InterruptMonitor.checkInterrupted(InterruptMonitor.java:40) at software.amazon.awssdk.core.internal.http.pipeline.stages.ApplyTransactionIdStage.execute(ApplyTransactionIdStage.java:43) at software.amazon.awssdk.core.internal.http.pipeline.stages.ApplyTransactionIdStage.execute(ApplyTransactionIdStage.java:29) at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) at software.amazon.awssdk.core.internal.http.pipeline.RequestPipelineBuilder$ComposingRequestPipelineStage.execute(RequestPipelineBuilder.java:206) at software.amazon.awssdk.core.internal.http.AmazonAsyncHttpClient$RequestExecutionBuilderImpl.execute(AmazonAsyncHttpClient.java:185) ... 16 more
相关代码
客户端初始化
private final SecretsManagerAsyncClient client = VertxSdkClient.withVertx(SecretsManagerAsyncClient.builder(), ctx).build();
获取密钥方法
public <T> Promise<T> getSecret(String secretName) { Promise<T> completableFuture = Promise.promise(); Context ctx = Vertx.vertx().getOrCreateContext(); ctx.owner().executeBlocking(blockingFuture -> { try { GetSecretValueRequest valueRequest = GetSecretValueRequest.builder().secretId(secretName).build(); CompletableFuture<GetSecretValueResponse> valueResponse = this.client.getSecretValue(valueRequest); GetSecretValueResponse getResponse = valueResponse.get(); String response = getResponse.secretString(); completableFuture.complete((T) Json.decodeValue(response, new <T>Object().getClass())); blockingFuture.complete(); } catch (Exception e) { // log exception. } }); ... }
排查方向与解决建议
- 检查密钥请求参数:确认第2个密钥的名称是否包含特殊字符(如空格、非ASCII字符),或者存在大小写拼写错误(AWS部分服务对名称大小写敏感)。
- 排查线程中断根源:异常核心是
SdkInterruptedException,说明请求线程被中断。检查调用getSecret的上游逻辑,是否存在超时中断、线程池关闭或手动调用interrupt()的操作。 - 优化Vert.x上下文使用:当前方法内每次新建
Context可能导致上下文混乱,建议复用初始化客户端时的ctx;同时检查Vert.xexecuteBlocking线程池的配置,是否存在线程不足或超时设置过短的情况。 - 重构异步调用逻辑:Reactiverse AWS SDK适配了Vert.x异步模型,无需在
executeBlocking内调用CompletableFuture.get()阻塞线程,改用异步回调结合VertxPromise避免阻塞异常,示例优化:public <T> Promise<T> getSecret(String secretName) { Promise<T> promise = Promise.promise(); GetSecretValueRequest valueRequest = GetSecretValueRequest.builder().secretId(secretName).build(); this.client.getSecretValue(valueRequest) .whenComplete((response, error) -> { if (error != null) { promise.fail(error); return; } try { String secretStr = response.secretString(); T result = (T) Json.decodeValue(secretStr, new <T>Object().getClass()); promise.complete(result); } catch (Exception e) { promise.fail(e); } }); return promise; } - 校验AWS端权限与密钥状态:再次确认IAM角色对该密钥的
secretsmanager:GetSecretValue权限是否配置完整;同时检查密钥是否处于轮换中或其他暂不可用状态。 - 排查SDK版本兼容性:检查Reactiverse AWS SDK与AWS SDK 2的版本是否兼容,是否存在依赖冲突导致的线程处理异常,尝试升级到最新兼容版本测试。
内容的提问来源于stack exchange,提问作者BigBug
相关产品推荐
相关产品推荐

