You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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.x executeBlocking线程池的配置,是否存在线程不足或超时设置过短的情况。
  • 重构异步调用逻辑:Reactiverse AWS SDK适配了Vert.x异步模型,无需在executeBlocking内调用CompletableFuture.get()阻塞线程,改用异步回调结合Vertx Promise避免阻塞异常,示例优化:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:36:13