云形成配置取决于要创建的区域

时间:2019-05-22 06:39:12

标签: amazon-cloudformation

哪种方法最适合让云形成模板(CFT)根据要创建的区域在映射中使用不同的值进行配置?

例如,假设我在两个不同的区域(欧洲和美洲)部署了一项服务。服务的每个实例都写入其自己的DynamoDB(DDB)表,将其称为Data。为了创建DDB,我使用CFT。由于两个地区的流量都不相同,因此我想为表格设置不同的容量单位。

对于上述情况,我可以在CFT中添加一个参数,以说明该模板是用于欧洲还是美洲,使用所需的值(由参数值作为键)创建映射,并根据该值获得一个或另一个。 / p>

赞:

AWSTemplateFormatVersion: 2010-09-09
Resources:
  DdbData:
    Type: 'AWS::DynamoDB::Table'
    Properties:
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      TableName: 'Data'
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: !FindInMap
          - DdbDataCapacityUnits
          - 'Read'
          - !Ref Continent
        WriteCapacityUnits: !FindInMap
          - DdbDataCapacityUnits
          - 'Write'
          - !Ref Continent
Mappings:
  DdbDataCapacityUnits:
    Read:
        Europe: '10'
        America: '5'
    Write:
        Europe: '5'
        America: '10'
Parameters:
  Continent:
    Description: The continent in which the stack is being created, either Europe or America
    Type: String
    AllowedValues:
      - Europe
      - America
    Default: Europe

但是,由于我使用相同的CFT管理多个区域,因此我想使用StacksSets将两个区域都更新为一个。堆栈集的堆栈都具有相同的参数,只是创建在多个区域中完成。

我的方法是使用伪参数AWS::Region作为配置映射中的键,例如:

AWSTemplateFormatVersion: 2010-09-09
Resources:
  DdbData:
    Type: 'AWS::DynamoDB::Table'
    Properties:
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      TableName: 'Data'
      BillingMode: PROVISIONED
      ProvisionedThroughput:
        ReadCapacityUnits: !FindInMap
          - DdbDataCapacityUnits
          - 'Read'
          - !Ref AWS::Region
        WriteCapacityUnits: !FindInMap
          - DdbDataCapacityUnits
          - 'Write'
          - !Ref AWS::Region
Mappings:
  DdbDataCapacityUnits:
    Read:
      'eu-west-1': '10'
      'us-east-1': '5'
    Write:
      'eu-west-1': '5'
      'us-east-1': '10'

但是这种方法不起作用,因为在创建堆栈时出现错误:Template validation error: Template format error: Mappings attribute name 'eu-west-1' must contain only alphanumeric characters.

有什么方法可以实现这一目标?

1 个答案:

答案 0 :(得分:2)

您可以交换区域和“读/写”属性。

例如,这是用于查找AMI的映射:

Mappings:
  AmazonLinuxEcsAMI:
    us-east-1:
      AMI: ami-07eb698ce660402d2
    us-east-2:
      AMI: ami-0a0c6574ce16ce87a
    us-west-1:
      AMI: ami-04c22ba97a0c063c4
    us-west-2:
      AMI: ami-09568291a9d6c804c

然后可以将其用于:

ImageId: !FindInMap [AmazonLinuxEcsAMI, !Ref 'AWS::Region', AMI]

因此,尝试将区域而不是Read放置在第一层,然后将读取和写入放置在下一层。