code: func (b *DynamoDBBackend) createTable(ctx context.Context, tableName string, rangeKey string) error {
  	pThroughput := dynamodb.ProvisionedThroughput{
  		ReadCapacityUnits:  aws.Int64(b.ReadCapacityUnits),
  		WriteCapacityUnits: aws.Int64(b.WriteCapacityUnits),
  	}
  	def := []*dynamodb.AttributeDefinition{
  		{
  			AttributeName: aws.String(hashKeyKey),
  			AttributeType: aws.String("S"),
  		},
  		{
  			AttributeName: aws.String(rangeKey),
  			AttributeType: aws.String("S"),
  		},
  	}
  	elems := []*dynamodb.KeySchemaElement{
  		{
  			AttributeName: aws.String(hashKeyKey),
  			KeyType:       aws.String("HASH"),
  		},
  		{
  			AttributeName: aws.String(rangeKey),
  			KeyType:       aws.String("RANGE"),
  		},
  	}
  	c := dynamodb.CreateTableInput{
  		TableName:             aws.String(tableName),
  		AttributeDefinitions:  def,
  		KeySchema:             elems,
  		ProvisionedThroughput: &pThroughput,
  	}
  	_, err := b.svc.CreateTable(&c)
  	if err != nil {
  		return trace.Wrap(err)
  	}
  	b.Infof("Waiting until table %q is created.", tableName)
  	err = b.svc.WaitUntilTableExistsWithContext(ctx, &dynamodb.DescribeTableInput{
  		TableName: aws.String(tableName),
  	})
  	if err == nil {
  		b.Infof("Table %q has been created.", tableName)
  	}
  	return trace.Wrap(err)
  }
docs: // createTable creates a DynamoDB table with a requested name and applies
  // the back-end schema to it. The table must not exist.
  //
  // rangeKey is the name of the 'range key' the schema requires.
  // currently is always set to "FullPath" (used to be something else, that's
  // why it's a parameter for migration purposes)