AWS CloudFormation的DashboardBody中使用Fn::FindInMap不生效如何解决
问题根因
你将Fn::FindInMap内置函数直接写在了!Sub的JSON字符串内部,CloudFormation不会解析字符串字面量中包含的内置函数声明,因此映射值无法被正常替换,函数表达式会被直接当作普通字符串传递给仪表盘配置。同时原代码中Fn::FindInMap的第一个参数和你定义的映射名称不匹配,也会导致取值失败。
解决方法
使用!Sub的双参数语法,先通过占位符标记要替换的位置,再在第二个参数中关联Fn::FindInMap的返回结果,示例代码如下:
Mappings: EnvSource: Dev: SMSFailed: sns/us-east-1/XXX/DirectPublishToPhoneNumber/Failure Resources: MonitoringDashboard: Type: "AWS::CloudWatch::Dashboard" Properties: DashboardName: Monitoring-Test-Dashboard DashboardBody: !Sub - '{"widgets":[{"height":6,"width":12,"y":1,"x":12,"type":"log","properties":{"query":"SOURCE \'${SmsLogSource}\' | fields @timestamp, @message, delivery.providerResponse, status\n| filter @message like //\n|stats count(status) as ErrorCount by delivery.providerResponse\n| sort @timestamp asc","region":"us-east-1","title":"SMS Failed","view":"table"}}]}' - SmsLogSource: !FindInMap [EnvSource, Dev, SMSFailed]
注意事项
- 如果你需要根据部署环境动态选择映射值,可以把
Dev替换为对应的环境参数(比如!Ref EnvType),实现多环境适配 - 用单引号包裹JSON字符串可以减少内部双引号的转义操作,降低语法错误概率
内容的提问来源于stack exchange,提问作者Anushah Khawaja
相关产品推荐
相关产品推荐

