映射AWS CloudFormation的默认值

Mar*_*rte 5 amazon-web-services aws-cloudformation

在映射上设置默认值的好策略是什么?

IE

我有一个名为的参数 country

基于此,country我使用映射引用DNS

"Mappings" : {
   "DNS":{
     "us" : {"dns" : "mypage.us.com", "ttl" : "600"},
     "mx" : {"dns" : "mypage.default.com", "ttl" : "300"},
     "ar" : {"dns" : "mypage.default.com", "ttl" : "300"},
     "br" : {"dns" : "mypage.default.com", "ttl" : "300"}
   }
}
Run Code Online (Sandbox Code Playgroud)

如果us已映射:

{ "Fn::FindInMap" : [ "DNS", { "Ref" : "country" }, "dns" ]}
Run Code Online (Sandbox Code Playgroud)

我得到"mypage.us.com"其他国家我已经创建了一个具有默认值的巨大国家列表,mypage.default.com未来,这些价值将会发生变化,我们将增加更多的国家,有更好的方法吗?

Ste*_*ith 7

我能够做到这一点的唯一方法是链接Fn::If语句而不是使用地图。我尝试使用Fn::Ifand的组合,Fn::FindInMapFn::FindInMap如果找不到映射,它总是会引发错误。

因此,对我来说唯一的解决方案是求助于使用以下内容(对我来说,它是根据实例类型设置 ecs 内存):

Conditions:
  IsT2Micro: !Equals [!Ref InstanceType, "t2.micro"]
  IsT2Small: !Equals [!Ref InstanceType, "t2.small"]
  ...

taskdefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ...
      Memory: !If [ IsT2Micro, 900, !If [ IsT2Small, 1900, !Ref "AWS::NoValue"]]
Run Code Online (Sandbox Code Playgroud)


Max*_*Max -5

Cloud Formation 有助于在 AWS 资源的生命周期之初创建一次。您也可以用它进行更新,但我认为就您的情况而言,听起来您最好将 DNS 配置逻辑构建到您的应用程序中。也许可以使用映射数据在 DynamoDB 中创建一个数据库表。您可以将国家/地区值作为环境变量传递到服务器中,并让它们在启动时根据其环境变量查询 DynamoDB 表。

或者,您可以让 Cloud Formation 在启动新堆栈来查询 DynamoDB 时调用 Lambda 函数,以根据国家/地区获取 DNS 配置的值,这样您就不必在每次有新条目时不断修改堆栈 JSON并且不必更改您的应用程序。