はじめに
Spring BootでdynamoDBを利用した際に、環境毎のテーブル名出し分けに苦労したのでここにメモします。
今回作成したサンプルはdev環境・prd環境に dev-sample-table・prd-sample-tableのテーブル名でdynamoDBを作成してます。
SpringBootではテーブル名としてsample-tableを指定し、prefixとしてdev-・prd-を指定してます。
また、prefixはapplication.ymlを環境毎に作成して値を保持しております。
例えば、起動時にパラメータ指定することで環境をapplication.ymlを選択できます。
| 1 | java -Dspring.profiles.active=dev -jar ~/application.jar | 
サンプルコード
githubのサンプルです。全体像が知りたいからはこちらをご覧ください。
EC2で動作確認しました。
spring-boot-dynamodb-env-prefix
ポイント
pom.xml
io.github.boostchickenさんのspring-data-dynamodbを利用しました。 
バージョンに依るかもしれませんが、他のspring-data-dynamodbは意図した動作をしませんでした。
| 1 2 3 4 5 | 		<dependency> 			<groupId>io.github.boostchicken</groupId> 			<artifactId>spring-data-dynamodb</artifactId> 			<version>5.2.5</version> 		</dependency> | 
configuration
dynamoDBに関する@Configurationをつけたクラスで以下の記述が必要です。 
今回はprefixをつけるため withTableNamePrefix を利用して引数にprefixを指定してますが、withTableNameReplacement を利用すれば置換も可能です。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverterFactory; import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableDynamoDBRepositories(dynamoDBMapperConfigRef = "dynamoDBMapperConfig", basePackages = "com.example.demo.repository") public class DynamoConfig {     /**      * set credential      * @return AmazonDynamoDB      */     @Bean     public AmazonDynamoDB amazonDynamoDB() {         return AmazonDynamoDBClientBuilder.standard().build();     }     /**      * DynamoDBMapperConfig      * @param tableNameOverride      * @return DynamoDBMapperConfig      */     @Bean     public DynamoDBMapperConfig dynamoDBMapperConfig(DynamoDBMapperConfig.TableNameOverride tableNameOverride) {         DynamoDBMapperConfig.Builder builder = new DynamoDBMapperConfig.Builder();         builder.setTableNameOverride(tableNameOverride);         builder.setTypeConverterFactory(DynamoDBTypeConverterFactory.standard());         return builder.build();     }     /**      * TableNameOverride      * @param dynamoTablePrefix dynamoDB table name prefix specified at application-{env}.yml      * @return DynamoDBMapperConfig.TableNameOverride      */     @Bean     public DynamoDBMapperConfig.TableNameOverride getTableNameOverride(             @Value("${dynamo.table-name-prefix}") String dynamoTablePrefix) {         return DynamoDBMapperConfig.TableNameOverride.withTableNamePrefix(dynamoTablePrefix);     } } | 
application.yml
環境毎にapplication.ymlを用意して環境固有の値を保持するようにしてます。
application-dev.yml
| 1 2 | dynamo:   table-name-prefix: dev- | 
application-prd.yml
| 1 2 | dynamo:   table-name-prefix: prd- |