You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:57:01