Java SDK(v1.8)を使用してDynamoDBを起動して実行しています。AWSコンソールを使用して非常に単純なテーブルを作成しました。テーブルにはプライマリハッシュキーがあります。これは文字列(範囲なし)です。1つのアイテムを他の4つの属性値(すべての文字列)とともにテーブルに配置しました。
テーブル内のそのアイテムに対して単純なJavaリクエストを作成していますが、ResourceNotFoundException
で失敗しています。指定しているテーブル名が正しいことは間違いありません。 、アイテムのクエリに使用しているプライマリハッシュキーの名前も同様です。テーブルのステータスはAWSコンソールにActive
として表示され、アイテムとその値も確認できます。
これは私が得ているエラーです:
Requested resource not found (Service: AmazonDynamoDB; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: ...)
私は以下を試しました(クラスのdynamodbv2
バージョンを使用):
Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
key.put(PRIMARY_KEY, new AttributeValue().withS(value));
GetItemRequest request = new GetItemRequest()
.withTableName(TABLE_NAME)
.withKey(key);
GetItemResult result = client.getItem(request);
また、次のように、これらすべてのクラスの古い非推奨バージョンを使用してみました。
GetItemRequest request = new GetItemRequest()
.withTableName(TABLE_NAME)
.withKey(new Key().withHashKeyElement(new AttributeValue().withS(value)));
GetItemResult result = client.getItem(request);
...しかし、それは同じ結果です。ResourceNotFoundException
についての私の理解は、参照されているテーブル名または属性が無効であることを意味しますが、そうではありません。テーブルがCreating
状態で早すぎる場合にもスローされる可能性がありますが、私のテーブルはActive
です。
リクエストを行う前にクライアントのリージョンを設定していなかったため、リクエストは失敗していました。デフォルトの地域はおそらく米国東部であり、私のテーブルはEU西部に設定されています。これはそれを修正しました:
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
client.setRegion(Region.getRegion(Regions.EU_WEST_1));
完全なコードは次のようになります。
import Java.util.ArrayList;
import Java.util.HashMap;
import Java.util.Map;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
import com.amazonaws.services.dynamodbv2.model.Condition;
import com.amazonaws.services.dynamodbv2.model.QueryRequest;
import com.amazonaws.services.dynamodbv2.model.QueryResult;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
public final class LogFetcher {
static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
static String tableName = "<TABLE_NAME>";
public static ArrayList<Object> findLogsForDeviceWithMacID(String macID) {
client.setRegion(Region.getRegion(Regions.EU_WEST_1));
Condition hashKeyCondition = new Condition()
.withComparisonOperator(ComparisonOperator.EQ)
.withAttributeValueList(new AttributeValue().withS(macID));
Map<String, Condition> keyConditions = new HashMap<String, Condition>();
keyConditions.put("parentKey", hashKeyCondition);
QueryRequest queryRequest = new QueryRequest()
.withTableName(tableName)
.withKeyConditions(keyConditions);
QueryResult result = client.query(queryRequest);
ArrayList<Object> data = new ArrayList<Object>();
for (Map<String, AttributeValue> item : result.getItems()) {
// printItem(item);
data.add(item);
}
return data;
}
private static void printItem(Map<String, AttributeValue> attributeList) {
for (Map.Entry<String, AttributeValue> item : attributeList.entrySet()) {
String attributeName = item.getKey();
AttributeValue value = item.getValue();
System.out.println(attributeName + " "
+ (value.getS() == null ? "" : "S=[" + value.getS() + "]")
+ (value.getN() == null ? "" : "N=[" + value.getN() + "]")
+ (value.getB() == null ? "" : "B=[" + value.getB() + "]")
+ (value.getSS() == null ? "" : "SS=[" + value.getSS() + "]")
+ (value.getNS() == null ? "" : "NS=[" + value.getNS() + "]")
+ (value.getBS() == null ? "" : "BS=[" + value.getBS() + "] \n"));
}
}
}
Spring Bootを使用する場合は、次のように実行できます。
@Configuration
@EnableDynamoDBRepositories(basePackages = "com.test.repository")
@EntityScan("com.test.entity")
public class DynamoDBConfig {
@Value("${Amazon.dynamodb.endpoint}")
private String amazonDynamoDBEndpoint;
@Value("${Amazon.aws.accesskey}")
private String amazonAWSAccessKey;
@Value("${Amazon.aws.secretkey}")
private String amazonAWSSecretKey;
@Bean
public AmazonDynamoDB amazonDynamoDB() {
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(
amazonDynamoDBEndpoint, Regions.AP_SOUTHEAST_2.getName());
AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(amazonAWSCredentials());
AmazonDynamoDB amazonDynamoDB = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
endpointConfiguration).withCredentials(credentialsProvider).build();
return amazonDynamoDB;
}
@Bean
public AWSCredentials amazonAWSCredentials() {
return new BasicAWSCredentials(amazonAWSAccessKey, amazonAWSSecretKey);
}}