Building an Amazon CloudWatch Dashboard Outside of the AWS Management Console
Steve McCurry is a Senior Product Manager for CloudWatch
This is the second in a series of two blog posts that demonstrate how to use the new CloudWatch
snapshot graphs feature. You can find the first post here.
A key challenge for any DevOps team is to provide sufficient monitoring visibility on service
health. Although CloudWatch dashboards are a powerful tool for monitoring your systems and
applications, the dashboards are accessible only to users with permissions to the AWS
Management Console. You can now use a new CloudWatch feature, snapshot graphs, to create
dashboards that contain CloudWatch graphs and are available outside of the AWS Management
Console. You can display CloudWatch snapshot graphs on your internal wiki pages or TV-based
dashboards. You can integrate them with chat applications and ticketing and bug tracking tools.
This blog post shows you how to embed CloudWatch snapshot graphs into your websites using a
Snapshot graphs overview
CloudWatch snapshot graphs are images of CloudWatch charts that are useful for building
custom dashboards or integrating with tools outside of AWS. Although the images are static,
they can be refreshed frequently to create a live dashboard experience.
CloudWatch dashboards and charts provide flexible, interactive visualizations that can be used to
create unified operational views across your AWS resources and metrics. However, maybe you
want to display CloudWatch charts on a TV screen for team-level visibility, take snapshots of
charts for auditing in ticketing systems and bug tracking tools, or share snapshots in chat
applications to collaborate on an issue. For these use cases and more, snapshot graphs are an
ideal tool for integrating CloudWatch charts with your webpages and third-party applications.
Snapshot graphs are available through the CloudWatch API, which you can use through the
AWS SDKs or CLI. The charts you request through the API are represented as JSON. To copy
the JSON definition of the graph and use it in the API request, open the Amazon CloudWatch
console. You’ll find the JSON on the Source tab of the Metrics page, as shown here.
All of the features of the CloudWatch line and stacked graphs are available in snapshot graphs,
including vertical and horizontal annotations.
Embedding a snapshot graph in your webpage
In this demonstration, we will set up monitoring for an EC2 instance and embed a CloudWatch
snapshot graph for CPUUtilization in a website outside of the AWS Management Console. The
embeddable widget can be configured to support any CloudWatch line or stacked chart. This
demonstration involves these steps:
- Create an EC2 instance to monitor.
- Create the Lambda function that calls CloudWatch GetMetricWidgetImage.
- Create an API Gateway endpoint that proxies requests to the Lambda function.
- Embed the widget into a website and configure it for the API Gateway request.
The code for this solution is available from the SnapshotWidgetDemo GitHub repo.
Amazon API Gateway and an AWS Lambda backend. The advantage of using API Gateway is
the additional flexibility you have to secure the endpoint and create fine-grained access control.
For example, you can block access to the endpoint from outside of your corporate network.
Amazon Route 53 could be an alternative solution.
The end goal is to have a webpage running on your local machine that displays a CloudWatch
snapshot graph displaying live metric data from a sample EC2 instance. The sample code
includes a basic webpage containing the embed code.
proxies the request to a Lambda function that calls the new CloudWatch API service,
GetMetricWidgetImage. The retrieved snapshot graph is returned in binary and displayed on the
website in an IMG HTML tag.
Here is what the end-to-end solution looks like:
- Download the repository.
- Navigate to ./server and run npm install
- From the server folder, run zip -r snapshotwidgetdemo.zip ./*
- Upload snapshotwidgetdemo.zip to any S3 bucket.
- Upload ./server/apigateway-lambda.json to any S3 bucket.
- Navigate to the AWS CloudFormation console and choose Create Stack.
- Point the new stack to the S3 location in step 5.
- During setup, you will be asked for the Lambda S3 bucket name from step 4.
The AWS CloudFormation script will create all the required server-side components described in
the previous section.
- Navigate to ./client and run npm install
- Edit ./demo/index.html to replace the following placeholders with your values.
a. <YOUR_INSTANCE_ID> You can find the instance ID in the AWS
CloudFormation stack output.
b. <YOUR_API_GATEWAY_URL> You can find the full URL in the AWS
CloudFormation stack output.
c. <YOUR_API_KEY> The API gateway requires a key. The key reference but not
the key itself appears in theAWS CloudFormation stack output. To retrieve the
key value, go to the Keys tab of the Amazon API Gateway console.
- Build the component using WebPack ./node_modules/.bin/webpack –config
- Server the demo webpage on localhost ./node_modules/.bin/webpack-dev-server —
The browser should open at index.html automatically. The page contains one embedded snapshot
graph with the CPU utilization of your EC2 instance.
If you don’t see anything on the webpage, use the browser console tools to check for console
If you still can’t debug the problem, go to the Amazon API Gateway console. On the Logs tab,
make sure that Enable CloudWatch Logs is selected, as shown here:
To check the Lambda logs, in the CloudWatch console, choose the Logs tab, and then search for
the name of your Lambda function.
This blog post provided a solution for embedding CloudWatch snapshot graphs into webpages
and wikis outside of the AWS Management Console. To read the other blog post in this series
about CloudWatch snapshot graphs, see Reduce Time to Resolution with Amazon CloudWatch
Snapshot Graphs and Alerts.
For more information, see the snapshot graphs API documentation or visit our home page to
learn more about how Amazon CloudWatch achieves monitoring visibility for your cloud
resources and applications.
It would be great to hear your feedback.