web-dev-qa-db-ja.com

単純なDynamoDBリクエストがResourceNotFoundExceptionで失敗する

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です。

13
RTF

リクエストを行う前にクライアントのリージョンを設定していなかったため、リクエストは失敗していました。デフォルトの地域はおそらく米国東部であり、私のテーブルはEU西部に設定されています。これはそれを修正しました:

import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;

client.setRegion(Region.getRegion(Regions.EU_WEST_1));
38
RTF

完全なコードは次のようになります。

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"));
        }
    }
}
0
gbk

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);
}}
0
sendon1982