带有前缀的DynamoDB和TableNameOverride

Guu*_*uus 8 java amazon-dynamodb

我正在测试DynamoDB表,并希望使用前缀"dev_"进行开发,为prod和dev环境设置不同的表名.

我做了这个测试来打印表名:

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

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

这打印:name=null prefix=dev_
这里的名字为何如此?

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

这打印: name=test prefix=null

*如何将表名称设为"dev_test"?*

我想稍后使用它来为开发模式中的所有表获取"dev_"前缀,如下所示:

DynamoDBTable annotation = (DynamoDBTable) myclass.getClass().getAnnotation(DynamoDBTable.class);  
TableNameOverride tbl = new TableNameOverride(annotation.tableName()).withTableNamePrefix("dev_");
Run Code Online (Sandbox Code Playgroud)

或者是否有另一种解决方案来区分开发和生产表?
我首先想到将它们放在不同的区域但不确定.

也可以用这个:

mapper.save(ck, new DynamoDBMapperConfig(new TableNameOverride((isDev ? "dev_" : "") + annotation.tableName())));
Run Code Online (Sandbox Code Playgroud)

Cor*_*all 7

withTableNamePrefix是一种静态方法.所以这一行是TableNameOverride使用String"test" 创建一个新实例,然后通过使用它来调用静态withTableNamePrefix方法抛出该实例:

TableNameOverride tbl = new TableNameOverride("test").withTableNamePrefix("dev_");
Run Code Online (Sandbox Code Playgroud)

为了回答将测试与产品分离的更深层次的问题,我建议完全使用2个独立的AWS账户,一个用于开发,一个用于产品.这是唯一的方法:

  • 请单独查看结算
  • 确保您永远不会在prod和测试系统之间泄漏数据
  • 在开发表上进行高扩展会阻止您更高地扩展prod表

  • 回复:“我建议完全使用 2 个独立的 AWS 账户,一个用于开发,一个用于生产”:我非常同意,*但*使用“dev_”和“prod_”前缀仍然可能是个好主意,这样对于任何手动操作(例如通过 AWS 控制台),您正在操作的操作一目了然。(人们很容易忘记他们正在使用哪个 AWS 账户......) (2认同)

Pau*_*ida 7

我遇到了同样的情况,并且花了几天时间才与自己斗争.

万一你在使用DynamoDB + Spring,这对我有用:

POJO课程:

@DynamoDBTable(tableName = "APP-ACCESSKEY")
public class AccessKey {
    @NotBlank
    @Size(min = 1, max = 36)
    private String accessToken;

    @NotNull
    @Size(min = 3, max = 15)
    private String userName;

    private Date dateInsertion;


    public AccessKey() {

    // ... All POJO stuff
}
Run Code Online (Sandbox Code Playgroud)

弹簧配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <!-- Amazon Credentials -->
    <bean id="tableNameOverride" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="staticMethod" value="com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig.TableNameOverride.withTableNamePrefix"/>
        <property name="arguments" value="DES-" />
    </bean>

    <bean id="dynamoDBMapperConfig" class="com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig">
        <constructor-arg index="0" ref="tableNameOverride" />
    </bean>

    <bean id="BasicAWSCredentials" class="com.amazonaws.auth.BasicAWSCredentials">
         <constructor-arg index="0" value="${amazon.accessKey}" />
         <constructor-arg index="1" value="${amazon.secretKey}" />
    </bean>

    <bean id="amazonDynamoDBClient" class="com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient">
        <constructor-arg index="0" ref="BasicAWSCredentials" />
        <property name="endpoint" value="http://dynamodb.us-west-2.amazonaws.com" />
    </bean>

    <bean id="dynamoDBMapper" class="com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper">
        <constructor-arg index="0" ref="amazonDynamoDBClient" />
        <constructor-arg index="1" ref="dynamoDBMapperConfig" />
    </bean>

</beans>
Run Code Online (Sandbox Code Playgroud)

说明:

考虑到我的AccessKey对象指向AWS DynamodDB上的APP-ACCESSKEY表,结果发现在运行此之后,您的应用程序将开始指向DES-APP-ACCESSKEY.

希望它可以帮助那些面临类似情况的人

干杯