我正在撰寫一個功能測驗用例并連接到其中的本地 DyanmoDB 實體。
這是我創建 DynamoDB 客戶端的方式:
private static final String table_name = "table-A";
private static String aws_region = "us-west-2";
private static AmazonDynamoDB amazonDynamoDBClient;
private static DynamoDB dynamoDB;
public static void initDB() {
amazonDynamoDBClient = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", aws_region)).build();
dynamoDB = new DynamoDB(amazonDynamoDBClient);
}
這就是我嘗試創建表的方式:
Table table = dynamoDB.createTable(table_name,
Arrays.asList(new KeySchemaElement("row_name", KeyType.HASH),
new KeySchemaElement("row_id", KeyType.RANGE)),
Arrays.asList(new AttributeDefinition("row_name", ScalarAttributeType.S),
new AttributeDefinition("row_id", ScalarAttributeType.S)),
new ProvisionedThroughput(10L, 10L));
但是,我收到以下例外:
com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain
at com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:131)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1115)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.runBeforeRequestHandlers(AmazonHttpClient.java:764)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:728)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:721)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:704)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:672)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:654)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:518)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:1831)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:1807)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.createTable(AmazonDynamoDBClient.java:636)
at com.amazonaws.services.dynamodbv2.document.DynamoDB.createTable(DynamoDB.java:96)
at com.amazonaws.services.dynamodbv2.document.DynamoDB.createTable(DynamoDB.java:108)
at util.DBUtil.createAndInsertTestCases(DBUtil.java:24)
at test.DocumentTest.createAndInsertDataInDB(DocumentTest.java:37)
問題是什么?
uj5u.com熱心網友回復:
看起來您從未在您的機器上為 AWS 設定任何憑證以供開發工具包使用。
如果您使用的是 DynamoDB 的本地或遠程云版本,DynamoDB SDK 不會被注意到。這意味著它仍然會在發送請求之前檢查憑據是否存在。
由于大多數人將使用 DDB 的遠程云版本,這需要憑據,這允許客戶端在知道請求將失敗時不呼叫遠程服務器 - 更快的錯誤處理,無網路成本等。
您可以看到,正如堆疊跟蹤所示,它AmazonHttpClient.java正在嘗試使用getCredentialsFromContext.
必須為所有請求設定訪問密鑰 ID 和秘密訪問密鑰,但對于本地 DDB,這些可以設定為任何虛擬和假值。
這應該有效,例如:
EndpointConfiguration endpointConfig = new EndpointConfiguration("http://localhost:8000", aws_region);
AWSStaticCredentialsProvider awsCredProvider = new AWSStaticCredentialsProvider(new BasicAWSCredentials("fakeMyKeyId", "fakeSecretAccessKey"));
AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder
.standard()
.withCredentials(awsCredProvider)
.withEndpointConfiguration(endpointConfig)
.build();
正如@jarmod 在評論中還指出的那樣,如果由于某種原因您無法提供憑據,您也可以使用AnonymousAWSCredentials(假設本地 DDB 實際上不需要簽名的 API 請求)。
指定憑據提供程式AnonymousCredentialsProvider可能有效:
EndpointConfiguration endpointConfig = new EndpointConfiguration("http://localhost:8000", aws_region);
AnonymousCredentialsProvider awsCredProvider = new AnonymousCredentialsProvider();
AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder
.standard()
.withCredentials(awsCredProvider)
.withEndpointConfiguration(endpointConfig)
.build();
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/346704.html
