映射上的默认值AWS CloudFormation

时间:2016-03-09 22:45:46

标签: amazon-web-services amazon-cloudformation

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

我有一个名为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"}
   }
}

如果映射了us

{ "Fn::FindInMap" : [ "DNS", { "Ref" : "country" }, "dns" ]}

我得到"mypage.us.com"其他国家/地区我创建了一个默认值为mypage.default.com的大量国家/地区列表,将来这个值会发生变化,我们会添加更多国家/地区,有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

我能够做到这一点的唯一方法是链接Fn::If语句而不是使用地图。我尝试使用Fn::IfFn::FindInMap的组合,但如果无法找到映射,Fn::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"]]

答案 1 :(得分:-3)

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

或者,您可以让Cloud Formation在启动新堆栈时调用Lambda函数来查询DynamoDB以根据国家/地区获取DNS配置的值,这样您就不必每次都修改堆栈JSON那里的时间是一个新的条目,不必更改您的申请。

答案 2 :(得分:-3)

在您的映射中,添加一个默认条目:

Scanner scan = new Scanner(System.in);
int hour = scan.nextInt();
int minutes = scan.nextInt();
LocalTime time = LocalTime.of(hour , minutes);
time = time.plusMinutes(15);
System.out.println(time);

然后创建一个条件(YAML):

"Mappings" : {
   "DNS":{
     "us" : {"dns" : "mypage.us.com", "ttl" : "600"},
     "mx" : {"dns" : "mypage.mx.com", "ttl" : "300"},
     "default" : {"dns" : "mypage.default.com", "ttl" : "300"}
   }
}

然后将FindInMap的第二个参数更改为:

Conditions:
  HasSpecialDNS: !Or:
    - !Equals [!Ref country, "us"]
    - !Equals [!Ref country, "mx"]

或YAML:

{ "Fn::FindInMap" : [ "DNS", { "Fn::If": ["HasSpecialDNS", {"Ref" : "country"}, "default" ]}, "dns" ]}