Задайте имя глобального вторичного индекса динамически в Dynamo DB, используя переменную среды spring boot - PullRequest
4 голосов
/ 23 марта 2020

Я использую библиотеку derjust / spring-data-DynamodB для взаимодействия с DynamoDB. Я определил класс Product следующим образом:

@DynamoDBTable(tableName = "product")
public class Product {

    @Id
    @NotNull
    @DynamoDBHashKey
    private String productId;

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "product-category-gsi")
    private String categoryId;

    private double amount;

    // more fields, getters and setters    
}

Я хочу использовать один и тот же код в нескольких средах - dev, staging, prod. Таким образом, имена таблиц будут dev-product, staging-product and prod-product.

Среда доступна в качестве свойства приложения. Я настроил имя таблицы, используя шаги, упомянутые здесь: https://github.com/derjust/spring-data-dynamodb/wiki/Alter-table-name-during-runtime

@Configuration
@EnableDynamoDBRepositories(basePackages = "com.example.entity",dynamoDBMapperConfigRef = "dynamoDBMapperConfig")
public class DynamoDBConfiguration {

    @Value("${aws.region}")
    private String awsRegion;

    @Value("${env.name}")
    private String envName;

    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        return AmazonDynamoDBClientBuilder.standard()
            .withRegion(awsRegion)
            .build();
    }

    @Bean
    public DynamoDBMapperConfig.TableNameOverride tableNameOverrider() {
        return DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(envName + "-product");
    }

    @Bean
    public DynamoDBMapperConfig dynamoDBMapperConfig() {
        DynamoDBMapperConfig.Builder builder = new DynamoDBMapperConfig.Builder();
        builder.setTableNameOverride(tableNameOverrider());
        return new DynamoDBMapperConfig(DynamoDBMapperConfig.DEFAULT, builder.build());
    }
}

Но как я могу переопределить имя глобального вторичного индекса? В настоящее время я жестко запрограммировал его на "product-category-gsi".

Я хочу иметь возможность устанавливать его динамически, как если бы я устанавливал имя таблицы на dev-product-category-gsi, staging-product-category-gsi and prod-product-category-gsi.

Ответы [ 2 ]

4 голосов
/ 30 марта 2020

Вы можете создать константу для globalSecondaryIndexName с именем среды,

public class DynamoDBConstants {
    public static final String GLOBAL_SECONDARY_INDEXNAME = System.getProperty("env.name")+"product-category-gsi";
}

и использовать ее, как показано ниже,

@DynamoDBIndexHashKey(globalSecondaryIndexName = DynamoDBConstants.GLOBAL_SECONDARY_INDEXNAME)
private String categoryId;
0 голосов
/ 01 апреля 2020

Это не совсем ответ на ваш вопрос, но я все же думаю, что стоит упомянуть, поскольку это решит вашу проблему и обеспечит большую стабильность вашему приложению.

Хорошая практика - отделять AWS учитывает различные этапы: dev, staging, production.

Для этого есть несколько причин:

  1. Мелкозернистый доступ к учетной записи (все разработчики имеют доступ к dev, но не для производства)
  2. Отдельный биллинг (например, вы можете ограничить ресурсы на счетах dev для ограничения ваших счетов)
  3. Повторное использование имен ресурсов (именно ваша проблема)
  4. Дополнительная безопасность на производстве (включить MFA)
  5. У каждой учетной записи есть ограничения. Наличие нескольких учетных записей сохраняет эти пределы разделенными, а также уменьшает радиус взрыва, если эти пределы достигнуты.

Другое решение : Учитывая, что вы не используете ВСЕ AWS регионы, вы можете держать свои сцены в разных регионах. Я не могу рекомендовать это, но это вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...