DynamoDB and TableNameOverride with prefix

Viewed 12594

I am testing DynamoDB tables and want to set up different table names for prod and dev environment using the prefix "dev_" for development.

I made this test to print the table name:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig.TableNameOverride;  

TableNameOverride tbl = new TableNameOverride("test").withTableNamePrefix("dev_");
System.out.println("name=" + tbl.getTableName() + "  prefix=" + tbl.getTableNamePrefix());

This prints: name=null prefix=dev_
How come the name here is null ?

TableNameOverride tbl = new TableNameOverride("test");//.withTableNamePrefix("dev_");
System.out.println("name=" + tbl.getTableName() + "  prefix=" + tbl.getTableNamePrefix());

This prints: name=test prefix=null

*How can I get the table name to be "dev_test" ?*

I want to use this later to get a "dev_" prefix for all tables in development mode like this:

DynamoDBTable annotation = (DynamoDBTable) myclass.getClass().getAnnotation(DynamoDBTable.class);  
TableNameOverride tbl = new TableNameOverride(annotation.tableName()).withTableNamePrefix("dev_");

Or is there another solution to separate between dev and prod tables?
I first thought of putting them in separate regions but not sure about this.

Could also use this:

mapper.save(ck, new DynamoDBMapperConfig(new TableNameOverride((isDev ? "dev_" : "") + annotation.tableName())));
3 Answers

Same as Paolo Almeidas solution, but with Spring-Boot annotations. Just wanted to share it and maybe save someone time:

I have dynamodb tables for each namespace, e.g. myApp-dev-UserTable, myApp-prod-UserTable and I am using the EKS_NAMESPACE env variable, which in my case gets injected into the pods by kubernetes.

import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;

@Configuration
@EnableDynamoDBRepositories(basePackages = "de.dynamodb")
public class DynamoDBConfig {

    @Value("${EKS_NAMESPACE}")
    String eksNamespace;

    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        return AmazonDynamoDBClientBuilder.standard()
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(
                    "dynamodb.eu-central-1.amazonaws.com", "eu-central-1"))
            .withCredentials(awsCredentials())
            .build();
    }

    @Bean
    public AWSCredentialsProvider awsCredentials() {
        return WebIdentityTokenCredentialsProvider.builder().build();
    }

    // Table Name override:

    @Bean
    public DynamoDBMapperConfig.TableNameOverride tableNameOverride() {
        return DynamoDBMapperConfig.TableNameOverride.withTableNamePrefix("myApp-" + eksNamespace + "-");
    }

    @Bean
    public DynamoDBMapperConfig dynamoDBMapperConfig() {
        return DynamoDBMapperConfig.builder().withTableNameOverride(tableNameOverride()).build();
    }

    @Bean
    // Marked as primary bean to override default bean.
    @Primary
    public DynamoDBMapper dynamoDBMapper() {
        return new DynamoDBMapper(amazonDynamoDB(), dynamoDBMapperConfig());
    }
}

With a table like this:

@Data
@DynamoDBTable(tableName = "UserTable")
public class User {

        @DynamoDBHashKey
        private String userId;

        @DynamoDBAttribute
        private String foo;

        @DynamoDBAttribute
        private String bar;
}
Related