{"id":3042,"date":"2026-03-20T15:16:00","date_gmt":"2026-03-20T07:16:00","guid":{"rendered":"https:\/\/ichwanchandra.com\/blog\/?p=3042"},"modified":"2026-09-26T14:14:28","modified_gmt":"2026-09-26T06:14:28","slug":"aws-solutions-architect-project-operational-excellence-part-4","status":"publish","type":"post","link":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/","title":{"rendered":"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4"},"content":{"rendered":"\n<p>In this final part, we will build a monitoring dashboard for the Chat Support team which is already using the Slack workspace as part of the daily operation. CloudFront will be used as the Infrastructure as Code (IaC) which help the consistent setup with easy rollback and update.<\/p>\n\n\n\n<p>The CloudFront template will provision the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An <strong>S3 bucket<\/strong> configured for static website hosting <\/li>\n\n\n\n<li>A <strong>CloudFront distribution<\/strong> with <strong>Origin Access Control (OAC)<\/strong> for secure access <\/li>\n\n\n\n<li>A <strong>bucket policy<\/strong> that grants CloudFront access to the bucket only via the OAC <\/li>\n\n\n\n<li>An <strong>output URL<\/strong> to access the dashboard globally<\/li>\n<\/ul>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Create CloudFormation Template<\/h2>\n\n\n\n<p>Using our text editor \/ IDE, create a file using below code and save it with name <strong>dashboard.yml<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AWSTemplateFormatVersion: '2010-09-09'\nDescription: ChatSupportBot \u2013 Frontend Dashboard (S3 + CloudFront using OAC)\n\nResources:\n\n  DashboardBucket:\n    Type: AWS::S3::Bucket\n    Properties:\n      BucketName: !Sub \"chatsupport-frontend-${AWS::AccountId}-${AWS::Region}\"\n      WebsiteConfiguration:\n        IndexDocument: index.html\n      PublicAccessBlockConfiguration:\n        BlockPublicAcls: true\n        BlockPublicPolicy: true\n        IgnorePublicAcls: true\n        RestrictPublicBuckets: true\n      OwnershipControls:\n        Rules:\n          - ObjectOwnership: BucketOwnerEnforced\n\n  CloudFrontOAC:\n    Type: AWS::CloudFront::OriginAccessControl\n    Properties:\n      OriginAccessControlConfig:\n        Name: ChatSupportOAC\n        Description: Access control for CloudFront to access S3\n        SigningBehavior: always\n        SigningProtocol: sigv4\n        OriginAccessControlOriginType: s3\n\n  DashboardDistribution:\n    Type: AWS::CloudFront::Distribution\n    Properties:\n      DistributionConfig:\n        Enabled: true\n        DefaultRootObject: index.html\n        Origins:\n          - DomainName: !GetAtt DashboardBucket.RegionalDomainName\n            Id: S3Origin\n            S3OriginConfig: {}\n            OriginAccessControlId: !Ref CloudFrontOAC\n        DefaultCacheBehavior:\n          TargetOriginId: S3Origin\n          ViewerProtocolPolicy: redirect-to-https\n          AllowedMethods: &#91;GET, HEAD]\n          CachedMethods: &#91;GET, HEAD]\n          Compress: true\n          ForwardedValues:\n            QueryString: false\n        ViewerCertificate:\n          CloudFrontDefaultCertificate: true\n\n  BucketPolicy:\n    Type: AWS::S3::BucketPolicy\n    Properties:\n      Bucket: !Ref DashboardBucket\n      PolicyDocument:\n        Version: \"2012-10-17\"\n        Statement:\n          - Effect: Allow\n            Principal:\n              Service: cloudfront.amazonaws.com\n            Action: s3:GetObject\n            Resource: !Sub \"${DashboardBucket.Arn}\/*\"\n            Condition:\n              StringEquals:\n                AWS:SourceArn: !Sub \"arn:aws:cloudfront::${AWS::AccountId}:distribution\/${DashboardDistribution}\"\n\nOutputs:\n  DashboardURL:\n    Description: CloudFront URL to access the frontend dashboard\n    Value: !Sub \"https:\/\/${DashboardDistribution.DomainName}\"<\/code><\/pre>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Deploy the Code Using AWS CloudFront<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Visit <strong>CloudFormation<\/strong> in the AWS Console <\/li>\n\n\n\n<li>Click <strong>Create stack<\/strong> \n<ul class=\"wp-block-list\">\n<li>Under <em>Prepare template<\/em> \n<ul class=\"wp-block-list\">\n<li>Select: <code>Choose an existing template<\/code> (default)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Under <em>Specify template<\/em> \n<ul class=\"wp-block-list\">\n<li><strong>Template source<\/strong>: Select <code>Upload a template file<\/code><\/li>\n\n\n\n<li><strong>Upload<\/strong>: Click <code>Choose file<\/code> and select the <code><strong>dashboard.yml<\/strong><\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Click <strong>Next<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1069\" height=\"900\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-34.png\" alt=\"\" class=\"wp-image-3056\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-34.png 1069w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-34-300x253.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-34-1024x862.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-34-768x647.png 768w\" sizes=\"auto, (max-width: 1069px) 100vw, 1069px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stack name: chatsupport-dashboard-stack<\/li>\n\n\n\n<li>Click Next<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1069\" height=\"548\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-35.png\" alt=\"\" class=\"wp-image-3058\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-35.png 1069w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-35-300x154.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-35-1024x525.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-35-768x394.png 768w\" sizes=\"auto, (max-width: 1069px) 100vw, 1069px\" \/><\/figure>\n\n\n\n<p>Leave all the stack configuration as default, review it, and click <strong>Submit \/ Create Stack<\/strong><\/p>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Upload the HTML File to S3 Bucket<\/h2>\n\n\n\n<p>Visit S3 console and we can find the <strong>chatsupport-frontend <\/strong>S3 bucket has been created by CloudFormation<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1069\" height=\"548\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-36.png\" alt=\"\" class=\"wp-image-3064\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-36.png 1069w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-36-300x154.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-36-1024x525.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-36-768x394.png 768w\" sizes=\"auto, (max-width: 1069px) 100vw, 1069px\" \/><\/figure>\n\n\n\n<p>Use below HTML code snippet and save it as <strong>index.html<\/strong> on our local text editor<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;title&gt;ChatSupportBot - AWS Operations Dashboard&lt;\/title&gt;\n    &lt;style&gt;\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);\n            min-height: 100vh;\n            color: #333;\n        }\n\n        .container {\n            max-width: 1400px;\n            margin: 0 auto;\n            padding: 20px;\n        }\n\n        .header {\n            background: rgba(255, 255, 255, 0.95);\n            backdrop-filter: blur(10px);\n            border-radius: 20px;\n            padding: 30px;\n            margin-bottom: 30px;\n            box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);\n            border: 1px solid rgba(255, 255, 255, 0.2);\n        }\n\n        .header h1 {\n            font-size: 2.5rem;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            -webkit-background-clip: text;\n            -webkit-text-fill-color: transparent;\n            margin-bottom: 10px;\n            text-align: center;\n        }\n\n        .header p {\n            text-align: center;\n            font-size: 1.1rem;\n            color: #666;\n            max-width: 800px;\n            margin: 0 auto;\n            line-height: 1.6;\n        }\n\n        .stats-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n            gap: 25px;\n            margin-bottom: 30px;\n        }\n\n        .stat-card {\n            background: rgba(255, 255, 255, 0.95);\n            backdrop-filter: blur(10px);\n            border-radius: 20px;\n            padding: 25px;\n            text-align: center;\n            box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);\n            border: 1px solid rgba(255, 255, 255, 0.2);\n            transition: all 0.3s ease;\n        }\n\n        .stat-card:hover {\n            transform: translateY(-5px);\n            box-shadow: 0 25px 50px rgba(0, 0, 0, 0.2);\n        }\n\n        .stat-number {\n            font-size: 2.5rem;\n            font-weight: 700;\n            margin-bottom: 10px;\n        }\n\n        .stat-number.healthy { color: #27ae60; }\n        .stat-number.warning { color: #f39c12; }\n        .stat-number.critical { color: #e74c3c; }\n        .stat-number.info { color: #3498db; }\n\n        .stat-label {\n            font-size: 1rem;\n            color: #666;\n            font-weight: 500;\n        }\n\n        .main-grid {\n            display: grid;\n            grid-template-columns: 2fr 1fr;\n            gap: 30px;\n            margin-bottom: 30px;\n        }\n\n        .alerts-section, .actions-section, .services-section {\n            background: rgba(255, 255, 255, 0.95);\n            backdrop-filter: blur(10px);\n            border-radius: 20px;\n            padding: 30px;\n            box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);\n            border: 1px solid rgba(255, 255, 255, 0.2);\n        }\n\n        .section-title {\n            font-size: 1.5rem;\n            font-weight: 600;\n            margin-bottom: 20px;\n            color: #2c3e50;\n            display: flex;\n            align-items: center;\n            gap: 10px;\n        }\n\n        .alert {\n            background: #fff;\n            border-radius: 15px;\n            padding: 20px;\n            margin-bottom: 15px;\n            border-left: 4px solid;\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08);\n            transition: all 0.3s ease;\n        }\n\n        .alert:hover {\n            transform: translateX(5px);\n            box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);\n        }\n\n        .alert.critical { border-left-color: #e74c3c; }\n        .alert.warning { border-left-color: #f39c12; }\n        .alert.resolved { border-left-color: #27ae60; }\n\n        .alert-header {\n            display: flex;\n            justify-content: between;\n            align-items: center;\n            margin-bottom: 10px;\n        }\n\n        .alert-time {\n            font-size: 0.85rem;\n            color: #666;\n            background: #f8f9fa;\n            padding: 4px 12px;\n            border-radius: 20px;\n        }\n\n        .alert-type {\n            font-weight: 600;\n            font-size: 1rem;\n        }\n\n        .alert-detail {\n            color: #555;\n            font-size: 0.95rem;\n            margin-top: 8px;\n        }\n\n        .action-btn {\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            color: white;\n            border: none;\n            padding: 12px 25px;\n            border-radius: 25px;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all 0.3s ease;\n            margin: 5px;\n            font-size: 0.9rem;\n        }\n\n        .action-btn:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 10px 20px rgba(102, 126, 234, 0.3);\n        }\n\n        .service-item {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            padding: 15px;\n            background: #fff;\n            border-radius: 12px;\n            margin-bottom: 12px;\n            box-shadow: 0 3px 10px rgba(0, 0, 0, 0.05);\n        }\n\n        .service-name {\n            font-weight: 600;\n            color: #2c3e50;\n        }\n\n        .status-badge {\n            padding: 6px 15px;\n            border-radius: 20px;\n            font-size: 0.8rem;\n            font-weight: 600;\n            text-transform: uppercase;\n        }\n\n        .status-healthy {\n            background: #d5f4e6;\n            color: #27ae60;\n        }\n\n        .status-warning {\n            background: #fef9e7;\n            color: #f39c12;\n        }\n\n        .status-error {\n            background: #fadbd8;\n            color: #e74c3c;\n        }\n\n        .footer-section {\n            background: rgba(255, 255, 255, 0.95);\n            backdrop-filter: blur(10px);\n            border-radius: 20px;\n            padding: 30px;\n            text-align: center;\n            box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);\n            border: 1px solid rgba(255, 255, 255, 0.2);\n        }\n\n        .slack-integration {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 15px;\n            margin-bottom: 20px;\n        }\n\n        .slack-icon {\n            width: 40px;\n            height: 40px;\n            background: #4a154b;\n            border-radius: 10px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            color: white;\n            font-weight: bold;\n        }\n\n        .pulse {\n            animation: pulse 2s infinite;\n        }\n\n        @keyframes pulse {\n            0% {\n                transform: scale(1);\n            }\n            50% {\n                transform: scale(1.05);\n            }\n            100% {\n                transform: scale(1);\n            }\n        }\n\n        .loading-indicator {\n            display: inline-block;\n            width: 12px;\n            height: 12px;\n            border: 2px solid #f3f3f3;\n            border-top: 2px solid #667eea;\n            border-radius: 50%;\n            animation: spin 1s linear infinite;\n        }\n\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n\n        @media (max-width: 768px) {\n            .main-grid {\n                grid-template-columns: 1fr;\n            }\n            \n            .header h1 {\n                font-size: 2rem;\n            }\n            \n            .container {\n                padding: 15px;\n            }\n        }\n    &lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;div class=\"container\"&gt;\n        &lt;!-- Header --&gt;\n        &lt;div class=\"header\"&gt;\n            &lt;h1&gt;\ud83e\udd16 ChatSupportBot Dashboard&lt;\/h1&gt;\n            &lt;p&gt;Monitor AWS services and execute operations directly from Slack. Streamline your DevOps workflow with automated alerts, quick fixes, and seamless collaboration.&lt;\/p&gt;\n        &lt;\/div&gt;\n\n        &lt;!-- Statistics Grid --&gt;\n        &lt;div class=\"stats-grid\"&gt;\n            &lt;div class=\"stat-card\"&gt;\n                &lt;div class=\"stat-number healthy\" id=\"healthyServices\"&gt;12&lt;\/div&gt;\n                &lt;div class=\"stat-label\"&gt;Healthy Services&lt;\/div&gt;\n            &lt;\/div&gt;\n            &lt;div class=\"stat-card\"&gt;\n                &lt;div class=\"stat-number warning\" id=\"warningAlerts\"&gt;3&lt;\/div&gt;\n                &lt;div class=\"stat-label\"&gt;Active Warnings&lt;\/div&gt;\n            &lt;\/div&gt;\n            &lt;div class=\"stat-card\"&gt;\n                &lt;div class=\"stat-number critical\" id=\"criticalAlerts\"&gt;1&lt;\/div&gt;\n                &lt;div class=\"stat-label\"&gt;Critical Issues&lt;\/div&gt;\n            &lt;\/div&gt;\n            &lt;div class=\"stat-card\"&gt;\n                &lt;div class=\"stat-number info\" id=\"automatedActions\"&gt;47&lt;\/div&gt;\n                &lt;div class=\"stat-label\"&gt;Actions Today&lt;\/div&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n\n        &lt;!-- Main Content Grid --&gt;\n        &lt;div class=\"main-grid\"&gt;\n            &lt;!-- Alerts Section --&gt;\n            &lt;div class=\"alerts-section\"&gt;\n                &lt;h2 class=\"section-title\"&gt;\n                    \ud83d\udea8 Recent Alerts\n                    &lt;span class=\"loading-indicator\"&gt;&lt;\/span&gt;\n                &lt;\/h2&gt;\n                &lt;div id=\"alerts\"&gt;&lt;\/div&gt;\n            &lt;\/div&gt;\n\n            &lt;!-- Quick Actions Section --&gt;\n            &lt;div class=\"actions-section\"&gt;\n                &lt;h2 class=\"section-title\"&gt;\u26a1 Quick Actions&lt;\/h2&gt;\n                &lt;button class=\"action-btn\" onclick=\"restartLambda()\"&gt;Restart Lambda Function&lt;\/button&gt;\n                &lt;button class=\"action-btn\" onclick=\"checkLogs()\"&gt;View CloudWatch Logs&lt;\/button&gt;\n                &lt;button class=\"action-btn\" onclick=\"scaleService()\"&gt;Scale ECS Service&lt;\/button&gt;\n                &lt;button class=\"action-btn\" onclick=\"runHealthCheck()\"&gt;Run Health Check&lt;\/button&gt;\n                &lt;button class=\"action-btn\" onclick=\"clearCache()\"&gt;Clear CloudFront Cache&lt;\/button&gt;\n                &lt;button class=\"action-btn\" onclick=\"deployRollback()\"&gt;Rollback Deployment&lt;\/button&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n\n        &lt;!-- Services Status Section --&gt;\n        &lt;div class=\"services-section\"&gt;\n            &lt;h2 class=\"section-title\"&gt;\ud83d\udd27 Service Status&lt;\/h2&gt;\n            &lt;div id=\"services\"&gt;&lt;\/div&gt;\n        &lt;\/div&gt;\n\n        &lt;!-- Slack Integration Footer --&gt;\n        &lt;div class=\"footer-section\"&gt;\n            &lt;div class=\"slack-integration\"&gt;\n                &lt;div class=\"slack-icon pulse\"&gt;S&lt;\/div&gt;\n                &lt;div&gt;\n                    &lt;h3&gt;Slack Integration Active&lt;\/h3&gt;\n                    &lt;p&gt;Connected to #aws-alerts \u2022 Last sync: &lt;span id=\"lastSync\"&gt;2 minutes ago&lt;\/span&gt;&lt;\/p&gt;\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n            &lt;p style=\"color: #666; margin-top: 20px;\"&gt;\n                Built with \u2764\ufe0f using AWS CloudFormation \u2022 S3 + CloudFront \u2022 Operational Excellence\n            &lt;\/p&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n\n    &lt;script&gt;\n        \/\/ Sample data - in a real implementation, this would come from your AWS APIs\n        const alerts = &#91;\n            {\n                time: \"2025-07-21 14:23\",\n                type: \"Lambda Error\",\n                detail: \"Function execution failed - Memory limit exceeded in user-auth-service\",\n                severity: \"critical\",\n                service: \"Lambda\"\n            },\n            {\n                time: \"2025-07-21 14:18\",\n                type: \"Auto-Recovery\",\n                detail: \"ECS service scaled up from 2 to 4 instances due to high CPU utilization\",\n                severity: \"resolved\",\n                service: \"ECS\"\n            },\n            {\n                time: \"2025-07-21 14:15\",\n                type: \"CloudWatch Alarm\",\n                detail: \"RDS connection pool reaching 80% capacity - monitoring closely\",\n                severity: \"warning\",\n                service: \"RDS\"\n            },\n            {\n                time: \"2025-07-21 14:10\",\n                type: \"Deployment Success\",\n                detail: \"Frontend deployment v2.3.1 completed successfully via Slack command\",\n                severity: \"resolved\",\n                service: \"S3\/CloudFront\"\n            },\n            {\n                time: \"2025-07-21 14:05\",\n                type: \"API Gateway\",\n                detail: \"Increased latency detected on \/api\/users endpoint - investigating\",\n                severity: \"warning\",\n                service: \"API Gateway\"\n            }\n        ];\n\n        const services = &#91;\n            { name: \"Lambda Functions\", status: \"warning\", count: \"8\/9 healthy\" },\n            { name: \"ECS Services\", status: \"healthy\", count: \"4\/4 running\" },\n            { name: \"RDS Instances\", status: \"healthy\", count: \"2\/2 available\" },\n            { name: \"API Gateway\", status: \"warning\", count: \"High latency\" },\n            { name: \"CloudFront CDN\", status: \"healthy\", count: \"Global edge\" },\n            { name: \"S3 Buckets\", status: \"healthy\", count: \"12 buckets\" },\n            { name: \"SNS Topics\", status: \"healthy\", count: \"5 active\" },\n            { name: \"SQS Queues\", status: \"healthy\", count: \"3 processing\" }\n        ];\n\n        \/\/ Populate alerts\n        function renderAlerts() {\n            const container = document.getElementById(\"alerts\");\n            container.innerHTML = \"\";\n            \n            alerts.forEach(alert =&gt; {\n                const div = document.createElement(\"div\");\n                div.className = `alert ${alert.severity}`;\n                div.innerHTML = `\n                    &lt;div class=\"alert-header\"&gt;\n                        &lt;div class=\"alert-type\"&gt;${alert.type}&lt;\/div&gt;\n                        &lt;div class=\"alert-time\"&gt;${alert.time}&lt;\/div&gt;\n                    &lt;\/div&gt;\n                    &lt;div class=\"alert-detail\"&gt;${alert.detail}&lt;\/div&gt;\n                `;\n                container.appendChild(div);\n            });\n        }\n\n        \/\/ Populate services\n        function renderServices() {\n            const container = document.getElementById(\"services\");\n            container.innerHTML = \"\";\n            \n            services.forEach(service =&gt; {\n                const div = document.createElement(\"div\");\n                div.className = \"service-item\";\n                div.innerHTML = `\n                    &lt;div class=\"service-name\"&gt;${service.name}&lt;\/div&gt;\n                    &lt;div&gt;\n                        &lt;span class=\"status-badge status-${service.status}\"&gt;${service.status}&lt;\/span&gt;\n                        &lt;small style=\"margin-left: 10px; color: #666;\"&gt;${service.count}&lt;\/small&gt;\n                    &lt;\/div&gt;\n                `;\n                container.appendChild(div);\n            });\n        }\n\n        \/\/ Action button handlers\n        function restartLambda() {\n            showActionFeedback(\"Lambda function restart initiated via Slack...\");\n        }\n\n        function checkLogs() {\n            showActionFeedback(\"Opening CloudWatch logs in Slack thread...\");\n        }\n\n        function scaleService() {\n            showActionFeedback(\"ECS service scaling command sent to Slack...\");\n        }\n\n        function runHealthCheck() {\n            showActionFeedback(\"Health check initiated across all services...\");\n        }\n\n        function clearCache() {\n            showActionFeedback(\"CloudFront cache invalidation started...\");\n        }\n\n        function deployRollback() {\n            showActionFeedback(\"Deployment rollback initiated via ChatSupport...\");\n        }\n\n        function showActionFeedback(message) {\n            \/\/ Create a temporary feedback alert\n            const alertsContainer = document.getElementById(\"alerts\");\n            const feedbackAlert = document.createElement(\"div\");\n            feedbackAlert.className = \"alert resolved\";\n            feedbackAlert.style.opacity = \"0\";\n            feedbackAlert.style.transform = \"translateY(-20px)\";\n            feedbackAlert.innerHTML = `\n                &lt;div class=\"alert-header\"&gt;\n                    &lt;div class=\"alert-type\"&gt;Action Executed&lt;\/div&gt;\n                    &lt;div class=\"alert-time\"&gt;Just now&lt;\/div&gt;\n                &lt;\/div&gt;\n                &lt;div class=\"alert-detail\"&gt;${message}&lt;\/div&gt;\n            `;\n            \n            alertsContainer.insertBefore(feedbackAlert, alertsContainer.firstChild);\n            \n            \/\/ Animate in\n            setTimeout(() =&gt; {\n                feedbackAlert.style.transition = \"all 0.3s ease\";\n                feedbackAlert.style.opacity = \"1\";\n                feedbackAlert.style.transform = \"translateY(0)\";\n            }, 100);\n            \n            \/\/ Remove after 5 seconds\n            setTimeout(() =&gt; {\n                feedbackAlert.style.opacity = \"0\";\n                feedbackAlert.style.transform = \"translateY(-20px)\";\n                setTimeout(() =&gt; feedbackAlert.remove(), 300);\n            }, 5000);\n        }\n\n        \/\/ Update stats periodically\n        function updateStats() {\n            const stats = {\n                healthy: Math.floor(Math.random() * 3) + 11,\n                warnings: Math.floor(Math.random() * 3) + 2,\n                critical: Math.floor(Math.random() * 2) + 1,\n                actions: Math.floor(Math.random() * 10) + 45\n            };\n            \n            document.getElementById(\"healthyServices\").textContent = stats.healthy;\n            document.getElementById(\"warningAlerts\").textContent = stats.warnings;\n            document.getElementById(\"criticalAlerts\").textContent = stats.critical;\n            document.getElementById(\"automatedActions\").textContent = stats.actions;\n        }\n\n        \/\/ Update last sync time\n        function updateSyncTime() {\n            const minutes = Math.floor(Math.random() * 5) + 1;\n            document.getElementById(\"lastSync\").textContent = `${minutes} minutes ago`;\n        }\n\n        \/\/ Initialize\n        renderAlerts();\n        renderServices();\n        \n        \/\/ Update stats every 30 seconds\n        setInterval(updateStats, 30000);\n        setInterval(updateSyncTime, 60000);\n        \n        console.log(\"\ud83e\udd16 ChatSupportBot Dashboard loaded successfully!\");\n        console.log(\"This dashboard demonstrates AWS operational excellence through:\");\n        console.log(\"\u2022 Real-time monitoring and alerting\");\n        console.log(\"\u2022 Slack-integrated quick actions\");\n        console.log(\"\u2022 Infrastructure as Code deployment\");\n        console.log(\"\u2022 Automated response capabilities\");\n    &lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Click <strong>Upload &gt; Add Files<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1069\" height=\"817\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-37.png\" alt=\"\" class=\"wp-image-3068\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-37.png 1069w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-37-300x229.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-37-1024x783.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-37-768x587.png 768w\" sizes=\"auto, (max-width: 1069px) 100vw, 1069px\" \/><\/figure>\n\n\n\n<p>Once the upload is complete, go back to CloudFormation console and click the <strong>DashboardURL<\/strong> from the <strong>Outputs<\/strong> tab<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1069\" height=\"413\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-38.png\" alt=\"\" class=\"wp-image-3072\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-38.png 1069w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-38-300x116.png 300w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-38-1024x396.png 1024w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-38-768x297.png 768w\" sizes=\"auto, (max-width: 1069px) 100vw, 1069px\" \/><\/figure>\n\n\n\n<p>Then we shall see something like below<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1069\" height=\"1821\" src=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-40.png\" alt=\"\" class=\"wp-image-3074\" srcset=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-40.png 1069w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-40-176x300.png 176w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-40-601x1024.png 601w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-40-768x1308.png 768w, https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/03\/image-40-902x1536.png 902w\" sizes=\"auto, (max-width: 1069px) 100vw, 1069px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Project Conclusion<\/h2>\n\n\n\n<p>This project demonstrates how AWS can be used as part of the operational via tools like Slack \/ Teams and how AWS services can be integrated with its full functionalities in real-time scenarios.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Resource Clean-up<\/h2>\n\n\n\n<p>To avoid ongoing AWS charges, remember to delete what you created:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Chatbot Setup<\/strong>\n<ul class=\"wp-block-list\">\n<li>Go to <strong>AWS Chatbot<\/strong>, remove the Slack channel configuration<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>IAM Role<\/strong>\n<ul class=\"wp-block-list\">\n<li>Head to <strong>IAM &gt; Roles<\/strong>, find the <strong>awschatbot-role<\/strong> and delete it<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Cloudwatch<\/strong>\n<ul class=\"wp-block-list\">\n<li>Delete <strong>HighCPUAlert<\/strong> alarms<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>EC2<\/strong>\n<ul class=\"wp-block-list\">\n<li>Terminate our EC2 instance which was used for the stress test<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Lambda Functions<\/strong>\n<ul class=\"wp-block-list\">\n<li>Delete the <strong>RestartLambdaFn<\/strong> functions we created<\/li>\n\n\n\n<li>Also visit CloudWatch and clean up log groups in CloudWatch Logs (i.e: <strong>\/aws\/chatbot\/ChatSupport<\/strong>)<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Frontend Dashboard<\/strong>\n<ul class=\"wp-block-list\">\n<li>Empty and delete the <strong>S3 bucket<\/strong><\/li>\n\n\n\n<li>Disable and delete the <strong>CloudFront distribution<\/strong><br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>S3 &amp; CloudFormation Stack<\/strong>\n<ul class=\"wp-block-list\">\n<li>Go to S3 console, and empty the S3 bucket that was used to host the static index.html file<\/li>\n\n\n\n<li>If you used a stack to deploy resources, go to <strong>CloudFormation<\/strong> and delete it<\/li>\n\n\n\n<li>The stack deletion will also remove everything it has setup on CloudFront and S3<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this final part, we will build a monitoring dashboard for the Chat Support team which is already using the Slack workspace as part of the daily operation. CloudFront will be used as the Infrastructure as Code (IaC) which help the consistent setup with easy rollback and update.<\/p>\n","protected":false},"author":1,"featured_media":3108,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,20,85,75,8],"tags":[],"class_list":["post-3042","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aws","category-backend","category-projects","category-system-design","category-technology"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4 - Ichwan Chandra<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4 - Ichwan Chandra\" \/>\n<meta property=\"og:description\" content=\"In this final part, we will build a monitoring dashboard for the Chat Support team which is already using the Slack workspace as part of the daily operation. CloudFront will be used as the Infrastructure as Code (IaC) which help the consistent setup with easy rollback and update.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/\" \/>\n<meta property=\"og:site_name\" content=\"Ichwan Chandra\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-20T07:16:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-26T06:14:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/09\/aws-solutions-architect-project-operational-excellence-part-4.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1376\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ichwan Chandra\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ichwan Chandra\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/\"},\"author\":{\"name\":\"Ichwan Chandra\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#\\\/schema\\\/person\\\/2fa69a7a1008a3369584752194b063d5\"},\"headline\":\"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4\",\"datePublished\":\"2026-03-20T07:16:00+00:00\",\"dateModified\":\"2026-09-26T06:14:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/\"},\"wordCount\":427,\"image\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/aws-solutions-architect-project-operational-excellence-part-4.jpeg\",\"articleSection\":[\"AWS\",\"Backend\",\"Projects\",\"System Design\",\"Technology\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/\",\"url\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/\",\"name\":\"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4 - Ichwan Chandra\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/aws-solutions-architect-project-operational-excellence-part-4.jpeg\",\"datePublished\":\"2026-03-20T07:16:00+00:00\",\"dateModified\":\"2026-09-26T06:14:28+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#\\\/schema\\\/person\\\/2fa69a7a1008a3369584752194b063d5\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/aws-solutions-architect-project-operational-excellence-part-4.jpeg\",\"contentUrl\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/aws-solutions-architect-project-operational-excellence-part-4.jpeg\",\"width\":1376,\"height\":768},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/aws-solutions-architect-project-operational-excellence-part-4\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/\",\"name\":\"Ichwan Chandra\",\"description\":\"In a lifelong learning mode\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/#\\\/schema\\\/person\\\/2fa69a7a1008a3369584752194b063d5\",\"name\":\"Ichwan Chandra\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g\",\"caption\":\"Ichwan Chandra\"},\"sameAs\":[\"https:\\\/\\\/ichwanchandra.com\\\/blog\"],\"url\":\"https:\\\/\\\/ichwanchandra.com\\\/blog\\\/author\\\/isuchan193\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4 - Ichwan Chandra","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/","og_locale":"en_US","og_type":"article","og_title":"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4 - Ichwan Chandra","og_description":"In this final part, we will build a monitoring dashboard for the Chat Support team which is already using the Slack workspace as part of the daily operation. CloudFront will be used as the Infrastructure as Code (IaC) which help the consistent setup with easy rollback and update.","og_url":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/","og_site_name":"Ichwan Chandra","article_published_time":"2026-03-20T07:16:00+00:00","article_modified_time":"2026-09-26T06:14:28+00:00","og_image":[{"width":1376,"height":768,"url":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/09\/aws-solutions-architect-project-operational-excellence-part-4.jpeg","type":"image\/jpeg"}],"author":"Ichwan Chandra","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ichwan Chandra","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/#article","isPartOf":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/"},"author":{"name":"Ichwan Chandra","@id":"https:\/\/ichwanchandra.com\/blog\/#\/schema\/person\/2fa69a7a1008a3369584752194b063d5"},"headline":"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4","datePublished":"2026-03-20T07:16:00+00:00","dateModified":"2026-09-26T06:14:28+00:00","mainEntityOfPage":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/"},"wordCount":427,"image":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/#primaryimage"},"thumbnailUrl":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/09\/aws-solutions-architect-project-operational-excellence-part-4.jpeg","articleSection":["AWS","Backend","Projects","System Design","Technology"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/","url":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/","name":"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4 - Ichwan Chandra","isPartOf":{"@id":"https:\/\/ichwanchandra.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/#primaryimage"},"image":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/#primaryimage"},"thumbnailUrl":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/09\/aws-solutions-architect-project-operational-excellence-part-4.jpeg","datePublished":"2026-03-20T07:16:00+00:00","dateModified":"2026-09-26T06:14:28+00:00","author":{"@id":"https:\/\/ichwanchandra.com\/blog\/#\/schema\/person\/2fa69a7a1008a3369584752194b063d5"},"breadcrumb":{"@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/#primaryimage","url":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/09\/aws-solutions-architect-project-operational-excellence-part-4.jpeg","contentUrl":"https:\/\/ichwanchandra.com\/blog\/wp-content\/uploads\/2026\/09\/aws-solutions-architect-project-operational-excellence-part-4.jpeg","width":1376,"height":768},{"@type":"BreadcrumbList","@id":"https:\/\/ichwanchandra.com\/blog\/aws-solutions-architect-project-operational-excellence-part-4\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ichwanchandra.com\/blog\/"},{"@type":"ListItem","position":2,"name":"AWS Solutions Architect Project (Operational Excellence Pillar) \u2013 Real-time Operation \u2013 Part 4"}]},{"@type":"WebSite","@id":"https:\/\/ichwanchandra.com\/blog\/#website","url":"https:\/\/ichwanchandra.com\/blog\/","name":"Ichwan Chandra","description":"In a lifelong learning mode","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ichwanchandra.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/ichwanchandra.com\/blog\/#\/schema\/person\/2fa69a7a1008a3369584752194b063d5","name":"Ichwan Chandra","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8d8d64c76e361108ee058442df7c49c539eefd1d1e5a3e8dbcc9d70289e0bbf2?s=96&d=retro&r=g","caption":"Ichwan Chandra"},"sameAs":["https:\/\/ichwanchandra.com\/blog"],"url":"https:\/\/ichwanchandra.com\/blog\/author\/isuchan193\/"}]}},"_links":{"self":[{"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/posts\/3042","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/comments?post=3042"}],"version-history":[{"count":24,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/posts\/3042\/revisions"}],"predecessor-version":[{"id":3287,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/posts\/3042\/revisions\/3287"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/media\/3108"}],"wp:attachment":[{"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/media?parent=3042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/categories?post=3042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ichwanchandra.com\/blog\/wp-json\/wp\/v2\/tags?post=3042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}