Я пишу панель инструментов для облачных часов, используя инфраструктуру в качестве кода для достижения этой цели. У меня есть json внутри DashboardBody в файле yaml. Моя проблема возникает, когда я пытаюсь использовать функцию fn::xxxx внутри метрик json следующим образом:

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, а миграция будет пустой тратой времени.

Жесткое кодирование имени работает, но, поскольку балансировщик нагрузки тоже находится в облачном режиме, я не могу этого сделать.

Спасибо.

0
TiGreX 23 Апр 2020 в 13:54

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.

1
Marcin 23 Апр 2020 в 15:46
Я получаю 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. Значит ли это, что я не могу использовать "${variable}" внутри !Sub?
 – 
TiGreX
23 Апр 2020 в 15:34
1
Немного отредактировал мой ответ, но вы должны проверить документы на предмет всех отступов и синтаксиса. Невозможно воспроизвести соответствующие отступы в редакторе SO с тем, что у вас есть в вашем редакторе.
 – 
Marcin
23 Апр 2020 в 15:48
Я понимаю, что вы имеете в виду, я передал весь файл на валидатор yaml, и он говорит, что он действителен, но я все еще получаю ту же ошибку в AWS, и да, я сделал - |. может быть, AWS не поддерживает это? Спасибо за вашу помощь.
 – 
TiGreX
23 Апр 2020 в 16:03
Я не знаю причины, по которой это не будет поддерживаться. В документах здесь пишут, что «Вы не можете использовать короткую форму !ImportValue, если она содержит !Sub.». Может быть, верно и обратное, и вместо !ImportValue нужно использовать полную запись?
 – 
Marcin
23 Апр 2020 в 16:13
Я также пробовал Fn::ImportValue, и это не сработало.
 – 
TiGreX
23 Апр 2020 в 17:31