如何使用无服务器和 DynamoDBContext 在 dynamodb 中动态设置表名?

Tun*_*yen 6 c# amazon-web-services amazon-dynamodb

我们需要能够根据构建环境设置表名。考虑以下类:

[DynamoDBTable("movies")]
public class Movie
{
    [DynamoDBHashKey]
    public string Title { get; set; }

    [DynamoDBRangeKey(AttributeName = "Released")]
    public DateTime ReleaseDate { get; set; }

    public List<string> Genres { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

serverless.yml,表名可以这样设置:

functions:
    update-movies:
        environment:
            tableName: movies-prod
Run Code Online (Sandbox Code Playgroud)

然后在代码中我们可以根据tableName变量中的表名动态加载表名。我们更喜欢使用DynamoDBContext而不是DynamoDBv2.DocumentModel(这里已经有了解决方案How do I dynamic change dynamodb tablename in c# using object persistence model

在 Java 中是这样的:https : //medium.com/@onclouds/aws-lambda-use-different-dynamodb-tables-for-different-stages-5eda9f5378b2

Tun*_*yen 13

通过传递表名前缀找到了解决方案:

DynamoDBContextConfig config = new DynamoDBContextConfig()
{
    TableNamePrefix = "prod-"
};

_dynamoDBContext = new DynamoDBContext(new AmazonDynamoDBClient(), config);
Run Code Online (Sandbox Code Playgroud)

不过,您仍然必须为您的表命名movies

[DynamoDBTable("movies")]
public class Movie
Run Code Online (Sandbox Code Playgroud)

DynamoDBContext加载上下文时将前缀添加到表名。所以它会尝试加载prod-movies, stag-movies.

这是 AWS SDK 内部使用表前缀的地方

if (!string.IsNullOrEmpty(flatConfig.TableNamePrefix))
    tableName = flatConfig.TableNamePrefix + tableName;
Run Code Online (Sandbox Code Playgroud)

( https://github.com/aws/aws-sdk-net/blob/b691e46e57a3e24477e6a5fa2e849da44db7002f/sdk/src/Services/DynamoDBv2/Custom/DataModel/ContextInternal.cs )

一些帮助我找到解决方案的参考资料:

https://aws.amazon.com/blogs/developer/enhancements-to-the-dynamodb-sdk/

https://github.com/aws/aws-sdk-net/blob/b691e46e57a3e24477e6a5fa2e849da44db7002f/sdk/test/Services/DynamoDBv2/UnitTests/Custom/DynamoDBTests.cs