如何为每个ElasticBeanstalk环境添加唯一的DynamoDB表名称前缀

时间:2018-03-14 09:04:43

标签: amazon-web-services amazon-dynamodb elastic-beanstalk amazon-cloudformation

使用DynamoDB的标准模式是通过在表名前加上任何特定于环境的字符串来分隔每个环境使用的数据。

我认为在.ebextensions中使用ElasticBeanstalk和CloudFormation配置很容易做到这一点。但是 - 对于我的平台(至少在64位亚马逊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}

这不起作用,可能是因为,至少对于我的平台,环境属性不能作为OS环境变量使用(参见https://stackoverflow.com/a/36567121/96553)。

我还考虑过根据环境名称有条件地设置AWS环境属性(不是一个很好的解决方案,因为它不能很好地扩展),这可能是可以接受的。

有没有人有他们已经用于此类问题的模式?

2 个答案:

答案 0 :(得分:2)

只是不要设置名称。 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}

答案 1 :(得分:0)

可能不是你正在寻找的东西,但我不是依靠cloudformation来处理环境差异,而是使用一个非常简单的构建系统。假设您有两个环境,一个dev和一个prod。我的构建系统将输出两个完全不同的dists:

/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://stackoverflow.com/a/49011398/3650835