AWS Rds 数据 API 失败 software.amazon.awssdk.core.exception.SdkClientException:无法间歇性地加载凭证

问题描述

我目前在 AWS 中有一个 spring boot 批处理作业(不要问我为什么 springboot 这不是我的决定!),即处理文件并通过 aws rds data api 对 rds postgres 执行插入和选择操作(也不是我决定使用)。我正在使用 aws sdk for java version 2.16.74 进行 rds 数据 api 连接。该文件将包含大量记录,假设文件包含 700 条记录,则在处理文件时对数据 api 的调用会间歇性失败。文件中的每条记录都会创建 3 个数据 api 调用,有时这些调用中的一些会随机失败并显示以下错误

software.amazon.awssdk.core.exception.SdkClientException:无法从 AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(),EnvironmentvariableCredentialsProvider(),WebIdentityTokenCredentialsProvider(),ProfileCredentialsProvider(),ProfileCredentialsProvider() ),InstanceProfileCredentialsProvider()]) : [SystemPropertyCredentialsProvider(): 无法从系统设置加载凭据。必须通过环境变量 (AWS_ACCESS_KEY_ID) 或系统属性 (aws.accessKeyId) 指定访问密钥。EnvironmentvariableCredentialsProvider():无法从系统设置加载凭证。必须通过环境变量 (AWS_ACCESS_KEY_ID) 或系统属性 (aws.accessKeyId) 指定访问密钥。、WebIdentityTokenCredentialsProvider():必须设置环境变量 AWS_WEB_IDENTITY_TOKEN_FILE 或 javaproperty aws.webIdentityTokenFile。ProfileCredentialsProvider():配置文件不包含配置文件认”的凭据:ProfileFile(profiles=[]),ContainerCredentialsProvider():无法从服务端点加载凭据。InstanceProfileCredentialsProvider():无法从服务端点加载凭据。]

代码

public RdsDataClient buildClient() throws AwsRdsDataException {
    try {
        RdsDataClient rdsData = (RdsDataClient)((RdsDataClientBuilder)RdsDataClient.builder().credentialsProvider((AwsCredentialsProvider)null)).build();
        return rdsData;
    } catch (SdkClientException var3) {
        AwsRdsDataExceptionMessagesEnum exceptionMessage = AwsRdsDataExceptionMessagesEnum.RDS_DATA_API_CONNECTION_ISSUE;
        throw new AwsRdsDataException(exceptionMessage.getErrorMessage(),var3.getCause(),exceptionMessage.getDescription(),500);
    }
}


public ExecuteStatementResponse executeStatement(String query) throws AwsRdsDataException {
    LOG.info("Execute statement called with query: {},param list: {}",query,this.dataQueryParamList);
    RdsDataClient rdsData = this.buildClient();

    try {
        LOG.info("Rds Data Api Connector details resolved,Arn: {},Secret: {},Database:{}",new Object[]{this.resourceArn,this.secretArn,this.database});
        ExecuteStatementRequest executeStatementRequest = (ExecuteStatementRequest)ExecuteStatementRequest.builder().resourceArn(this.resourceArn).secretArn(this.secretArn).database(this.database).sql(query).parameters(this.createsqlParameterList()).continueAfterTimeout(true).build();
        return rdsData.executeStatement(executeStatementRequest);
    } catch (StatementTimeoutException | InternalServerErrorException | ForbiddenException | ServiceUnavailableErrorException | BadRequestException var5) {
        LOG.error("Execute statement Failed: Error Message: {},Cause: {}",var5.getMessage(),var5.getCause());
        AwsRdsDataExceptionMessagesEnum exceptionMessage = AwsRdsDataExceptionMessagesEnum.INTERNAL_SERVICE_EXCEPTION;
        throw new AwsRdsDataException(exceptionMessage.getErrorMessage(),var5.getCause(),exceptionMessage.getStatusCode());
    }
}

任何人都知道此问题的根本原因,execute 语句因此错误而失败并抛出 SdkClientException

Java 版本:java 11 aws coretto 版。

Springboot : 版本 2.2.0.RELEASE

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...