title: Dynamodb can't create tables
body: <p>I am testing out AWS DynamoDB on my local, but I can't create tables with and global indexes.</p>
  
  <p>I receive 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?</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>This is my code (I am creating 3 tables, 2 with global indexes):</p>
  
  <pre><code>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&lt;KeySchemaElement&gt; keySchema = new ArrayList&lt;KeySchemaElement&gt;();
              keySchema.add(new KeySchemaElement()
                      .withAttributeName(hashKeyName)
                      .withKeyType(KeyType.HASH));
  
              ArrayList&lt;AttributeDefinition&gt; attributeDefinitions = new ArrayList&lt;AttributeDefinition&gt;();
              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&lt;KeySchemaElement&gt; indexKeySchema = new ArrayList&lt;KeySchemaElement&gt;();
  
                  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&lt;KeySchemaElement&gt; indexKeySchema = new ArrayList&lt;KeySchemaElement&gt;();
  
                  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());
          }
      }
  
  }
  </code></pre>
  
  <p><strong>UPDATED :</strong> Error message 'Cannot have two attributes with the same name' with new code:</p>
  
  <pre><code>        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&lt;KeySchemaElement&gt; keySchema = new ArrayList&lt;KeySchemaElement&gt;();
              keySchema.add(new KeySchemaElement()
                      .withAttributeName(hashKeyName)
                      .withKeyType(KeyType.HASH));
  
              ArrayList&lt;AttributeDefinition&gt; attributeDefinitions = new ArrayList&lt;AttributeDefinition&gt;();
              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)){
   attributeDefinitions.add(new AttributeDefinition().withAttributeName("fr").withAttributeType("S"));
                       attributeDefinitions.add(new AttributeDefinition().withAttributeName("st").withAttributeType("S"));
                  // PrecipIndex
                  GlobalSecondaryIndex contactsFromIndex = new GlobalSecondaryIndex()
                          .withIndexName("ContactsFromIndex")
                          .withProvisionedThroughput(new ProvisionedThroughput()
                                  .withReadCapacityUnits((long) 10)
                                  .withWriteCapacityUnits((long) 5))
                          .withProjection(new Projection().withProjectionType(ProjectionType.KEYS_ONLY));
  
                  ArrayList&lt;KeySchemaElement&gt; indexKeySchema = new ArrayList&lt;KeySchemaElement&gt;();
  
                  indexKeySchema.add(new KeySchemaElement()
                          .withAttributeName("fr")
                          .withKeyType(KeyType.HASH));
                  indexKeySchema.add(new KeySchemaElement()
                          .withAttributeName("st")
                          .withKeyType(KeyType.RANGE));
  
                  contactsFromIndex.setKeySchema(indexKeySchema);
                  request.withGlobalSecondaryIndexes(contactsFromIndex);
  
              }
  
  
              if(messages.equals(tableName)){
  attributeDefinitions.add(new AttributeDefinition().withAttributeName("to").withAttributeType("S"));
                      attributeDefinitions.add(new AttributeDefinition().withAttributeName("cr").withAttributeType("N"));
  
                  // 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&lt;KeySchemaElement&gt; indexKeySchema = new ArrayList&lt;KeySchemaElement&gt;();
  
                  indexKeySchema.add(new KeySchemaElement()
                          .withAttributeName("to")
                          .withKeyType(KeyType.HASH));
                  indexKeySchema.add(new KeySchemaElement()
                          .withAttributeName("cr")
                          .withKeyType(KeyType.RANGE));
  
                  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());
          }
      }
  
  }
  </code></pre>