{"id":31466,"date":"2026-06-02T14:30:36","date_gmt":"2026-06-02T09:00:36","guid":{"rendered":"https:\/\/opstree.com\/blog\/?p=31466"},"modified":"2026-06-02T15:55:50","modified_gmt":"2026-06-02T10:25:50","slug":"aws-devops-agent-cost-optimization-webhook","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/aws-devops-agent-cost-optimization-webhook\/","title":{"rendered":"AWS DevOps Agent Webhook Integration for Automated Cost Optimization: A Practical POC"},"content":{"rendered":"<div style=\"background: #f8fafc; padding: 18px; border: 1px solid #e2e8f0; border-radius: 6px; font-family: Inter, Arial, sans-serif; margin: 20px 0;\">\n<h3 style=\"margin-top: 0; font-size: 18px;\">Table of Contents<\/h3>\n<ol style=\"margin: 0; padding-left: 18px; line-height: 1.7; font-size: 14px;\">\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#objective\">Objective<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#use-case\">Use Case<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#approach-overview\">Approach Overview<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#solution-overview\">Solution Overview<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#flow-diagram\">Flow Diagram<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#prerequisites\">Prerequisites<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#poc-implementation-steps\">POC Implementation Steps<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#poc-outcome\">POC Outcome<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#benefits\">Benefits<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#limitations\">Limitations<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#future-enhancements\">Future Enhancements<br \/>\n<\/a><\/li>\n<li><a style=\"text-decoration: none; color: #2563eb;\" href=\"#conclusion\">Conclusion<br \/>\n<\/a><\/li>\n<\/ol>\n<\/div>\n<p><!--more--><\/p>\n<h2 id=\"objective\"><b><span data-contrast=\"none\">Objective<\/span><\/b><\/h2>\n<p><span data-contrast=\"auto\">The objective of this Proof of Concept (POC) is to demonstrate how\u00a0<\/span><b><span data-contrast=\"auto\">AWS DevOps Agent<\/span><\/b><span data-contrast=\"auto\">\u00a0can be integrated with a\u00a0<\/span><b><span data-contrast=\"auto\">Webhook-based event flow<\/span><\/b><span data-contrast=\"auto\">\u00a0to support\u00a0<\/span><a href=\"https:\/\/opstree.com\/blog\/understanding-aws-data-transfer-costs-a-story-of-smart-cloud-management\/\" target=\"_blank\" rel=\"noopener\"><b><span data-contrast=\"auto\">cost optimization use cases<\/span><\/b><\/a><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">This POC focuses on detecting potential cost-saving opportunities in AWS infrastructure and sending those events to AWS DevOps Agent for investigation and recommendations.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<h5 aria-level=\"3\"><b><span data-contrast=\"none\">AWS DevOps Agent &#8211; Region Limitations<\/span><\/b><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:281,&quot;335559739&quot;:281}\">\u00a0<\/span><\/h5>\n<ul>\n<li><span data-contrast=\"auto\">AWS DevOps Agent is\u00a0<\/span><b><span data-contrast=\"auto\">not available in all AWS regions<\/span><\/b><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">It works only in\u00a0<\/span><b><span data-contrast=\"auto\">selected supported regions<\/span><\/b><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">United States (N. Virginia) United States (Oregon)<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Asia Pacific (Sydney) Asia Pacific (Tokyo)<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Europe (Frankfurt) Europe (Ireland)<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<\/ul>\n<h2 id=\"use-case\"><b><span data-contrast=\"none\"> Use Case<\/span><\/b><\/h2>\n<p><span data-contrast=\"auto\">The selected use case for this POC is:<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<h4><b><span data-contrast=\"auto\">Cost Optimization Assistant<\/span><\/b><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/h4>\n<p><span data-contrast=\"auto\">This assistant helps identify and reduce unnecessary cloud costs by:<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<ul>\n<li><span data-contrast=\"auto\">detecting underutilized or idle resources<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">identifying <a href=\"https:\/\/opstree.com\/blog\/ec2-store-overview-difference-b-w-aws-ebs-and-instance-store\/\" target=\"_blank\" rel=\"noopener\">EC2 instances<\/a> with low usage<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">triggering DevOps Agent investigations through webhook events<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">enabling cost optimization recommendations for the current AWS setup<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<\/ul>\n<h2 id=\"approach-overview\"><b><span data-contrast=\"none\"> Approach Overview<\/span><\/b><\/h2>\n<p><span data-contrast=\"auto\">There are two possible approaches for implementing the AWS DevOps Agent integration:<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<ol>\n<li><b><span data-contrast=\"auto\">Webhook-Based Integration using AWS Lambda (Current Approach)<\/span><\/b><span data-contrast=\"auto\">\u00a0In this approach, the DevOps Agent communicates with <a href=\"https:\/\/opstree.com\/aws-consulting-services\/\" target=\"_blank\" rel=\"noopener\">AWS services<\/a> through webhooks, which trigger AWS Lambda functions to perform required actions. This is the approach currently being implemented as part of this POC.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><b><span data-contrast=\"auto\">MCP-Based Integration (Future Scope)<\/span><\/b><span data-contrast=\"auto\">\u00a0The second approach involves using an MCP (Model Context Protocol) server for integration. This would require building and exposing MCP tools, typically using Python, and connecting them with the DevOps Agent. This approach is planned for further exploration.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<\/ol>\n<h4 aria-level=\"3\"><b><span data-contrast=\"none\">POC Focus<\/span><\/b><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:281,&quot;335559739&quot;:281}\">\u00a0<\/span><\/h4>\n<p><span data-contrast=\"auto\">For this POC, the primary focus is on demonstrating the\u00a0<\/span>Webhook-Based Integration using <a href=\"https:\/\/opstree.com\/blog\/aws-lambda-heres-everything-you-need-to-know\/\" target=\"_blank\" rel=\"noopener\">AWS Lambda<\/a><span data-contrast=\"auto\">, as it provides a simpler and more direct way to enable communication between the DevOps Agent and AWS services.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<h2 id=\"solution-overview\"><b><span data-contrast=\"none\"> Solution Overview<\/span><\/b><\/h2>\n<p><span data-contrast=\"auto\">In this POC, a simple and scalable architecture is implemented using:<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<ul>\n<li><b><span data-contrast=\"auto\">AWS Lambda<\/span><\/b><span data-contrast=\"auto\">\u00a0as the event generation layer<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><b><span data-contrast=\"auto\">Webhook<\/span><\/b><span data-contrast=\"auto\">\u00a0as the communication layer<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><b><span data-contrast=\"auto\">AWS DevOps Agent<\/span><\/b><span data-contrast=\"auto\">\u00a0as the analysis and recommendation engine<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><span data-contrast=\"auto\">AWS Lambda monitors AWS resources (such as EC2 instances) and detects cost-related signals like low CPU utilization. When such a condition is identified, Lambda sends a structured event to the DevOps Agent using a webhook.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">The DevOps Agent then investigates the infrastructure context and provides recommendations for cost optimization.<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<h2 id=\"flow-diagram\"><b><span data-contrast=\"none\"> Flow Diagram<\/span><\/b><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31483 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-2-2026-02_38_56-PM-1024x512.png\" alt=\"AWS DevOps Agent Flow Diagram\" width=\"1024\" height=\"512\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-2-2026-02_38_56-PM-1024x512.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-2-2026-02_38_56-PM-300x150.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-2-2026-02_38_56-PM-768x384.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-2-2026-02_38_56-PM-1536x768.png 1536w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-2-2026-02_38_56-PM.png 1774w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h2 id=\"prerequisites\"><b><span data-contrast=\"none\"> Prerequisites<\/span><\/b><\/h2>\n<p><span data-contrast=\"auto\">Before starting this POC, the following prerequisites were required:<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<ul>\n<li><span data-contrast=\"auto\">AWS account access<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">AWS DevOps Agent enabled<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Agent Space created successfully<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Primary AWS account connected<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Topology mapping completed<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Webhook configuration access available<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Basic understanding of <a href=\"https:\/\/opstree.com\/blog\/ecs-capacity-provider-strategy\/\" target=\"_blank\" rel=\"noopener\">AWS infrastructure<\/a> resources<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<\/ul>\n<h2 id=\"poc-implementation-steps\" style=\"font-size: 24px;\"><b><span data-contrast=\"none\">POC Implementation Steps<\/span><\/b><\/h2>\n<h4 aria-level=\"2\"><b><span data-contrast=\"none\">Step 1: Create Agent Space<\/span><\/b><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;134245418&quot;:true,&quot;134245529&quot;:true,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:299,&quot;335559739&quot;:299}\">\u00a0<\/span><\/h4>\n<ul>\n<li><span data-contrast=\"auto\">Navigate to AWS DevOps Agent<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Create a new Agent Space<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">Provide name and configure access<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:0,&quot;335559739&quot;:0}\">\u00a0<\/span><\/li>\n<\/ul>\n<p><b><span data-contrast=\"auto\">Result:<\/span><\/b><span data-contrast=\"auto\">\u00a0Agent Space created successfully<\/span><span data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:false,&quot;335551550&quot;:0,&quot;335551620&quot;:0,&quot;335559738&quot;:240,&quot;335559739&quot;:240}\">\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31467 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-40-1024x506.png\" alt=\"\" width=\"1024\" height=\"506\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-40-1024x506.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-40-300x148.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-40-768x380.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-40-1536x760.png 1536w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-40.png 1842w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h4><strong>Step 2: Connect AWS Account<\/strong><\/h4>\n<ul>\n<li>Add AWS account as <strong>Primary Cloud Source<\/strong><\/li>\n<li>Verify status as <strong>Valid<\/strong><\/li>\n<\/ul>\n<p><strong>Result:<\/strong> DevOps Agent gains access to infrastructure<\/p>\n<p><!-- notionvc: d9400af7-0da7-4db0-a6ec-ac208f25e91e --><\/p>\n<p><span data-ccp-props=\"{}\"> <img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31468 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-41-1024x247.png\" alt=\"\" width=\"1024\" height=\"247\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-41-1024x247.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-41-300x72.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-41-768x185.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-41-1536x370.png 1536w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-41.png 1559w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/span><\/p>\n<h4><strong>Step 3: Verify Topology Mapping<\/strong><\/h4>\n<p>Once the account was connected, DevOps Agent completed topology mapping and discovered relationships between infrastructure resources.<\/p>\n<ul>\n<li>Go to DevOps Agent<\/li>\n<li>click on Action<\/li>\n<li>Then go to web app link<\/li>\n<li>click on oprater Access<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31469 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-42-1024x675.png\" alt=\"\" width=\"1024\" height=\"675\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-42-1024x675.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-42-300x198.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-42-768x506.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-42.png 1419w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h4>Step 4: Open DevOps Agent Web App<\/h4>\n<p>The DevOps Agent Web App was opened to interact with the agent in chat mode.<\/p>\n<p>Using the web interface, infrastructure queries were submitted to validate whether the agent could understand the environment.<\/p>\n<p>Example prompt used:<\/p>\n<p><strong>\u201cWhat is in my topology?\u201d<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31470 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-43-1024x538.png\" alt=\"\" width=\"1024\" height=\"538\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-43-1024x538.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-43-300x158.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-43-768x404.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-43-1536x807.png 1536w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-43.png 1800w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h4>Step 5: Configure Webhook<\/h4>\n<ul>\n<li>Go to Webhooks section<\/li>\n<li>Click <strong>Add Webhook<\/strong><\/li>\n<li>Follow steps:\n<ul>\n<li>Review schema<\/li>\n<li>Enable HMAC security<\/li>\n<li>Generate URL and Secret<\/li>\n<\/ul>\n<\/li>\n<li>save URL &amp; SECRET-KEY<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31471 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-44-1024x178.png\" alt=\"\" width=\"1024\" height=\"178\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-44-1024x178.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-44-300x52.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-44-768x134.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-44.png 1535w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h4>Step 6: Create Lambda Function<\/h4>\n<ul>\n<li>Go to AWS Lambda<\/li>\n<li>Create function (Python runtime)<\/li>\n<li>Attach IAM role with required permissions<\/li>\n<\/ul>\n<p>Permissions required:<\/p>\n<ul>\n<li>EC2 (DescribeInstances)<\/li>\n<li>CloudWatch (GetMetricStatistics)<\/li>\n<li>Compute Optimizer (GetEC2InstanceRecommendations)<\/li>\n<li>Logs<\/li>\n<\/ul>\n<h4>Step 7: Add Lambda Logic<\/h4>\n<p>Lambda performs:<\/p>\n<ul>\n<li>Fetch running EC2 instances<\/li>\n<li>Calculate average CPU usage (7 days)<\/li>\n<li>Identify idle instances<\/li>\n<li>Fetch Compute Optimizer recommendations<\/li>\n<li>Send webhook event<\/li>\n<\/ul>\n<h4><strong>Step 8: Configure Environment Variables<\/strong><\/h4>\n<p>Add:<\/p>\n<ul>\n<li><code>WEBHOOK_URL<\/code><\/li>\n<li><code>WEBHOOK_SECRET<\/code><\/li>\n<\/ul>\n<p><!-- notionvc: db7e0532-d9ef-4d26-8ff0-2df9bad0e9c6 --><\/p>\n<h4><strong>Step 9: Test Lambda<\/strong><\/h4>\n<ul>\n<li>Run test event <code>{}<\/code><\/li>\n<li>Verify:\n<ul>\n<li>Lambda execution success<\/li>\n<li>CloudWatch logs<\/li>\n<li>DevOps Agent receives event<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><!-- notionvc: 7387b896-122d-468e-baf5-e08241ad5859 --><\/p>\n<p><strong>use this code<\/strong><\/p>\n<pre style=\"background: #0f172a; color: #e2e8f0; padding: 16px; border-radius: 8px; overflow-x: auto; font-size: 14px; line-height: 1.6;\">import json\r\nimport boto3\r\nimport os\r\nimport hmac\r\nimport hashlib\r\nimport base64\r\nfrom datetime import datetime, timedelta, timezone\r\nimport urllib3\r\n\r\nec2 = boto3.client(\"ec2\")\r\ncw = boto3.client(\"cloudwatch\")\r\nco = boto3.client(\"compute-optimizer\")\r\n\r\nhttp = urllib3.PoolManager(\r\n    timeout=urllib3.util.Timeout(connect=5.0, read=10.0)\r\n)\r\n\r\nWEBHOOK_URL = os.environ[\"WEBHOOK_URL\"]\r\nWEBHOOK_SECRET = os.environ[\"WEBHOOK_SECRET\"]\r\n\r\n\r\ndef get_idle_instances(days=7, cpu_threshold=5.0):\r\n    reservations = ec2.describe_instances(\r\n        Filters=[{\"Name\": \"instance-state-name\", \"Values\": [\"running\"]}]\r\n    )[\"Reservations\"]\r\n\r\n    instances = []\r\n    for reservation in reservations:\r\n        for instance in reservation[\"Instances\"]:\r\n            instances.append(instance)\r\n\r\n    end_time = datetime.now(timezone.utc)\r\n    start_time = end_time - timedelta(days=days)\r\n\r\n    idle = []\r\n\r\n    for instance in instances:\r\n        instance_id = instance[\"InstanceId\"]\r\n        instance_type = instance.get(\"InstanceType\", \"unknown\")\r\n\r\n        metric = cw.get_metric_statistics(\r\n            Namespace=\"AWS\/EC2\",\r\n            MetricName=\"CPUUtilization\",\r\n            Dimensions=[{\"Name\": \"InstanceId\", \"Value\": instance_id}],\r\n            StartTime=start_time,\r\n            EndTime=end_time,\r\n            Period=86400,\r\n            Statistics=[\"Average\"]\r\n        )\r\n\r\n        datapoints = metric.get(\"Datapoints\", [])\r\n\r\n        if datapoints:\r\n            avg_cpu = sum(x[\"Average\"] for x in datapoints) \/ len(datapoints)\r\n        else:\r\n            avg_cpu = 0.0\r\n\r\n        if avg_cpu &lt; cpu_threshold:\r\n            idle.append({\r\n                \"instance_id\": instance_id,\r\n                \"instance_type\": instance_type,\r\n                \"avg_cpu\": round(avg_cpu, 2)\r\n            })\r\n\r\n    return idle\r\n\r\n\r\ndef get_compute_optimizer_data():\r\n    try:\r\n        response = co.get_ec2_instance_recommendations()\r\n        recommendations = []\r\n\r\n        for item in response.get(\"instanceRecommendations\", []):\r\n            recs = []\r\n\r\n            for opt in item.get(\"recommendationOptions\", [])[:3]:\r\n                recs.append({\r\n                    \"instance_type\": opt.get(\"instanceType\"),\r\n                    \"performance_risk\": opt.get(\"performanceRisk\")\r\n                })\r\n\r\n            recommendations.append({\r\n                \"instance_arn\": item.get(\"instanceArn\"),\r\n                \"current_instance_type\": item.get(\"currentInstanceType\"),\r\n                \"finding\": item.get(\"finding\"),\r\n                \"recommendations\": recs\r\n            })\r\n\r\n        return recommendations\r\n\r\n    except Exception as e:\r\n        return [{\"error\": str(e)}]\r\n\r\n\r\ndef sign_payload(secret, body, timestamp):\r\n    message = f\"{timestamp}:{body}\".encode(\"utf-8\")\r\n\r\n    digest = hmac.new(\r\n        secret.encode(\"utf-8\"),\r\n        message,\r\n        hashlib.sha256\r\n    ).digest()\r\n\r\n    return base64.b64encode(digest).decode(\"utf-8\")\r\n\r\n\r\ndef send_to_devops_agent(payload):\r\n    body = json.dumps(payload, separators=(\",\", \":\"))\r\n\r\n    timestamp = datetime.now(timezone.utc).strftime(\r\n        \"%Y-%m-%dT%H:%M:%S.000Z\"\r\n    )\r\n\r\n    signature = sign_payload(\r\n        WEBHOOK_SECRET,\r\n        body,\r\n        timestamp\r\n    )\r\n\r\n    headers = {\r\n        \"Content-Type\": \"application\/json\",\r\n        \"x-amzn-event-timestamp\": timestamp,\r\n        \"x-amzn-event-signature\": signature\r\n    }\r\n\r\n    print(\"Webhook URL:\", WEBHOOK_URL)\r\n    print(\"Timestamp:\", timestamp)\r\n    print(\"Payload body:\", body)\r\n    print(\"Signature:\", signature)\r\n\r\n    response = http.request(\r\n        \"POST\",\r\n        WEBHOOK_URL,\r\n        body=body.encode(\"utf-8\"),\r\n        headers=headers\r\n    )\r\n\r\n    print(\"Webhook response status:\", response.status)\r\n\r\n    return {\r\n        \"status_code\": response.status,\r\n        \"response\": response.data.decode(\r\n            \"utf-8\",\r\n            errors=\"ignore\"\r\n        )\r\n    }\r\n\r\n\r\ndef lambda_handler(event, context):\r\n\r\n    idle_instances = get_idle_instances(\r\n        days=7,\r\n        cpu_threshold=5.0\r\n    )\r\n\r\n    optimizer_data = get_compute_optimizer_data()\r\n\r\n    incident_id = (\r\n        f\"cost-\"\r\n        f\"{datetime.now(timezone.utc).strftime('%Y%m%d%H%M%S')}\"\r\n    )\r\n\r\n    payload = {\r\n        \"eventType\": \"incident\",\r\n        \"incidentId\": incident_id,\r\n        \"action\": \"created\",\r\n        \"priority\": \"MEDIUM\",\r\n        \"title\": \"Potential AWS cost optimization opportunities detected\",\r\n        \"description\": \"Lambda found underutilized EC2 instances and collected Compute Optimizer recommendations.\",\r\n        \"timestamp\": datetime.now(timezone.utc).strftime(\r\n            \"%Y-%m-%dT%H:%M:%S.000Z\"\r\n        ),\r\n        \"service\": \"cost-optimizer\",\r\n        \"data\": {\r\n            \"idle_instances\": idle_instances,\r\n            \"compute_optimizer\": optimizer_data\r\n        }\r\n    }\r\n\r\n    webhook_result = send_to_devops_agent(payload)\r\n\r\n    return {\r\n        \"statusCode\": 200,\r\n        \"body\": json.dumps({\r\n            \"idle_instances_found\": len(idle_instances),\r\n            \"webhook_result\": webhook_result,\r\n            \"payload_sent\": payload\r\n        })\r\n    }\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31472 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-45-1024x423.png\" alt=\"\" width=\"1024\" height=\"423\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-45-1024x423.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-45-300x124.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-45-768x317.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-45.png 1468w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h4>Step 10: Schedule Automation<\/h4>\n<ul>\n<li>Use EventBridge<\/li>\n<li>Create rule (daily or periodic trigger)<\/li>\n<li>Attach Lambda<\/li>\n<\/ul>\n<p><strong>Sample Webhook Event<\/strong><\/p>\n<p>A sample event for the cost optimization use case is shown below:<\/p>\n<pre style=\"background: #0f172a; color: #e2e8f0; padding: 16px; border-radius: 8px; overflow-x: auto; font-size: 14px; line-height: 1.6;\">{\r\n  \"eventType\": \"incident\",\r\n  \"incidentId\": \"cost-001\",\r\n  \"action\": \"created\",\r\n  \"priority\": \"MEDIUM\",\r\n  \"title\": \"Idle EC2 detected\",\r\n  \"description\": \"Some EC2 instances are underutilized and may be candidates for cost optimization.\",\r\n  \"timestamp\": \"2026-04-14T10:00:00Z\",\r\n  \"service\": \"cost-optimizer\",\r\n  \"data\": {\r\n    \"instances\": [\r\n      \"i-1234567890abcd\",\r\n      \"i-0987654321efgh\"\r\n    ]\r\n  }\r\n}\r\n<\/pre>\n<h2 id=\"poc-outcome\"><strong>POC Outcome<\/strong><\/h2>\n<p>This POC successfully demonstrates:<\/p>\n<ul>\n<li>DevOps Agent setup and topology mapping<\/li>\n<li>Cost optimization analysis via DevOps Agent<\/li>\n<li>Webhook integration for event-driven architecture<\/li>\n<li>Lambda-based cost signal generation<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31473 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-46-1024x533.png\" alt=\"\" width=\"1024\" height=\"533\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-46-1024x533.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-46-300x156.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-46-768x400.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-46-1536x800.png 1536w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-46.png 1843w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31474 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-47-1024x528.png\" alt=\"\" width=\"1024\" height=\"528\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-47-1024x528.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-47-300x155.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-47-768x396.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-47-1536x792.png 1536w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-47.png 1822w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-31476 size-large\" src=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-48-1024x381.png\" alt=\"\" width=\"1024\" height=\"381\" srcset=\"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-48-1024x381.png 1024w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-48-300x112.png 300w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-48-768x286.png 768w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-48-1536x571.png 1536w, https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/image-48.png 1810w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h2 id=\"benefits\"><strong>Benefits<\/strong><\/h2>\n<ul>\n<li>Beginner-friendly implementation<\/li>\n<li>No need for <a href=\"https:\/\/opstree.com\/blog\/model-context-protocol\/\" target=\"_blank\" rel=\"noopener\">MCP server<\/a> initially<\/li>\n<li>Scalable architecture<\/li>\n<li>Supports automation using Lambda and EventBridge<\/li>\n<li>Enables proactive cost optimization<\/li>\n<\/ul>\n<h2 id=\"limitations\"><strong>Limitations<\/strong><\/h2>\n<ul>\n<li>Lambda automation is basic in current POC<\/li>\n<li>Advanced optimization logic not fully implemented<\/li>\n<li>Region availability is limited<\/li>\n<li>Requires additional integrations for full automation<\/li>\n<\/ul>\n<h2 id=\"future-enhancements\"><strong>Future Enhancements<\/strong><\/h2>\n<ul>\n<li>Advanced cost analysis logic in Lambda<\/li>\n<li>Real-time CloudWatch integration<\/li>\n<li>SNS \/ Slack alerts<\/li>\n<li>Auto-remediation workflows<\/li>\n<li>Multi-region support<\/li>\n<\/ul>\n<h2 id=\"conclusion\"><strong>Conclusion<\/strong><\/h2>\n<p>This POC demonstrates a practical and scalable approach to cost optimization using:<\/p>\n<ul>\n<li>AWS DevOps Agent for intelligent analysis<\/li>\n<li><a href=\"https:\/\/aws.amazon.com\/lambda\/\" target=\"_blank\" rel=\"noopener\">AWS Lambda<\/a> for automation<\/li>\n<li>Webhook for event-driven communication<\/li>\n<\/ul>\n<p>It provides a strong foundation for building a fully automated cost optimization system in AWS.<\/p>\n<h4><strong>Related Searches<\/strong><\/h4>\n<ul>\n<li><a href=\"https:\/\/opstree.com\/blog\/aws-for-beginners-what-is-it-how-it-works-and-key-benefits\/\" target=\"_blank\" rel=\"noopener\">AWS For Beginners: What Is It, How It Works, and Key Benefits<\/a><\/li>\n<li><a href=\"https:\/\/opstree.com\/blog\/aws-cloudformation-guide\/\" target=\"_blank\" rel=\"noopener\">Complete AWS CloudFormation Guide In 2026<\/a><\/li>\n<li><a href=\"https:\/\/opstree.com\/blog\/aws-migration-service-complete-guide\/\" target=\"_blank\" rel=\"noopener\">Complete Guide to Server Migration Using AWS Application Migration Service<\/a><\/li>\n<\/ul>\n<h4><strong>Related Solutions<\/strong><\/h4>\n<ul>\n<li><a href=\"https:\/\/opstree.com\/blog\/database-migration-service-in-aws\/\" target=\"_blank\" rel=\"noopener\">AWS Data Migration Service<\/a><\/li>\n<li><a href=\"https:\/\/opstree.com\/services\/application-platform-security-management\/\" target=\"_blank\" rel=\"noopener\">platform engineering services<\/a><\/li>\n<li><a href=\"https:\/\/opstree.com\/aws-partner\/\" target=\"_blank\" rel=\"noopener\">AWS Consulting Partner<\/a><\/li>\n<\/ul>\n<p><!-- notionvc: 71d54119-0014-470d-aa95-2f4f106f44a8 --><\/p>\n<p><!-- notionvc: 98c60d4d-d8bc-4fc1-ad4a-d836b1712561 --><\/p>\n<p><!-- notionvc: 5a0496c8-fc0b-4536-a6e0-2ae4fde18be0 --><\/p>\n<p><!-- notionvc: 6b5c970a-9d13-4fec-9093-5754cf457a07 --><\/p>\n<p><!-- notionvc: d6bc2aa5-b9d9-440f-bda8-6bf66482d3ad --><\/p>\n<p><!-- notionvc: 536babb1-83c0-46a2-a159-16d5e5e67205 --><\/p>\n<p><!-- notionvc: b9be28ab-4c3e-49af-8104-5e53b4150507 --><\/p>\n<p><!-- notionvc: f6814da5-9e94-4084-ad61-e0c448f63134 --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Table of Contents Objective Use Case Approach Overview Solution Overview Flow Diagram Prerequisites POC Implementation Steps POC Outcome Benefits Limitations Future Enhancements Conclusion<\/p>\n","protected":false},"author":244582722,"featured_media":31479,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[36349927],"tags":[768739638,768739561,768739639],"class_list":["post-31466","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aws-2","tag-aws-devops-agent","tag-aws-services","tag-ec2-instances"],"blocksy_meta":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2026\/06\/Untitled-design-35.png","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-8bw","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/31466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/244582722"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=31466"}],"version-history":[{"count":8,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/31466\/revisions"}],"predecessor-version":[{"id":31485,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/31466\/revisions\/31485"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/31479"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=31466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=31466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=31466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}