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

CloudFormation - Is it possible to define a mapping for a generic and reused resource definition?

我想做一个云形成模板来创建大量的dynamoDB tables。我了解如何将 AttributeDefintions 映射到变量,但是否可以创建单个资源定义,然后将其与映射变量一起重新使用?还是我必须静态声明每个资源 (table)?

这是我 4 tables 的例子,希望通过重新使用资源定义而不是静态列出块 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

CloudFormation 本身没有循环功能。

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

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

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

请注意,对许多表使用嵌套堆栈确实意味着如果您需要对堆栈进行某些类型的更新,则您必须同时 delete/replace 所有 DynamoDB 表。

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