Как использовать файл json в качестве DashboardBody в CloudFormation с Serverless? - PullRequest
1 голос
/ 12 марта 2020

Чтобы создать CloudWatch Dashboard в CloudFormation , необходимо предоставить исходный код панели инструментов в виде строкового JSON, а не в виде отдельной структуры JSON .

Это раздражает, потому что мой JSON должен быть экранирован внутри строкового литерала внутри моего serverless.yml:

...
resources:
  Resources:
    MyDashboard:
      Type: AWS::CloudWatch::Dashboard
      Properties:
      DashboardName: My-Dashboard
      DashboardBody: "{\"widgets\": [...]}"

Я попытался использовать ссылку на файл:

...
resources:
  Resources:
    MyDashboard:
      Type: AWS::CloudWatch::Dashboard
      Properties:
      DashboardName: My-Dashboard
      DashboardBody: ${file(my-dashboard.json)}

но serverless вставляет содержимое как часть структуры YAML, а не как часть строки JSON:

...
resources:
  Resources:
    MyDashboard:
      Type: AWS::CloudWatch::Dashboard
      Properties:
      DashboardName: My-Dashboard
      DashboardBody:
        Widgets:
          - ...
          - ...

Есть ли способ stringify JSON из my-dashboard.json

1 Ответ

1 голос
/ 12 марта 2020

Кажется, что нет пути stringify JSON непосредственно в серверной переменной . Однако вы можете сослаться на внешний файл .js, а затем stringify файл .json:

serverless.yml:

...
resources:
  Resources:
    MyDashboard:
      Type: AWS::CloudWatch::Dashboard
      Properties:
      DashboardName: My-Dashboard
      DashboardBody: ${file(my-dashboard-body.js):myDashboardBody}

${file(my-dashboard-body.js):myDashboardBody} - это ссылка на переменную без сервера . Это означает, что мы хотим использовать значение из модуля myDashboardBody файла my-dashboard-body.js.

my-dashboard-body.js:

module.exports.myDashboardBody = (serverless) => {
 const fsPromises = require('fs').promises
 return fsPromises.readFile('my-dashboard-body.json', 'utf-8')
};

my-dashboard-body.json:

{
  "widgets": [
    ...
  ]
}
...