はじめに
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- |