哪种方法最适合让云形成模板(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.
有什么方法可以实现这一目标?
答案 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
放置在第一层,然后将读取和写入放置在下一层。