在cloudformation的yaml内的json中使用Fn :: ImportValue

时间:2020-04-23 10:54:13

标签: json yaml amazon-cloudformation

我正在使用基础结构作为代码来编写用于Cloudwatch的仪表板,以实现此目标。在yaml文件的DashboardBody中有一个json,当我尝试在json的指标中使用函数fn::xxxx时,问题就来了如下:

Resources:
  DashboardTestYAML:
    Type: AWS::CloudWatch::Dashboard
    Properties:
      DashboardName: SummaryDashboard
      DashboardBody: '{
                    "widgets": [{
                        "type": "metric",
                        "x": 0,
                        "y": 0,
                        "width": 6,
                        "height": 6,
                        "properties": {
                                  "metrics": [
                                      [ "AWS/ApplicationELB", "RequestCount", "LoadBalancer", {"Fn::ImportValue": "LoadBalancerFullName"} ]
                                  ],
                                  "view": "timeSeries",
                                  "stacked": false,
                                  "region": "eu-west-1",
                                  "stat": "Sum",
                                  "period": 300,
                                  "title": "Load-blancer-requests"
                              }
                      }]
                  }'

我尝试了以下操作,但没有任何效果(有些甚至不是有效的json,但try是免费的。

  • {"Fn::ImportValue": "LoadBalancerFullName"}
  • "{"Fn::ImportValue": "LoadBalancerFullName"}"
  • '{"Fn::ImportValue": "LoadBalancerFullName"}'
  • {Fn::ImportValue: LoadBalancerFullName}
  • Fn::ImportValue: LoadBalancerFullName
  • -Fn::ImportValue: LoadBalancerFullName

是否知道是否可以这样做? 关于将全部迁移到yaml的操作已被废弃,因为我们要迁移所有以使用Amazon CDK的方法,而进行迁移将浪费时间。

硬编码名称有效,但是由于负载均衡器也处于cloudformation上,因此我无法做到这一点。

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为应该可以使用!Sub以数组形式执行此操作:

            DashboardBody: 
              !Sub 
                - |
                  {
                  "widgets": [{
                    "type": "metric",
                    "x": 0,
                    "y": 0,
                    "width": 6,
                    "height": 6,
                    "properties": {
                              "metrics": [
                                  [ "AWS/ApplicationELB", "RequestCount", "LoadBalancer", "${LoadBalancerName}" ]
                              ],
                              "view": "timeSeries",
                              "stacked": false,
                              "region": "eu-west-1",
                              "stat": "Sum",
                              "period": 300,
                              "title": "Load-blancer-requests"
                          }
                    }]
                   }
                 - LoadBalancerName: !ImportValue LoadBalancerFullName

我的语法或意图可能不正确,但是我认为使用!Sub时可以看到核心结构。