【问题标题】:use Fn::ImportValue inside a json which is inside a yaml in cloudformation在 cloudformation 的 yaml 中的 json 中使用 Fn::ImportValue
【发布时间】:2020-08-06 16:12:21
【问题描述】:

我正在使用基础设施即代码为 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,但尝试是免费的。

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

知道这是否可行吗? 关于将所有迁移到 yaml 被丢弃,因为我们很想迁移所有以使用 Amazon CDK 并且迁移将浪费时间。

硬编码名称是有效的,但由于负载均衡器也在 cloudformation 上,所以我不能这样做。

谢谢。

【问题讨论】:

    标签: json yaml amazon-cloudformation


    【解决方案1】:

    我认为应该可以使用数组形式的!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 时可以看到核心结构。

    【讨论】:

    • 我收到Template error: One or more Fn::Sub intrinsic functions don't specify expected arguments. Specify a string as first argument, and an optional second argument to specify a mapping of values to replace in the string 这是否意味着我不能在!Sub 中使用"${variable}"
    • @TiGreX 稍微编辑了我的答案,但您必须检查文档以了解所有缩进和语法。无法将 SO 编辑器中的匹配缩进复制到您的编辑器中。
    • 我明白你的意思,我通过 yaml 验证器传递了整个文件,它说是有效的,但我仍然在 AWS 中遇到同样的错误,是的,我做了 - | 的事情。会不会是 AWS 不支持?谢谢大家的帮助。
    • @TiGreX 我不知道为什么不支持它。在文档here 中,他们写道:“当它包含 !Sub 时,您不能使用 !ImportValue 的缩写形式。”。也许相反也是正确的,并且必须使用完整的符号而不是!ImportValue
    • 我也尝试了Fn::ImportValue,但没有成功
    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2021-08-10
    • 2019-03-30
    • 2021-04-19
    • 2019-07-09
    • 2019-08-23
    • 2018-12-25
    相关资源
    最近更新 更多