Para crear un panel de CloudWatch en CloudFormation , debe proporcionar el código fuente del panel como un JSON en cadena en lugar de una estructura JSON separada .
Esto es molesto porque mi JSON tiene que escaparse dentro de una cadena literal dentro de mi serverless.yml :
... resources: Resources: MyDashboard: Type: AWS::CloudWatch::Dashboard Properties: DashboardName: My-Dashboard DashboardBody: "{\"widgets\": [...]}"Intenté usar una referencia de archivo:
... resources: Resources: MyDashboard: Type: AWS::CloudWatch::Dashboard Properties: DashboardName: My-Dashboard DashboardBody: ${file(my-dashboard.json)} pero serverless inserta el contenido como parte de la estructura YAML, en lugar de como parte de la cadena JSON:
... resources: Resources: MyDashboard: Type: AWS::CloudWatch::Dashboard Properties: DashboardName: My-Dashboard DashboardBody: Widgets: - ... - ... ¿Hay alguna manera de stringify el JSON desde my-dashboard.json ?
No parece haber una forma de stringify JSON directamente dentro de una variable sin servidor . Sin embargo, puede hacer referencia a un archivo .js externo y luego .json stringify :
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} es una referencia de variable sin servidor . Significa que queremos usar el valor del módulo myDashboardBody del archivo 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": [ ... ] }