如何为每个 ElasticBeanstalk 环境唯一的 DynamoDB 表名添加前缀
Posted
技术标签:
【中文标题】如何为每个 ElasticBeanstalk 环境唯一的 DynamoDB 表名添加前缀【英文标题】:How to prefix DynamoDB table names unique to each ElasticBeanstalk environment 【发布时间】:2018-08-22 17:32:21 【问题描述】:使用 DynamoDB 的标准模式是通过在表名前加上任何特定于环境的字符串来分隔每个环境使用的数据。
我认为使用 ElasticBeanstalk 和 .ebextensions
中的 CloudFormation 配置很容易做到这一点。但是 - 至少对于我的平台(在 64 位 Amazon Linux 上运行的 Java 8)来说 - 情况似乎并非如此。
我的幼稚实现是为每个环境添加一个环境属性 (DB_PREFIX
),然后在 .ebextensions
中调整我的表创建配置,如下所示:
Resources:
UserTable:
Type: AWS::DynamoDB::Table
Properties:
TableName:
Fn::Join:
- '_'
- - $env:DB_PREFIX
- 'User'
KeySchema:
HashKeyElement: AttributeName: id, AttributeType: S
ProvisionedThroughput: ReadCapacityUnits: 1, WriteCapacityUnits: 1
这不起作用,可能是因为至少在我的平台上,环境属性不能用作操作系统环境变量(请参阅https://***.com/a/36567121/96553)。
我还考虑过根据环境名称有条件地设置 AWS 环境属性(不是一个很好的解决方案,因为它不能很好地扩展)它可能是可以接受的。
是否有人已经在使用某种模式来解决此类问题?
【问题讨论】:
【参考方案1】:只是不要设置名称。 CloudFormation 将为您选择一个包含堆栈名称的唯一名称。另一种选择是自己使用$AWS::StackName
。
Resources:
UserTable:
Type: AWS::DynamoDB::Table
Properties:
TableName:
Fn::Sub: $AWS::StackName_User
KeySchema:
HashKeyElement: AttributeName: id, AttributeType: S
ProvisionedThroughput: ReadCapacityUnits: 1, WriteCapacityUnits: 1
【讨论】:
这不是一个完美的解决方案 - 我会更喜欢表名前缀,以便更容易理解每个表相关的环境。但是,它使我对正在开发的任务解除了阻碍,因此感谢您提供的解决方案。【参考方案2】:可能不是您想要的,但我不是依靠 cloudformation 来处理环境差异,而是使用非常简单的构建系统来实现。假设您有两个环境,一个dev
和一个prod
。我的构建系统将输出两个完全不同的 dist:
/dev
.ebextensions
/prod
.ebextensions
当然,在 /dev .ebextensions 文件中,所有内容都以 dev-
为前缀。在 /prod .ebextensions 中,所有内容都以 prod-
为前缀。我使用 gulp 和 nunjucks 来做到这一点,但有很多选择。所以我不必担心 cloudformation 如何处理事情,我知道我的输出正是我想要的。我什至可以通过一些简单的测试来验证 /dev 和 /prod 的内容。
在你的情况下,你会在 /dev 输出文件夹中得到这个:
Fn::Join:
- '_'
- - dev
- 'User'
这在 /prod 中:
Fn::Join:
- '_'
- - prod
- 'User'
有关我如何做到这一点的更多详细信息:https://***.com/a/49011398/3650835
【讨论】:
以上是关于如何为每个 ElasticBeanstalk 环境唯一的 DynamoDB 表名添加前缀的主要内容,如果未能解决你的问题,请参考以下文章
Rails:如何为 AWS Elasticbeanstalk 应用程序获取 puma 3.11?
.NET Core 控制台应用程序,如何为每个环境配置 appSettings?