我正在尝试使用AWS SDK for Java将一个项目放入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();
}
...
当我在本地运行时,我可以成功地放置项目,但是当我在Fargate上作为任务运行我的应用程序时,它会抛出这个错误:
software.amazon.awssdk.core.exception。SdkClientException: Profile file不包含Profile 'default'的凭据:ProfileFile(profilesAndSectionsMap=[]).
错误说明SDK正在默认凭证配置文件&
这是因为示例代码显式地指定了ProfileCredentialsProvider
作为DynamoDbClient
的凭据提供者。
这将覆盖默认的凭据提供程序链,默认情况下,该链将在各种位置查找凭据——包括ECS容器凭据。
您需要删除ProfileCredentialsProvider
的使用。
你有两个选择:
-
在创建客户端时不指定凭据提供者- SDK将回退到默认的凭据提供者,然后找到ECS容器凭据;这是最常见的选项,并且最有可能在各种环境中工作(因为链将在多个位置依次查找)
-
用
ContainerCredentialsProvider
代替ProfileCredentialsProvider
的使用,这只会专门寻找ECS容器凭据
建议使用选项1,因为它是最常见的配置&您的代码最有可能跨各种环境工作(因为链将依次查找多个凭据提供程序)。
要实现选项1,请更改:
ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create();
Region region = Region.US_EAST_1;
DynamoDbClient ddb = DynamoDbClient.builder()
.credentialsProvider(credentialsProvider)
.region(region)
.build();
:
Region region = Region.US_EAST_1;
DynamoDbClient ddb = DynamoDbClient.builder()
.region(region)
.build();
选项2如下:
private AwsCredentialsProvider awsCredentialsProvider = ContainerCredentialsProvider.builder().build();
private final DynamoDbClient ddb = DynamoDbClient.builder()
.credentialsProvider(awsCredentialsProvider)
.region(Region.of(REGION))
.build();