CloudFormation - 是否可以为通用和重用资源定义定义映射?

时间:2017-08-14 02:08:36

标签: amazon-web-services amazon-cloudformation

我想制作一个云形成模板来创建大量的dynamoDB表。我理解如何将AttributeDefintions映射到变量,但是是否可以创建单个资源定义然后使用映射变量重新使用它?或者我必须静态声明每个资源(表)吗?

这是我对4个表的一个例子,希望通过重新使用资源定义而不是静态列出块4次来压缩它

Parameters:
  ReadCapacityUnits:
    Type: String
    Default: "2"
  WriteCapacityUnits:
    Type: String
    Default: "2"
Resources:
  DynamoTableTotalCountsHour:
    Type: "AWS::DynamoDB::Table"
    Properties:
      AttributeDefinitions:
        -
          AttributeName: "UserId"
          AttributeType: "S"
        -
          AttributeName: "RangeId"
          AttributeType: "S"
      KeySchema:
        -
          AttributeName: "UserId"
          KeyType: "HASH"
        -
          AttributeName: "RangeId"
          KeyType: "RANGE"
      ProvisionedThroughput:
        ReadCapacityUnits: !Ref ReadCapacityUnits
        WriteCapacityUnits: !Ref WriteCapacityUnits
      TableName: TotalCountsHour
  DynamoTableTotalCountsDay:
    Type: "AWS::DynamoDB::Table"
    Properties:
      AttributeDefinitions:
        -
          AttributeName: "UserId"
          AttributeType: "S"
        -
          AttributeName: "RangeId"
          AttributeType: "S"
      KeySchema:
        -
          AttributeName: "UserId"
          KeyType: "HASH"
        -
          AttributeName: "RangeId"
          KeyType: "RANGE"
      ProvisionedThroughput:
        ReadCapacityUnits: !Ref ReadCapacityUnits
        WriteCapacityUnits: !Ref WriteCapacityUnits
      TableName: TotalCountsDay
  DynamoTableTotalCountsMonth:
    Type: "AWS::DynamoDB::Table"
    Properties:
      AttributeDefinitions:
        -
          AttributeName: "UserId"
          AttributeType: "S"
        -
          AttributeName: "RangeId"
          AttributeType: "S"
      KeySchema:
        -
          AttributeName: "UserId"
          KeyType: "HASH"
        -
          AttributeName: "RangeId"
          KeyType: "RANGE"
      ProvisionedThroughput:
        ReadCapacityUnits: !Ref ReadCapacityUnits
        WriteCapacityUnits: !Ref WriteCapacityUnits
      TableName: TotalCountsMonth
  DynamoTableTotalCountsYear:
    Type: "AWS::DynamoDB::Table"
    Properties:
      AttributeDefinitions:
        -
          AttributeName: "UserId"
          AttributeType: "S"
        -
          AttributeName: "RangeId"
          AttributeType: "S"
      KeySchema:
        -
          AttributeName: "UserId"
          KeyType: "HASH"
        -
          AttributeName: "RangeId"
          KeyType: "RANGE"
      ProvisionedThroughput:
        ReadCapacityUnits: !Ref ReadCapacityUnits
        WriteCapacityUnits: !Ref WriteCapacityUnits
      TableName: TotalCountsYear

1 个答案:

答案 0 :(得分:2)

CloudFormation本身没有循环功能。

您可以使用Nested Stacks重用DynamoDB定义并最大限度地减少重复代码的数量。

例如,从另一个堆栈调用一个堆栈:

Type: "AWS::CloudFormation::Stack"
    Properties:
       Parameters:
          ReadCapacityUnits: 2
          WriteCapacityUnits: 2
       TemplateURL: Url-of-S3-Bucket-with-DynamoDB-Template-Stack

请注意,如果需要对堆栈进行某些类型的更新,则使用具有多个表的嵌套堆栈意味着您有可能同时删除/替换所有DynamoDB表。

如果您不希望DynamoDB表的构建之间存在依赖关系,则使用带有外部业务流程引擎的模板堆栈来遍历参数并重复调用AWS CloudFormation API。