lundi 28 septembre 2015

Dynamodb can't create tables

I am testing out AWS dynamodb on my local, but I can;t create tables with and global indexes.

I recieve the following output and I am unsure why. I think I am adding a hash key to the tables and indexes, so I am unsure why it is complaining?

Issuing CreateTable request for Users
Waiting for Users to be created...this may take a while...
Issuing CreateTable request for Contacts
CreateTable request failed for Contacts
No Hash Key specified in schema.  All Dynamo DB tables must have exactly one hash key (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: b2c826df-a6e6-4bc5-af60-ff6b6c3a0065)
Issuing CreateTable request for Messages
CreateTable request failed for Messages
No Hash Key specified in schema.  All Dynamo DB tables must have exactly one hash key (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 2117d767-f87f-4147-bfee-cafce6cf0ad8)

This is my code (I am creating 3 tables, 2 with global indexes):

public class Main{

AmazonDynamoDBClient client;
static DynamoDB dynamoDB;

static String users = "Users";
static String contacts = "Contacts";
static String messages = "Messages";


        public Main() throws Exception {

            client = new AmazonDynamoDBClient(new ProfileCredentialsProvider());
            client.setEndpoint("http://localhost:8000");
            dynamoDB = new DynamoDB(client);


            try {

                 deleteTable(users);
                 deleteTable(contacts);
                 deleteTable(messages);

                 createTable(users, 10L, 5L, "un", "S"); 
                 createTable(contacts, 10L, 5L, "to", "S");
                 createTable(messages, 10L, 5L, "fr", "S", "cr", "S");


             } catch (Exception e) {
                 System.err.println("Program failed:");
                 System.err.println(e.getMessage());
             }
             System.out.println("Success.");


        private static void deleteTable(String tableName) {
            Table table = dynamoDB.getTable(tableName);
            try {
                System.out.println("Issuing DeleteTable request for " + tableName);
                table.delete();
                System.out.println("Waiting for " + tableName
                    + " to be deleted...this may take a while...");
                table.waitForDelete();

            } catch (Exception e) {
                System.err.println("DeleteTable request failed for " + tableName);
                System.err.println(e.getMessage());
            }
        }


        private static void createTable(
            String tableName, long readCapacityUnits, long writeCapacityUnits, 
            String hashKeyName, String hashKeyType) {

            createTable(tableName, readCapacityUnits, writeCapacityUnits,
                hashKeyName, hashKeyType, null, null);
        }

        private static void createTable(
            String tableName, long readCapacityUnits, long writeCapacityUnits, 
            String hashKeyName, String hashKeyType, 
            String rangeKeyName, String rangeKeyType) {

            try {

                ArrayList<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();
                keySchema.add(new KeySchemaElement()
                    .withAttributeName(hashKeyName)
                    .withKeyType(KeyType.HASH));

                ArrayList<AttributeDefinition> attributeDefinitions = new ArrayList<AttributeDefinition>();
                attributeDefinitions.add(new AttributeDefinition()
                    .withAttributeName(hashKeyName)
                    .withAttributeType(hashKeyType));

                if (rangeKeyName != null) {
                    keySchema.add(new KeySchemaElement()
                        .withAttributeName(rangeKeyName)
                        .withKeyType(KeyType.RANGE));
                    attributeDefinitions.add(new AttributeDefinition()
                        .withAttributeName(rangeKeyName)
                        .withAttributeType(rangeKeyType));
                }

                CreateTableRequest request = new CreateTableRequest()
                        .withTableName(tableName)
                        .withKeySchema(keySchema)
                        .withProvisionedThroughput( new ProvisionedThroughput()
                            .withReadCapacityUnits(readCapacityUnits)
                            .withWriteCapacityUnits(writeCapacityUnits));



                if(contacts.equals(tableName)){

                    // PrecipIndex
                    GlobalSecondaryIndex contactsFromIndex = new GlobalSecondaryIndex()
                        .withIndexName("ContactsFromIndex")
                        .withProvisionedThroughput(new ProvisionedThroughput()
                            .withReadCapacityUnits((long) 10)
                            .withWriteCapacityUnits((long) 5))
                            .withProjection(new Projection().withProjectionType(ProjectionType.KEYS_ONLY));

                    ArrayList<KeySchemaElement> indexKeySchema = new ArrayList<KeySchemaElement>();

                    indexKeySchema.add(new KeySchemaElement()
                        .withAttributeName("fr")
                        .withKeyType("S"));
                    indexKeySchema.add(new KeySchemaElement()
                        .withAttributeName("st")
                        .withKeyType("N"));

                    contactsFromIndex.setKeySchema(indexKeySchema);
                    request.withGlobalSecondaryIndexes(contactsFromIndex);

                }


                if(messages.equals(tableName)){

                    // PrecipIndex
                    GlobalSecondaryIndex messagesFromIndex = new GlobalSecondaryIndex()
                        .withIndexName("messagesFromIndex")
                        .withProvisionedThroughput(new ProvisionedThroughput()
                            .withReadCapacityUnits((long) 10)
                            .withWriteCapacityUnits((long) 5))
                            .withProjection(new Projection().withProjectionType(ProjectionType.INCLUDE)
                                    .withNonKeyAttributes("mg"));

                    ArrayList<KeySchemaElement> indexKeySchema = new ArrayList<KeySchemaElement>();

                    indexKeySchema.add(new KeySchemaElement()
                        .withAttributeName("to")
                        .withKeyType("S"));
                    indexKeySchema.add(new KeySchemaElement()
                        .withAttributeName("cr")
                        .withKeyType("N"));

                    messagesFromIndex.setKeySchema(indexKeySchema);
                    request.withGlobalSecondaryIndexes(messagesFromIndex);

                }


                request.setAttributeDefinitions(attributeDefinitions);

                System.out.println("Issuing CreateTable request for " + tableName);
                Table table = dynamoDB.createTable(request);
                System.out.println("Waiting for " + tableName
                    + " to be created...this may take a while...");
                table.waitForActive();

            } catch (Exception e) {
                System.err.println("CreateTable request failed for " + tableName);
                System.err.println(e.getMessage());
            }
        }

}




Aucun commentaire:

Enregistrer un commentaire