在映射上设置默认值的好策略是什么?
即
我有一个名为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
的大量国家/地区列表,将来这个值会发生变化,我们会添加更多国家/地区,有更好的方法吗?
答案 0 :(得分:1)
我能够做到这一点的唯一方法是链接Fn::If
语句而不是使用地图。我尝试使用Fn::If
和Fn::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" ]}