使用 AWS Java SDK 执行 PutItem 时出现“配置文件不包含配置文件凭证”错误

raz*_*van 0 java amazon-web-services amazon-dynamodb aws-fargate

我正在尝试使用适用于 Java 的 AWS 开发工具包将项目放入 DynamoDB 表中。

我正在使用EnhancedPutItem.java 文档中的示例

 public static void main(String[] args) {

        ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create();
        Region region = Region.US_EAST_1;
        DynamoDbClient ddb = DynamoDbClient.builder()
            .credentialsProvider(credentialsProvider)
            .region(region)
            .build();

        DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
            .dynamoDbClient(ddb)
            .build();

        putRecord(enhancedClient) ;
        ddb.close();
    }
...
Run Code Online (Sandbox Code Playgroud)

在本地运行时,我可以成功放置该项目,但是当我在 Fargate 上将应用程序作为任务运行时,它会抛出以下错误:

software.amazon.awssdk.core.exception.SdkClientException:配置文件不包含配置文件“默认”的凭据:ProfileFile(profilesAndSectionsMap=[])。

Erm*_*ary 7

该错误表明 SDK 正在默认凭据配置文件中查找凭据,但找不到任何凭据。

这是因为示例代码明确指定 aProfileCredentialsProvider作为DynamoDbClient.

这会覆盖默认的凭证提供程序链,默认情况下,它会在各个位置查找凭证 - 包括 ECS 容器凭证。

您需要删除对ProfileCredentialsProvider.


您有 2 个选择:

  1. 创建客户端时不指定凭证提供程序 - SDK 将回退到默认凭证提供程序,然后查找 ECS 容器凭证;这是最常见的选项,并且很可能适用于各种环境(因为链会在多个位置按顺序查看)

  2. 将使用替换为ProfileCredentialsProviderwith ContainerCredentialsProvider,这只会专门查找 ECS 容器凭证

建议使用选项 1,因为它是最常见的配置,并且您的代码在各种环境中工作的机会最高(因为该链将按顺序查找多个凭证提供程序)。


要实施选项 1,请更改:

ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create();
Region region = Region.US_EAST_1;
DynamoDbClient ddb = DynamoDbClient.builder()
    .credentialsProvider(credentialsProvider)
    .region(region)
    .build();
Run Code Online (Sandbox Code Playgroud)

到:

Region region = Region.US_EAST_1;
DynamoDbClient ddb = DynamoDbClient.builder()
    .region(region)
    .build();
Run Code Online (Sandbox Code Playgroud)