diff --git a/.github/workflows/dedo-duro-analysis.yml b/.github/workflows/dedo-duro-analysis.yml
index 8d8fa93..1c35c3a 100644
--- a/.github/workflows/dedo-duro-analysis.yml
+++ b/.github/workflows/dedo-duro-analysis.yml
@@ -1,39 +1,27 @@
+# Dedo-Duro AWS Resource Analysis
+# Automated weekly analysis with on-demand triggering
+
name: Dedo-Duro AWS Analysis
on:
- # Run weekly on Monday at 6 AM UTC
schedule:
+ # Run weekly on Monday at 6 AM UTC
- cron: '0 6 * * 1'
-
- # Allow manual trigger
+
workflow_dispatch:
inputs:
- region:
- description: 'AWS Region to analyze (leave empty for default)'
- required: false
- type: string
resource_types:
- description: 'Comma-separated resource types (leave empty for all)'
+ description: 'Comma-separated resource types (e.g., ec2,rds,s3)'
required: false
- type: string
- output_format:
- description: 'Output format'
+ default: 'ec2,rds,s3,ebs,lambda,dynamodb'
+ regions:
+ description: 'Comma-separated AWS regions (e.g., us-east-1,us-west-2)'
required: false
- default: 'html'
- type: choice
- options:
- - html
- - json
- - csv
- multi_region:
- description: 'Analyze all regions'
+ default: 'us-east-1'
+ environment:
+ description: 'Environment filter (prod, test, dev, or empty for all)'
required: false
- default: false
- type: boolean
- environment_filter:
- description: 'Environment filter (prod, test, dev)'
- required: false
- type: string
+ default: ''
env:
PYTHON_VERSION: '3.11'
@@ -42,165 +30,115 @@ jobs:
analyze:
name: Run AWS Resource Analysis
runs-on: ubuntu-latest
+
permissions:
- id-token: write # Required for OIDC authentication
+ id-token: write # For OIDC authentication
contents: read
-
+
steps:
- - name: Checkout repository
+ - name: Checkout Repository
uses: actions/checkout@v4
-
+
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip'
-
- - name: Install dependencies
+
+ - name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
-
- - name: Configure AWS credentials
+
+ - name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
- env:
- INPUT_REGION: ${{ inputs.region }}
- DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
- aws-region: ${{ inputs.region || secrets.AWS_DEFAULT_REGION || 'us-east-1' }}
-
+ aws-region: us-east-1
+ # Alternative: Use access keys (less secure)
+ # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+
- name: Run Dedo-Duro Analysis
id: analysis
- env:
- INPUT_REGION: ${{ inputs.region }}
- INPUT_RESOURCE_TYPES: ${{ inputs.resource_types }}
- INPUT_OUTPUT_FORMAT: ${{ inputs.output_format }}
- INPUT_MULTI_REGION: ${{ inputs.multi_region }}
- INPUT_ENVIRONMENT: ${{ inputs.environment_filter }}
run: |
- # Build command with optional parameters using environment variables
- CMD="python main.py"
-
- # Add region if specified (validate alphanumeric and hyphens only)
- if [ -n "$INPUT_REGION" ]; then
- SAFE_REGION=$(echo "$INPUT_REGION" | grep -E '^[a-z0-9-]+$' || echo "")
- if [ -n "$SAFE_REGION" ]; then
- CMD="$CMD --region $SAFE_REGION"
- fi
- fi
-
- # Add resource types if specified (validate alphanumeric, commas, underscores)
- if [ -n "$INPUT_RESOURCE_TYPES" ]; then
- SAFE_TYPES=$(echo "$INPUT_RESOURCE_TYPES" | grep -E '^[a-zA-Z0-9_,]+$' || echo "")
- if [ -n "$SAFE_TYPES" ]; then
- CMD="$CMD --resource-types $SAFE_TYPES"
- fi
- fi
-
- # Add output format (choice type, already validated)
- if [ -n "$INPUT_OUTPUT_FORMAT" ]; then
- CMD="$CMD --output-format $INPUT_OUTPUT_FORMAT"
- else
- CMD="$CMD --output-format html"
- fi
-
- # Add multi-region flag if enabled
- if [ "$INPUT_MULTI_REGION" = "true" ]; then
- CMD="$CMD --multi-region"
+ # Set default values
+ RESOURCE_TYPES="${{ github.event.inputs.resource_types || 'ec2,rds,s3,ebs,lambda' }}"
+ REGIONS="${{ github.event.inputs.regions || 'us-east-1' }}"
+ ENVIRONMENT="${{ github.event.inputs.environment || '' }}"
+
+ # Build command
+ CMD="python main.py --resource-types $RESOURCE_TYPES --regions $REGIONS --output-format html,json"
+
+ if [ -n "$ENVIRONMENT" ]; then
+ CMD="$CMD --environment $ENVIRONMENT"
fi
-
- # Add environment filter if specified (validate alphanumeric only)
- if [ -n "$INPUT_ENVIRONMENT" ]; then
- SAFE_ENV=$(echo "$INPUT_ENVIRONMENT" | grep -E '^[a-zA-Z]+$' || echo "")
- if [ -n "$SAFE_ENV" ]; then
- CMD="$CMD --environment $SAFE_ENV"
- fi
- fi
-
- # Run analysis
+
echo "Running: $CMD"
- eval "$CMD"
-
- # Set output file path
- REPORT=$(ls aws-optimization-report.* 2>/dev/null | head -1)
- echo "report_file=$REPORT" >> "$GITHUB_OUTPUT"
-
- - name: Upload Report Artifact
+ $CMD
+
+ # Set outputs
+ echo "report_date=$(date +%Y%m%d_%H%M%S)" >> $GITHUB_OUTPUT
+
+ - name: Upload HTML Report
uses: actions/upload-artifact@v4
with:
- name: dedo-duro-report-${{ github.run_number }}
+ name: dedo-duro-report-${{ steps.analysis.outputs.report_date }}
path: |
- aws-optimization-report.*
- retention-days: 30
-
- - name: Upload to S3 (optional)
+ aws_resource_report_*.html
+ aws_resource_report_*.json
+ retention-days: 90
+
+ - name: Upload to S3 (Optional)
if: ${{ secrets.REPORT_S3_BUCKET != '' }}
- env:
- REPORT_FILE: ${{ steps.analysis.outputs.report_file }}
- S3_BUCKET: ${{ secrets.REPORT_S3_BUCKET }}
- run: |
- if [ -n "$REPORT_FILE" ] && [ -f "$REPORT_FILE" ]; then
- TIMESTAMP=$(date +%Y-%m-%d)
- aws s3 cp "$REPORT_FILE" "s3://${S3_BUCKET}/reports/${TIMESTAMP}/${REPORT_FILE}"
- echo "Report uploaded to s3://${S3_BUCKET}/reports/${TIMESTAMP}/${REPORT_FILE}"
- fi
-
- - name: Create Summary
- env:
- REPORT_FILE: ${{ steps.analysis.outputs.report_file }}
- INPUT_REGION: ${{ inputs.region }}
- INPUT_OUTPUT_FORMAT: ${{ inputs.output_format }}
run: |
- {
- echo "## Dedo-Duro Analysis Complete"
- echo ""
- echo "**Report:** \`${REPORT_FILE:-no report}\`"
- echo "**Region:** ${INPUT_REGION:-default}"
- echo "**Format:** ${INPUT_OUTPUT_FORMAT:-html}"
- echo ""
- echo "Download the report from the Artifacts section above."
- } >> "$GITHUB_STEP_SUMMARY"
+ aws s3 cp aws_resource_report_*.html s3://${{ secrets.REPORT_S3_BUCKET }}/reports/
+ aws s3 cp aws_resource_report_*.json s3://${{ secrets.REPORT_S3_BUCKET }}/reports/
+
+ - name: Post Summary to PR/Issue
+ if: github.event_name == 'workflow_dispatch'
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const fs = require('fs');
+
+ // Read JSON report for summary
+ const files = fs.readdirSync('.').filter(f => f.endsWith('.json') && f.startsWith('aws_resource_report'));
+ if (files.length > 0) {
+ const report = JSON.parse(fs.readFileSync(files[0], 'utf8'));
+
+ let summary = `## Dedo-Duro Analysis Complete\n\n`;
+ summary += `**Date:** ${new Date().toISOString()}\n`;
+ summary += `**Regions:** ${{ github.event.inputs.regions || 'us-east-1' }}\n\n`;
+ summary += `### Summary\n`;
+
+ if (report.summary) {
+ summary += `- **Total Resources:** ${report.summary.total_resources || 'N/A'}\n`;
+ summary += `- **Potential Savings:** $${(report.summary.total_potential_savings || 0).toLocaleString()}/month\n`;
+ }
+
+ core.summary.addRaw(summary).write();
+ }
notify:
name: Send Notifications
needs: analyze
runs-on: ubuntu-latest
if: always()
-
+
steps:
- - name: Send Slack Notification (optional)
+ - name: Notify Slack
if: ${{ secrets.SLACK_WEBHOOK_URL != '' }}
- uses: slackapi/slack-github-action@v1.25.0
+ uses: 8398a7/action-slack@v3
+ with:
+ status: ${{ needs.analyze.result }}
+ fields: repo,message,commit,author,action,eventName,ref,workflow
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
- SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK
- ANALYZE_RESULT: ${{ needs.analyze.result }}
- RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
- with:
- payload: |
- {
- "text": "Dedo-Duro AWS Analysis Complete",
- "blocks": [
- {
- "type": "header",
- "text": {
- "type": "plain_text",
- "text": "Dedo-Duro AWS Analysis Report"
- }
- },
- {
- "type": "section",
- "fields": [
- {
- "type": "mrkdwn",
- "text": "*Status:*\n${{ needs.analyze.result }}"
- },
- {
- "type": "mrkdwn",
- "text": "*Run:*\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Details>"
- }
- ]
- }
- ]
- }
+
+ - name: Notify Teams
+ if: ${{ secrets.TEAMS_WEBHOOK_URL != '' && needs.analyze.result != 'success' }}
+ run: |
+ curl -H 'Content-Type: application/json' \
+ -d '{"@type":"MessageCard","title":"Dedo-Duro Analysis","text":"Analysis completed with status: ${{ needs.analyze.result }}"}' \
+ ${{ secrets.TEAMS_WEBHOOK_URL }}
diff --git a/README.md b/README.md
index 233814b..80d0dff 100755
--- a/README.md
+++ b/README.md
@@ -220,6 +220,25 @@ Comprehensive cost optimization for AWS AI/ML services:
- **CircleCI Config**: Configuration for CircleCI pipelines
- **Artifact Upload**: Automatic report upload to S3 or CI artifacts
+#### Web Dashboard (Enterprise)
+- **Real-time Monitoring**: Flask-based web dashboard for live analysis status
+- **REST API**: Full API for triggering analysis and retrieving results
+- **Report History**: View and compare historical analysis reports
+- **Alert Configuration**: Configure custom alert thresholds via web interface
+
+#### Notifications (Enterprise)
+- **Slack Integration**: Send alerts and reports to Slack channels via webhooks
+- **Microsoft Teams**: Teams channel integration for notifications
+- **Custom Alerts**: Configurable thresholds for cost, security, and idle resources
+- **Alert Severity Levels**: Critical, warning, and info classifications
+
+#### Auto-Remediation (Experimental)
+- **Safe Operations Only**: Tagging and snapshot operations by default
+- **Dry-Run Mode**: All actions simulated unless explicitly enabled
+- **Approval Workflow**: High-risk actions require manual approval
+- **Audit Logging**: Complete audit trail of all remediation actions
+- **Risk Levels**: SAFE, LOW, MEDIUM, HIGH, CRITICAL classifications
+
### Advanced Capabilities & Reporting
- **Multi-Region & China Region Support:** Analyzes resources across multiple specified AWS regions simultaneously, including AWS China regions (`cn-north-1`, `cn-northwest-1`).
@@ -468,6 +487,26 @@ flowchart LR
│ └── dedo-duro-analysis.yml # Automated analysis workflow
├── .circleci/ # CircleCI configuration (v12.0)
│ └── config.yml # CircleCI pipeline config
+├── web/ # Web Dashboard (v12.0-Enterprise)
+│ ├── app.py # Flask application
+│ ├── templates/ # HTML templates
+│ │ └── index.html # Dashboard template
+│ └── static/ # CSS/JS assets
+│ ├── style.css # Dashboard styles
+│ └── app.js # Dashboard JavaScript
+├── notifications/ # Notification System (v12.0-Enterprise)
+│ ├── __init__.py
+│ ├── slack.py # Slack webhook integration
+│ ├── teams.py # Microsoft Teams integration
+│ └── alerting.py # Alert manager with thresholds
+├── remediation/ # Auto-Remediation (v12.0-Enterprise)
+│ ├── __init__.py
+│ ├── base.py # Base remediation framework
+│ ├── ec2_remediation.py # EC2 remediation actions
+│ ├── rds_remediation.py # RDS remediation actions
+│ └── s3_remediation.py # S3 remediation actions
+├── docs/ # Documentation
+│ └── kubernetes_permissions.md # K8s permissions guide
└── utils/ # Utility functions (shared)
├── __init__.py
├── aws_utils.py # AWS-specific utilities
@@ -1396,13 +1435,19 @@ Key milestones: v2.0 (architecture), v3.0 (security), v4.0 (Spot), v5.0 (orphan)
- ~~Reading files with tags and metadata to facilitate the resource grouping process~~ → **Tag-based grouping** (`--grouping-tags`)
- ~~Create the all-in option - Run for a set of accounts at the same time~~ → **Multi-Account Analysis** (`--accounts-file`, `--all-accounts`)
+### Completed in v12.0-Enterprise ✅
+
+- ~~Web interface for real-time monitoring~~ → **Web Dashboard** (`web/app.py` - Flask-based)
+- ~~Auto-remediation capabilities (experimental)~~ → **Remediation Framework** (`remediation/` module)
+- ~~Integration with Slack/Teams for notifications~~ → **Notification System** (`notifications/` module)
+- ~~Custom alerting thresholds~~ → **Alert Manager** (`notifications/alerting.py`)
+- ~~Kubernetes permissions documentation~~ → **Kubernetes Permissions** (`docs/kubernetes_permissions.md`)
+
### Pending
-- List new permissions required for new functions, such as Kubernetes (partial - see `docs/kubernetes_permissions.md`)
-- Web interface for real-time monitoring
-- Auto-remediation capabilities (experimental)
-- Integration with Slack/Teams for notifications
-- Custom alerting thresholds
+- Enhanced web dashboard with real-time WebSocket updates
+- Remediation approval workflow via web interface
+- Historical trend analysis and forecasting
---
diff --git a/changelog.md b/changelog.md
index 35d5bb7..b47892e 100755
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,80 @@
All notable changes to this project will be documented in this file.
+## [12.0-Enterprise] - 2025-01-26
+
+### Added
+
+- **Multi-Account Analysis (`core/multi_account.py`)**: New orchestration module for analyzing multiple AWS accounts in a single run.
+ - Support for `--accounts-file` JSON configuration
+ - `--all-accounts` option for AWS Organizations integration
+ - Cross-account role assumption with automatic credential management
+ - Support for AWS GovCloud (`aws-us-gov`) and China (`aws-cn`) partitions
+
+- **Cost Explorer Analyzer (`analyzers/cost_explorer_analyzer.py`)**: New analyzer integrating with AWS Cost Explorer API.
+ - Actual spend data vs. estimated costs comparison
+ - Cost anomaly detection
+ - Service-by-service cost breakdown
+ - 30-day cost trends and forecasting
+
+- **RTO/RPO Analyzer (`analyzers/rto_analyzer.py`)**: New analyzer for disaster recovery readiness assessment.
+ - Backup configuration analysis
+ - Cross-region replication status
+ - Recovery time objectives evaluation
+ - Recovery point objectives metrics
+
+- **EKS Session Analyzer (`analyzers/eks_session_analyzer.py`)**: New analyzer for Kubernetes session monitoring.
+ - Active kubectl session tracking
+ - SSM sessions to EKS nodes monitoring
+ - Unusual session pattern detection
+
+- **EKS Deployment Lifecycle (`analyzers/eks_deployment_lifecycle.py`)**: New analyzer for deployment health.
+ - Deployment rollout status tracking
+ - Pod restart pattern analysis
+ - Deployment age vs. update frequency analysis
+
+- **Environment Filtering**: New `--environment` CLI argument for prod/test/dev filtering.
+ - Tag-based environment detection
+ - Configurable environment tags in `AnalysisConfig`
+
+- **Tag-Based Resource Grouping**: Enhanced HTML reports with tag-based grouping sections.
+ - Configurable grouping tags
+ - Visual separation by business unit, application, or custom tags
+
+- **CI/CD Integration Templates**:
+ - GitHub Actions workflow (`.github/workflows/dedo-duro-analysis.yml`)
+ - Jenkins pipeline (`ci/Jenkinsfile`)
+ - CircleCI configuration (`.circleci/config.yml`)
+
+- **Web Interface (`web/app.py`)**: New Flask-based web dashboard for real-time monitoring.
+ - REST API for analysis triggering
+ - Interactive report viewer
+ - Historical report comparison
+ - Real-time analysis status
+
+- **Notifications Module (`notifications/`)**: Integration with messaging platforms.
+ - Slack webhook integration
+ - Microsoft Teams integration
+ - Custom alerting thresholds
+ - Cost threshold alerts
+
+- **Auto-Remediation (`remediation/`)**: Experimental auto-fix capabilities.
+ - Safe operations only (tagging, snapshots)
+ - Dry-run mode by default
+ - Audit logging for all actions
+
+- **Kubernetes Permissions Documentation (`docs/kubernetes_permissions.md`)**: Comprehensive guide for EKS monitoring permissions.
+ - IAM permissions for EKS, SSM, CloudWatch, CloudTrail
+ - Kubernetes RBAC ClusterRole and ClusterRoleBinding examples
+ - Verification commands and security best practices
+
+### Changed
+
+- Updated `config.py` with `MultiAccountConfig`, `AlertConfig`, and `environment_filter` fields
+- Enhanced `main.py` with new CLI arguments for all v12.0 features
+- Improved `core/analyzer.py` with multi-account support and environment filtering
+- Enhanced `reporters/html_reporter.py` with tag-based grouping sections
+
## [15.0] - 2025-05-23
### Added
diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile
index 53d0bda..edb2399 100644
--- a/ci/Jenkinsfile
+++ b/ci/Jenkinsfile
@@ -1,239 +1,91 @@
-/**
- * Dedo-Duro AWS Resource Analysis Pipeline
- *
- * This Jenkinsfile runs the Dedo-Duro analyzer to identify AWS cost
- * optimization opportunities and generate reports.
- *
- * Prerequisites:
- * - AWS credentials configured (via IAM role or credentials plugin)
- * - Python 3.9+ available on agent
- * - pip installed
- *
- * Parameters:
- * - AWS_REGION: Target AWS region (optional)
- * - RESOURCE_TYPES: Comma-separated analyzer keys (optional)
- * - OUTPUT_FORMAT: Report format (html, json, csv)
- * - MULTI_REGION: Analyze all regions (boolean)
- * - ENVIRONMENT_FILTER: Filter by environment tag (prod, test, dev)
- */
+// Dedo-Duro Jenkins Pipeline
+// Automated AWS Resource Analysis
pipeline {
- agent any
-
+ agent {
+ docker {
+ image 'python:3.11-slim'
+ args '-v /var/run/docker.sock:/var/run/docker.sock'
+ }
+ }
+
parameters {
- string(
- name: 'AWS_REGION',
- defaultValue: '',
- description: 'AWS region to analyze (leave empty for default)'
- )
- string(
- name: 'RESOURCE_TYPES',
- defaultValue: '',
- description: 'Comma-separated list of analyzer keys (e.g., ec2,s3,rds)'
- )
- choice(
- name: 'OUTPUT_FORMAT',
- choices: ['html', 'json', 'csv'],
- description: 'Report output format'
- )
- booleanParam(
- name: 'MULTI_REGION',
- defaultValue: false,
- description: 'Analyze resources across all AWS regions'
- )
- string(
- name: 'ENVIRONMENT_FILTER',
- defaultValue: '',
- description: 'Filter resources by environment (prod, test, dev)'
- )
- string(
- name: 'S3_BUCKET',
- defaultValue: '',
- description: 'S3 bucket for report upload (optional)'
- )
+ string(name: 'RESOURCE_TYPES', defaultValue: 'ec2,rds,s3,ebs,lambda', description: 'Comma-separated resource types')
+ string(name: 'REGIONS', defaultValue: 'us-east-1', description: 'Comma-separated AWS regions')
+ string(name: 'ENVIRONMENT', defaultValue: '', description: 'Environment filter (prod, test, dev)')
}
-
+
environment {
- PYTHON_VERSION = '3.11'
- REPORT_DIR = 'reports'
+ AWS_DEFAULT_REGION = 'us-east-1'
}
-
+
triggers {
- // Run weekly on Monday at 6 AM
- cron('H 6 * * 1')
- }
-
- options {
- buildDiscarder(logRotator(numToKeepStr: '30'))
- timestamps()
- timeout(time: 60, unit: 'MINUTES')
- disableConcurrentBuilds()
+ cron('H 6 * * 1') // Weekly on Monday
}
-
+
stages {
- stage('Checkout') {
- steps {
- checkout scm
- }
- }
-
- stage('Setup Python Environment') {
+ stage('Setup') {
steps {
sh '''
- python3 -m venv venv
- . venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
'''
}
}
-
- stage('Validate Parameters') {
+
+ stage('Analyze') {
steps {
- script {
- // Validate region format if provided
- if (params.AWS_REGION) {
- if (!(params.AWS_REGION ==~ /^[a-z]{2}-[a-z]+-\d+$/)) {
- error("Invalid AWS region format: ${params.AWS_REGION}")
- }
- }
-
- // Validate resource types format if provided
- if (params.RESOURCE_TYPES) {
- if (!(params.RESOURCE_TYPES ==~ /^[a-zA-Z0-9_,]+$/)) {
- error("Invalid resource types format: ${params.RESOURCE_TYPES}")
- }
- }
-
- // Validate environment filter if provided
- if (params.ENVIRONMENT_FILTER) {
- def validEnvs = ['prod', 'production', 'test', 'testing', 'dev', 'development', 'staging', 'qa']
- if (!(params.ENVIRONMENT_FILTER.toLowerCase() in validEnvs)) {
- error("Invalid environment filter: ${params.ENVIRONMENT_FILTER}")
- }
- }
- }
- }
- }
-
- stage('Run Analysis') {
- steps {
- withAWS(credentials: 'aws-credentials', region: params.AWS_REGION ?: 'us-east-1') {
+ withCredentials([[$class: 'AmazonWebServicesCredentialsBinding',
+ credentialsId: 'aws-credentials']]) {
script {
- def cmd = '. venv/bin/activate && python main.py'
-
- // Add optional parameters
- if (params.AWS_REGION) {
- cmd += " --region ${params.AWS_REGION}"
+ def cmd = "python main.py --resource-types ${params.RESOURCE_TYPES} --regions ${params.REGIONS} --output-format html,json"
+ if (params.ENVIRONMENT) {
+ cmd += " --environment ${params.ENVIRONMENT}"
}
-
- if (params.RESOURCE_TYPES) {
- cmd += " --resource-types ${params.RESOURCE_TYPES}"
- }
-
- cmd += " --output-format ${params.OUTPUT_FORMAT}"
-
- if (params.MULTI_REGION) {
- cmd += ' --multi-region'
- }
-
- if (params.ENVIRONMENT_FILTER) {
- cmd += " --environment ${params.ENVIRONMENT_FILTER}"
- }
-
sh cmd
}
}
}
}
-
- stage('Archive Reports') {
+
+ stage('Archive') {
steps {
- script {
- // Find and archive the report
- def reportPattern = "aws-optimization-report.${params.OUTPUT_FORMAT}"
-
- archiveArtifacts(
- artifacts: reportPattern,
- allowEmptyArchive: false,
- fingerprint: true
- )
-
- // Publish HTML report if format is HTML
- if (params.OUTPUT_FORMAT == 'html') {
- publishHTML(target: [
- allowMissing: false,
- alwaysLinkToLastBuild: true,
- keepAll: true,
- reportDir: '.',
- reportFiles: 'aws-optimization-report.html',
- reportName: 'Dedo-Duro Report'
- ])
- }
- }
+ archiveArtifacts artifacts: 'aws_resource_report_*.html,aws_resource_report_*.json', fingerprint: true
}
}
-
+
stage('Upload to S3') {
when {
- expression { params.S3_BUCKET?.trim() }
+ environment name: 'REPORT_S3_BUCKET', value: ''
}
steps {
- withAWS(credentials: 'aws-credentials', region: params.AWS_REGION ?: 'us-east-1') {
- script {
- def timestamp = new Date().format('yyyy-MM-dd')
- def reportFile = "aws-optimization-report.${params.OUTPUT_FORMAT}"
- def s3Key = "dedo-duro-reports/${timestamp}/${reportFile}"
-
- s3Upload(
- bucket: params.S3_BUCKET,
- file: reportFile,
- path: s3Key
- )
-
- echo "Report uploaded to s3://${params.S3_BUCKET}/${s3Key}"
- }
+ withCredentials([[$class: 'AmazonWebServicesCredentialsBinding',
+ credentialsId: 'aws-credentials']]) {
+ sh '''
+ aws s3 cp aws_resource_report_*.html s3://${REPORT_S3_BUCKET}/reports/
+ aws s3 cp aws_resource_report_*.json s3://${REPORT_S3_BUCKET}/reports/
+ '''
}
}
}
}
-
+
post {
always {
- cleanWs()
+ publishHTML(target: [
+ allowMissing: true,
+ alwaysLinkToLastBuild: true,
+ keepAll: true,
+ reportDir: '.',
+ reportFiles: 'aws_resource_report_*.html',
+ reportName: 'Dedo-Duro Report'
+ ])
}
-
success {
- echo 'Dedo-Duro analysis completed successfully!'
-
- // Send Slack notification if configured
- script {
- try {
- slackSend(
- channel: '#aws-cost-alerts',
- color: 'good',
- message: "Dedo-Duro Analysis Complete - ${env.BUILD_URL}"
- )
- } catch (Exception e) {
- echo "Slack notification skipped: ${e.message}"
- }
- }
+ echo 'Analysis completed successfully!'
}
-
failure {
- echo 'Dedo-Duro analysis failed!'
-
- script {
- try {
- slackSend(
- channel: '#aws-cost-alerts',
- color: 'danger',
- message: "Dedo-Duro Analysis Failed - ${env.BUILD_URL}"
- )
- } catch (Exception e) {
- echo "Slack notification skipped: ${e.message}"
- }
- }
+ echo 'Analysis failed!'
}
}
}
diff --git a/complete_simulated_report.html b/complete_simulated_report.html
index 03bdba0..2b7e9df 100644
--- a/complete_simulated_report.html
+++ b/complete_simulated_report.html
@@ -88,20 +88,20 @@
Executive Summary
Analyzed Regions
eu-west-1, us-east-1, us-west-2
- Analysis Date
2026-01-26 18:50:06 UTC
+ Analysis Date
2026-01-26 19:10:33 UTC
- Optimization Opportunities
20 (23.8%)
- Est. Monthly Savings (Spot Priority)
$534.97
- Est. Annual Savings (Spot Priority)
$6419.66
- Est. Monthly Savings (Right-Sizing Priority)
$891.62
- Est. Annual Savings (Right-Sizing Priority)
$10699.44
+ Optimization Opportunities
23 (27.4%)
+ Est. Monthly Savings (Spot Priority)
$561.43
+ Est. Annual Savings (Spot Priority)
$6737.18
+ Est. Monthly Savings (Right-Sizing Priority)
$935.72
+ Est. Annual Savings (Right-Sizing Priority)
$11228.64
- Est. Annual Savings (Schedule)
$89192.84
+ Est. Annual Savings (Schedule)
$140453.75
- Old EBS Snapshots (> 1 Year)
24
- Est. Monthly Cost (Old Snapshots)
$309.85
+ Old EBS Snapshots (> 1 Year)
18
+ Est. Monthly Cost (Old Snapshots)
$223.47
-
+
@@ -133,12 +133,12 @@ AI/ML Services Resources
new Chart(document.getElementById('savingsChart'), {
type: 'bar',
data: {
- labels: ["Cost Explorer", "Bedrock", "Ec2", "S3", "Sagemaker", "Ebs", "Lambda", "Rds"],
+ labels: ["Cost Explorer", "S3", "Bedrock", "Ec2", "Rds", "Ebs"],
datasets: [{
label: 'Est. Monthly Savings ($)',
- data: [21532.07, 1200.0, 891.62, 505.85, 309.13, 247.76, 47.33, 42.03],
- backgroundColor: ["rgba(54, 162, 235, 0.8)", "rgba(255, 99, 132, 0.8)", "rgba(255, 206, 86, 0.8)", "rgba(75, 192, 192, 0.8)", "rgba(153, 102, 255, 0.8)", "rgba(255, 159, 64, 0.8)", "rgba(199, 199, 199, 0.8)", "rgba(83, 102, 255, 0.8)"],
- borderColor: ["rgba(54, 162, 235, 1)", "rgba(255, 99, 132, 1)", "rgba(255, 206, 86, 1)", "rgba(75, 192, 192, 1)", "rgba(153, 102, 255, 1)", "rgba(255, 159, 64, 1)", "rgba(199, 199, 199, 1)", "rgba(83, 102, 255, 1)"],
+ data: [34328.1, 1726.73, 1200.0, 935.72, 651.22, 173.16],
+ backgroundColor: ["rgba(54, 162, 235, 0.8)", "rgba(255, 99, 132, 0.8)", "rgba(255, 206, 86, 0.8)", "rgba(75, 192, 192, 0.8)", "rgba(153, 102, 255, 0.8)", "rgba(255, 159, 64, 0.8)"],
+ borderColor: ["rgba(54, 162, 235, 1)", "rgba(255, 99, 132, 1)", "rgba(255, 206, 86, 1)", "rgba(75, 192, 192, 1)", "rgba(153, 102, 255, 1)", "rgba(255, 159, 64, 1)"],
borderWidth: 1
}]
},
@@ -228,37 +228,37 @@ AI/ML Services Resources
| 1 |
Cost Explorer |
- anomaly-6552 (Amazon EC2) |
+ anomaly-4824 (Amazon CloudFront) |
N/A |
- $13848.16 |
- Investigate 140.0% cost increase |
+ $13655.30 |
+ Investigate 149.0% cost increase |
| 2 |
Cost Explorer |
- anomaly-2328 (Amazon EC2) |
+ anomaly-9896 (AWS Lambda) |
N/A |
- $2541.51 |
- Investigate 41.0% cost increase |
+ $12470.44 |
+ Investigate 147.0% cost increase |
| 3 |
Cost Explorer |
- anomaly-4036 (AWS Lambda) |
+ anomaly-1668 (AWS Lambda) |
N/A |
- $2283.17 |
- Investigate 64.0% cost increase |
+ $5810.37 |
+ Investigate 118.0% cost increase |
| 4 |
Cost Explorer |
- anomaly-5958 (Amazon RDS) |
+ anomaly-3831 (AWS Lambda) |
N/A |
- $1775.38 |
- Investigate 58.0% cost increase |
+ $1614.94 |
+ Investigate 90.0% cost increase |
@@ -273,46 +273,46 @@ AI/ML Services Resources
| 6 |
Cost Explorer |
- anomaly-9783 (Amazon RDS) |
+ anomaly-4959 (Amazon RDS) |
N/A |
- $1083.85 |
- Investigate 85.0% cost increase |
+ $777.05 |
+ Investigate 67.0% cost increase |
| 7 |
- Ec2 |
- i-0537d818 (dev-web-01) |
- t3.medium |
- $394.47 |
- Consider stopping |
+ S3 |
+ bucket-1 |
+ N/A |
+ $619.95 |
+ Add lifecycle policy for cost optimization |
| 8 |
- Sagemaker |
- notebook-experimentation-3 (notebook-3) |
- ml.t3.medium |
- $309.13 |
- Stop idle notebook instance |
+ S3 |
+ bucket-9 |
+ N/A |
+ $463.03 |
+ Add lifecycle policy for cost optimization |
| 9 |
- Ec2 |
- i-023f4017 (prod-api-02) |
- m5.xlarge |
- $216.67 |
- Consider stopping |
+ Rds |
+ db-02 (database-2) |
+ db.m5.large |
+ $300.50 |
+ Consider downsizing instance class |
| 10 |
- S3 |
- bucket-3 |
- N/A |
- $212.01 |
- Add lifecycle policy for cost optimization |
+ Rds |
+ db-08 (database-8) |
+ db.m5.xlarge |
+ $283.82 |
+ Consider downsizing instance class |
@@ -326,7 +326,7 @@ Table of Contents
Top 10 Savings OpportunitiesEc2 (15)Ebs (12)S3 (10)Rds (8)SageMaker Analysis (5)Lambda Analysis (10)Bedrock (1)Cost Explorer (5)Eks Deployments (5)Eks Sessions (6)Rto Analysis (7)
- Ec2 (15 findings)
| Account ID | Account Alias | Instance ID | Name | Region | Nike Owner | Current Type | Recommended Type | OS | CPU Utilization (%) | Network I/O (MB/s) | Status | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | i-00d8b28f | dev-web-01 | eu-west-1 | devops-team | t3.medium | t3.micro | Ubuntu 22.04 | 45.50% | 93.2 | Idle | Consider stopping | $394.47 |
| 123456789012 | simulated-account | i-035609e7 | prod-api-02 | eu-west-1 | platform-team | m5.xlarge | m6g.medium | Ubuntu 22.04 | 8.00% | 14.7 | Idle | Consider stopping | $216.67 |
| 123456789012 | simulated-account | i-03358932 | prod-worker-03 | us-west-2 | data-team | m5.xlarge | m5.xlarge | Ubuntu 22.04 | 18.50% | 8.8 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-02ad82a3 | dev-worker-04 | eu-west-1 | ml-team | c5.xlarge | t3.micro | Windows Server 2022 | 32.50% | 7.4 | Oversized | Consider downsizing | $112.28 |
| 123456789012 | simulated-account | i-01114819 | prod-api-05 | us-west-2 | platform-team | t3.small | t3.small | Amazon Linux 2023 | 58.90% | 43.5 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-02d29aa0 | dev-api-06 | eu-west-1 | platform-team | r5.xlarge | r5.xlarge | Windows Server 2022 | 36.90% | 52.1 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-015221cd | staging-web-07 | us-east-1 | devops-team | m5.xlarge | m5.xlarge | RHEL 8 | 71.10% | 41.9 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-04abd119 | prod-db-08 | us-west-2 | devops-team | m5.large | m6g.large | Ubuntu 22.04 | 8.80% | 46.9 | Idle | Consider stopping | $168.20 |
| 123456789012 | simulated-account | i-05f074be | prod-api-09 | us-east-1 | backend-team | t3.small | t3.small | Amazon Linux 2 | 42.90% | 74.5 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-04923c56 | prod-api-10 | us-west-2 | ml-team | t3.small | t3.small | RHEL 8 | 22.50% | 121.2 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-03103acd | staging-worker-11 | us-east-1 | ml-team | r5.xlarge | r5.xlarge | Amazon Linux 2023 | 16.60% | 70.3 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-0407a0de | dev-db-12 | eu-west-1 | devops-team | r5.large | r5.large | Amazon Linux 2023 | 26.30% | 80.8 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-00b3ab99 | dev-worker-13 | us-east-1 | devops-team | r5.large | r5.large | RHEL 8 | 73.60% | 44.0 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-01d666b1 | dev-api-14 | us-west-2 | backend-team | t3.micro | t3.micro | Amazon Linux 2023 | 27.60% | 17.9 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-01068c9a | dev-db-15 | eu-west-1 | platform-team | t3.medium | t3.medium | Amazon Linux 2023 | 53.80% | 89.8 | Active | Consider no action needed | $0.00 |
Ebs (12 findings)
| Account ID | Account Alias | Volume ID | Name | Region | Nike Owner | Current Type | Size (GB) | IOPS | Throughput (MB/s) | Attached Instance | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | vol-031e9a90 | volume-temp-1 | us-west-2 | devops-team | gp3 | 1748 | 3102 | 405 | i-01f825df | OK | $0.00 |
| 123456789012 | simulated-account | vol-04d839c3 | volume-data-2 | us-east-1 | devops-team | gp2 | 956 | 790 | 161 | i-01ffeabb | Migrate to gp3 | $19.12 |
| 123456789012 | simulated-account | vol-05ecdf46 | volume-temp-3 | us-west-2 | devops-team | st1 | 1416 | 1375 | 65 | i-04d2a439 | OK | $0.00 |
| 123456789012 | simulated-account | vol-03764972 | volume-temp-4 | us-west-2 | backend-team | st1 | 1172 | 2510 | 154 | i-05cd53d3 | OK | $0.00 |
| 123456789012 | simulated-account | vol-040d127a | volume-backup-5 | us-west-2 | devops-team | io1 | 1202 | 7267 | 130 | i-029eb240 | OK | $0.00 |
| 123456789012 | simulated-account | vol-04daf759 | volume-backup-6 | us-east-1 | backend-team | sc1 | 1278 | 2148 | 158 | N/A | Delete or snapshot unattached volume | $102.24 |
| 123456789012 | simulated-account | vol-049a3f47 | volume-data-7 | us-west-2 | platform-team | gp2 | 604 | 1847 | 64 | i-02840dd9 | Migrate to gp3 | $12.08 |
| 123456789012 | simulated-account | vol-020a341c | volume-temp-8 | us-west-2 | backend-team | sc1 | 191 | 1418 | 136 | i-026f333f | OK | $0.00 |
| 123456789012 | simulated-account | vol-05229e60 | volume-data-9 | us-east-1 | devops-team | io1 | 1500 | 14110 | 189 | i-04fc40d0 | OK | $0.00 |
| 123456789012 | simulated-account | vol-011417cb | volume-temp-10 | us-west-2 | data-team | io2 | 1429 | 4546 | 208 | N/A | Delete or snapshot unattached volume | $114.32 |
| 123456789012 | simulated-account | vol-00de0275 | volume-temp-11 | us-west-2 | data-team | io1 | 1599 | 14538 | 55 | i-03d7b010 | OK | $0.00 |
| 123456789012 | simulated-account | vol-0176441a | volume-root-12 | us-west-2 | platform-team | sc1 | 1221 | 386 | 170 | i-0135cdc5 | OK | $0.00 |
S3 (10 findings)
| Account ID | Account Alias | Bucket Name | Region | Nike Owner | Storage (GB) | Lifecycle Policy | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | prod-logs-5399 | us-east-1 | platform-team | 43485 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | prod-static-assets-9432 | us-east-1 | backend-team | 24597 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | prod-temp-9053 | us-east-1 | data-team | 15363 | Not Configured | Add lifecycle policy for cost optimization | $212.01 |
| 123456789012 | simulated-account | prod-backups-5866 | us-east-1 | devops-team | 8898 | Not Configured | Add lifecycle policy for cost optimization | $122.79 |
| 123456789012 | simulated-account | dev-archives-3333 | us-east-1 | platform-team | 17386 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | prod-backups-1289 | us-east-1 | platform-team | 43061 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | prod-temp-8289 | us-east-1 | platform-team | 17821 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | dev-archives-4799 | us-east-1 | platform-team | 22562 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | staging-backups-5279 | us-east-1 | devops-team | 14901 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | prod-data-lake-9344 | us-east-1 | platform-team | 12395 | Not Configured | Add lifecycle policy for cost optimization | $171.05 |
Rds (8 findings)
| Account ID | Account Alias | DB Instance | Name | Region | Nike Owner | Current Type | Storage (GB) | CPU Utilization (%) | Connections | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | db-prod-replica-01 | database-1 | us-west-2 | data-team | db.t3.medium | 345 | 47.00% | 301 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-staging-main-02 | database-2 | us-west-2 | data-team | db.t3.small | 49 | 71.20% | 385 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-prod-replica-03 | database-3 | us-east-1 | analytics-team | db.r5.xlarge | 600 | 35.50% | 169 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-dev-analytics-04 | database-4 | us-east-1 | backend-team | db.r5.large | 257 | 49.60% | 52 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-dev-analytics-05 | database-5 | us-west-2 | analytics-team | db.m5.xlarge | 207 | 49.40% | 260 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-dev-analytics-06 | database-6 | us-west-2 | data-team | db.t3.micro | 552 | 56.90% | 178 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-prod-main-07 | database-7 | us-west-2 | platform-team | db.t3.micro | 663 | 17.60% | 223 | Consider downsizing instance class | $42.03 |
| 123456789012 | simulated-account | db-dev-analytics-08 | database-8 | us-east-1 | backend-team | db.t3.medium | 444 | 33.50% | 336 | Well utilized | $0.00 |
SageMaker Analysis (5 findings)
Analysis of SageMaker endpoint and notebook instance usage.
| Account ID | Account Alias | Resource ARN | Name | Region | Nike Owner | Type | Status | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:notebook-instance/notebook-data-science-1 | notebook-1 | us-east-1 | ml-team | Notebook Instance | Idle | Stop idle notebook instance | $0.00 |
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:notebook-instance/notebook-data-science-2 | notebook-2 | us-east-1 | ml-team | Notebook Instance | Idle | Stop idle notebook instance | $0.00 |
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:notebook-instance/notebook-experimentation-3 | notebook-3 | us-east-1 | ml-team | Notebook Instance | Idle | Stop idle notebook instance | $309.13 |
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:endpoint/endpoint-prediction-1 | endpoint-1 | us-east-1 | ml-team | Inference Endpoint | Active | Well utilized endpoint | $0.00 |
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:endpoint/endpoint-inference-2 | endpoint-2 | us-east-1 | ml-team | Inference Endpoint | Active | Well utilized endpoint | $0.00 |
Lambda Analysis (10 findings)
Analysis of Lambda function configurations and usage.
| Account ID | Account Alias | Function Name | Region | Nike Owner | Runtime | Memory Size (MB) | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | prod-worker-1 | us-east-1 | backend-team | java17 | 1024 | OK | $0.00 |
| 123456789012 | simulated-account | dev-handler-2 | us-east-1 | data-team | go1.x | 512 | OK | $0.00 |
| 123456789012 | simulated-account | dev-processor-3 | us-east-1 | data-team | go1.x | 3072 | OK | $0.00 |
| 123456789012 | simulated-account | prod-api-4 | us-east-1 | backend-team | nodejs18.x | 3072 | OK | $0.00 |
| 123456789012 | simulated-account | prod-handler-5 | us-east-1 | ml-team | python3.9 | 3072 | OK | $0.00 |
| 123456789012 | simulated-account | dev-handler-6 | us-east-1 | data-team | python3.9 | 128 | OK | $0.00 |
| 123456789012 | simulated-account | dev-handler-7 | us-east-1 | backend-team | java17 | 3072 | Reduce memory allocation | $47.33 |
| 123456789012 | simulated-account | dev-processor-8 | us-east-1 | backend-team | nodejs20.x | 512 | OK | $0.00 |
| 123456789012 | simulated-account | dev-api-9 | us-east-1 | backend-team | python3.9 | 512 | OK | $0.00 |
| 123456789012 | simulated-account | prod-api-10 | us-east-1 | ml-team | nodejs18.x | 512 | OK | $0.00 |
Bedrock (1 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | pt-claude-instant-prod | Claude Instant Production | us-east-1 | ml-team | N/A | Consider on-demand pricing for variable workloads | $1,200.00 |
Cost Explorer (5 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | anomaly-4036 | AWS Lambda | us-east-1 | finops-team | N/A | Investigate 64.0% cost increase | $2,283.17 |
| 123456789012 | simulated-account | anomaly-5958 | Amazon RDS | us-east-1 | finops-team | N/A | Investigate 58.0% cost increase | $1,775.38 |
| 123456789012 | simulated-account | anomaly-6552 | Amazon EC2 | us-east-1 | finops-team | N/A | Investigate 140.0% cost increase | $13,848.16 |
| 123456789012 | simulated-account | anomaly-9783 | Amazon RDS | us-east-1 | finops-team | N/A | Investigate 85.0% cost increase | $1,083.85 |
| 123456789012 | simulated-account | anomaly-2328 | Amazon EC2 | us-east-1 | finops-team | N/A | Investigate 41.0% cost increase | $2,541.51 |
Eks Deployments (5 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | prod-frontend | frontend | us-east-1 | frontend-team | N/A | Deployment healthy | $0.00 |
| 123456789012 | simulated-account | prod-backend-api | backend-api | us-east-1 | platform-team | N/A | Investigate restart issues | $0.00 |
| 123456789012 | simulated-account | prod-worker | worker | us-east-1 | devops-team | N/A | Deployment healthy | $0.00 |
| 123456789012 | simulated-account | staging-scheduler | scheduler | us-east-1 | frontend-team | N/A | Review and update stale deployment | $0.00 |
| 123456789012 | simulated-account | staging-gateway | gateway | us-east-1 | platform-team | N/A | Investigate restart issues | $0.00 |
Eks Sessions (6 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | session-313248 | staging-cluster-session-1 | us-east-1 | devops-team | N/A | Review long-running session for security | $0.00 |
| 123456789012 | simulated-account | session-800338 | dev-cluster-session-2 | us-east-1 | devops-team | N/A | Review long-running session for security | $0.00 |
| 123456789012 | simulated-account | session-228980 | staging-cluster-session-3 | us-east-1 | devops-team | N/A | Review long-running session for security | $0.00 |
| 123456789012 | simulated-account | session-256279 | prod-cluster-session-4 | us-east-1 | devops-team | N/A | Normal session activity | $0.00 |
| 123456789012 | simulated-account | session-127425 | dev-cluster-session-5 | us-east-1 | devops-team | N/A | Review long-running session for security | $0.00 |
| 123456789012 | simulated-account | session-559543 | prod-cluster-session-6 | us-east-1 | devops-team | N/A | Review long-running session for security | $0.00 |
Rto Analysis (7 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | db-prod-1 | database-1 | us-east-1 | data-team | N/A | Enable cross-region backup for disaster recovery | $0.00 |
| 123456789012 | simulated-account | db-staging-2 | database-2 | us-east-1 | platform-team | N/A | Enable cross-region backup for disaster recovery | $0.00 |
| 123456789012 | simulated-account | db-staging-3 | database-3 | us-east-1 | devops-team | N/A | Backup configuration adequate | $0.00 |
| 123456789012 | simulated-account | db-staging-4 | database-4 | us-east-1 | platform-team | N/A | Backup configuration adequate | $0.00 |
| 123456789012 | simulated-account | bucket-critical-1 | critical-data-bucket-1 | us-east-1 | data-team | N/A | Enable cross-region replication for critical data | $0.00 |
| 123456789012 | simulated-account | bucket-critical-2 | critical-data-bucket-2 | us-east-1 | platform-team | N/A | Enable cross-region replication for critical data | $0.00 |
| 123456789012 | simulated-account | bucket-critical-3 | critical-data-bucket-3 | us-east-1 | data-team | N/A | Replication configured | $0.00 |
+ Ec2 (15 findings)
| Account ID | Account Alias | Instance ID | Name | Region | Nike Owner | Current Type | Recommended Type | OS | CPU Utilization (%) | Network I/O (MB/s) | Status | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | i-05ccc9f5 | staging-web-01 | eu-west-1 | devops-team | t3.micro | t3.micro | RHEL 8 | 49.00% | 140.6 | Idle | Consider stopping | $272.93 |
| 123456789012 | simulated-account | i-01fd98ff | staging-worker-02 | eu-west-1 | devops-team | m5.2xlarge | m6g.medium | Ubuntu 22.04 | 44.00% | 5.8 | Oversized | Consider downsizing | $64.61 |
| 123456789012 | simulated-account | i-051abe56 | dev-worker-03 | us-west-2 | ml-team | r5.large | r5.large | RHEL 8 | 52.20% | 119.9 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-03a46139 | staging-web-04 | us-east-1 | platform-team | t3.medium | t3.medium | Amazon Linux 2 | 63.60% | 32.6 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-047c5b8a | prod-web-05 | us-east-1 | ml-team | c5.xlarge | c5.xlarge | Amazon Linux 2023 | 51.00% | 12.1 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-01a0376f | staging-web-06 | eu-west-1 | data-team | r5.xlarge | m6g.medium | Ubuntu 22.04 | 47.40% | 94.8 | Oversized | Consider downsizing | $238.02 |
| 123456789012 | simulated-account | i-01909d74 | dev-db-07 | eu-west-1 | devops-team | t3.medium | t3.medium | Windows Server 2022 | 27.10% | 52.8 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-052aa331 | prod-db-08 | eu-west-1 | ml-team | r5.large | r5.large | Windows Server 2022 | 67.60% | 148.6 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-04554860 | dev-api-09 | us-west-2 | backend-team | r5.large | t3.micro | Amazon Linux 2023 | 39.30% | 44.9 | Idle | Consider stopping | $109.09 |
| 123456789012 | simulated-account | i-01080c94 | staging-web-10 | eu-west-1 | devops-team | t3.small | t3.small | RHEL 8 | 35.90% | 48.7 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-04bbd4db | staging-api-11 | us-west-2 | devops-team | t3.small | t3.small | Amazon Linux 2 | 35.10% | 129.2 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-039b338c | staging-api-12 | eu-west-1 | devops-team | c5.xlarge | c5.xlarge | Windows Server 2022 | 83.20% | 34.8 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-031d88d1 | staging-worker-13 | eu-west-1 | data-team | t3.micro | t3.micro | Amazon Linux 2 | 61.80% | 103.4 | Active | Consider no action needed | $0.00 |
| 123456789012 | simulated-account | i-03731fd9 | staging-db-14 | us-east-1 | devops-team | r5.xlarge | t4g.small | Windows Server 2022 | 22.00% | 14.0 | Oversized | Consider downsizing | $235.76 |
| 123456789012 | simulated-account | i-025744ed | dev-web-15 | eu-west-1 | devops-team | t3.micro | t3.small | RHEL 8 | 21.80% | 70.9 | Oversized | Consider downsizing | $15.31 |
Ebs (12 findings)
| Account ID | Account Alias | Volume ID | Name | Region | Nike Owner | Current Type | Size (GB) | IOPS | Throughput (MB/s) | Attached Instance | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | vol-02ad15cf | volume-root-1 | us-east-1 | devops-team | io2 | 1225 | 5910 | 94 | i-03c803a1 | OK | $0.00 |
| 123456789012 | simulated-account | vol-0417fbb2 | volume-root-2 | us-west-2 | devops-team | gp2 | 1424 | 2463 | 117 | i-00d4c346 | Migrate to gp3 | $28.48 |
| 123456789012 | simulated-account | vol-0191d7c9 | volume-root-3 | us-east-1 | devops-team | st1 | 1389 | 1618 | 66 | i-055b3aa1 | OK | $0.00 |
| 123456789012 | simulated-account | vol-0521889a | volume-data-4 | us-east-1 | backend-team | sc1 | 352 | 1535 | 122 | i-037f4d9b | OK | $0.00 |
| 123456789012 | simulated-account | vol-053033c3 | volume-root-5 | us-east-1 | devops-team | st1 | 1367 | 1109 | 108 | i-020c4dd9 | OK | $0.00 |
| 123456789012 | simulated-account | vol-0548307b | volume-temp-6 | us-west-2 | data-team | st1 | 1365 | 937 | 196 | N/A | Delete or snapshot unattached volume | $109.20 |
| 123456789012 | simulated-account | vol-02fbe12c | volume-root-7 | us-east-1 | platform-team | sc1 | 1286 | 2386 | 59 | i-015df5ec | OK | $0.00 |
| 123456789012 | simulated-account | vol-02da8aec | volume-root-8 | us-west-2 | platform-team | gp3 | 1836 | 15116 | 698 | i-012a8234 | OK | $0.00 |
| 123456789012 | simulated-account | vol-056afc99 | volume-root-9 | us-west-2 | data-team | io1 | 1688 | 7609 | 102 | i-050d88b4 | OK | $0.00 |
| 123456789012 | simulated-account | vol-0269e76b | volume-temp-10 | us-east-1 | data-team | st1 | 1761 | 1164 | 190 | i-01cb717f | OK | $0.00 |
| 123456789012 | simulated-account | vol-0234d36d | volume-root-11 | us-west-2 | platform-team | gp2 | 1774 | 330 | 64 | i-046e6554 | Migrate to gp3 | $35.48 |
| 123456789012 | simulated-account | vol-0260f3fe | volume-root-12 | us-west-2 | data-team | io1 | 1332 | 4185 | 130 | i-01716cc1 | OK | $0.00 |
S3 (10 findings)
| Account ID | Account Alias | Bucket Name | Region | Nike Owner | Storage (GB) | Lifecycle Policy | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | prod-logs-9042 | us-east-1 | data-team | 44924 | Not Configured | Add lifecycle policy for cost optimization | $619.95 |
| 123456789012 | simulated-account | staging-logs-5527 | us-east-1 | data-team | 10085 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | dev-backups-3195 | us-east-1 | backend-team | 14868 | Not Configured | Add lifecycle policy for cost optimization | $205.18 |
| 123456789012 | simulated-account | staging-data-lake-5073 | us-east-1 | backend-team | 44515 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | staging-backups-3439 | us-east-1 | data-team | 13780 | Not Configured | Add lifecycle policy for cost optimization | $190.16 |
| 123456789012 | simulated-account | dev-data-lake-8964 | us-east-1 | platform-team | 10180 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | dev-backups-6708 | us-east-1 | backend-team | 7966 | Configured | Well configured | $0.00 |
| 123456789012 | simulated-account | staging-logs-1923 | us-east-1 | data-team | 177 | Not Configured | Add lifecycle policy for cost optimization | $0.00 |
| 123456789012 | simulated-account | prod-archives-6395 | us-east-1 | data-team | 33553 | Not Configured | Add lifecycle policy for cost optimization | $463.03 |
| 123456789012 | simulated-account | prod-archives-4338 | us-east-1 | data-team | 18001 | Not Configured | Add lifecycle policy for cost optimization | $248.41 |
Rds (8 findings)
| Account ID | Account Alias | DB Instance | Name | Region | Nike Owner | Current Type | Storage (GB) | CPU Utilization (%) | Connections | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | db-prod-analytics-01 | database-1 | us-east-1 | platform-team | db.t3.small | 165 | 46.70% | 355 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-dev-analytics-02 | database-2 | us-east-1 | backend-team | db.m5.large | 653 | 26.40% | 379 | Consider downsizing instance class | $300.50 |
| 123456789012 | simulated-account | db-prod-main-03 | database-3 | us-west-2 | platform-team | db.t3.micro | 166 | 15.90% | 10 | Consider downsizing instance class | $66.90 |
| 123456789012 | simulated-account | db-dev-replica-04 | database-4 | us-west-2 | data-team | db.t3.small | 322 | 35.10% | 209 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-dev-replica-05 | database-5 | us-west-2 | backend-team | db.r5.large | 152 | 37.90% | 374 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-prod-replica-06 | database-6 | us-east-1 | platform-team | db.t3.medium | 332 | 47.00% | 419 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-prod-analytics-07 | database-7 | us-east-1 | analytics-team | db.m5.xlarge | 908 | 55.90% | 243 | Well utilized | $0.00 |
| 123456789012 | simulated-account | db-staging-main-08 | database-8 | us-west-2 | backend-team | db.m5.xlarge | 75 | 13.70% | 41 | Consider downsizing instance class | $283.82 |
SageMaker Analysis (5 findings)
Analysis of SageMaker endpoint and notebook instance usage.
| Account ID | Account Alias | Resource ARN | Name | Region | Nike Owner | Type | Status | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:notebook-instance/notebook-data-science-1 | notebook-1 | us-east-1 | ml-team | Notebook Instance | Idle | Stop idle notebook instance | $0.00 |
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:notebook-instance/notebook-experimentation-2 | notebook-2 | us-east-1 | ml-team | Notebook Instance | In Use | Active notebook | $0.00 |
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:notebook-instance/notebook-ml-training-3 | notebook-3 | us-east-1 | ml-team | Notebook Instance | Idle | Stop idle notebook instance | $0.00 |
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:endpoint/endpoint-inference-1 | endpoint-1 | us-east-1 | ml-team | Inference Endpoint | Active | Well utilized endpoint | $0.00 |
| 123456789012 | simulated-account | arn:aws:sagemaker:us-east-1:123456789012:endpoint/endpoint-inference-2 | endpoint-2 | us-east-1 | ml-team | Inference Endpoint | Active | Well utilized endpoint | $0.00 |
Lambda Analysis (10 findings)
Analysis of Lambda function configurations and usage.
| Account ID | Account Alias | Function Name | Region | Nike Owner | Runtime | Memory Size (MB) | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | prod-processor-1 | us-east-1 | ml-team | python3.9 | 512 | OK | $0.00 |
| 123456789012 | simulated-account | prod-api-2 | us-east-1 | backend-team | go1.x | 3072 | OK | $0.00 |
| 123456789012 | simulated-account | dev-worker-3 | us-east-1 | platform-team | python3.11 | 256 | OK | $0.00 |
| 123456789012 | simulated-account | dev-api-4 | us-east-1 | ml-team | python3.9 | 512 | OK | $0.00 |
| 123456789012 | simulated-account | prod-worker-5 | us-east-1 | data-team | nodejs20.x | 3072 | OK | $0.00 |
| 123456789012 | simulated-account | dev-api-6 | us-east-1 | data-team | nodejs20.x | 3072 | OK | $0.00 |
| 123456789012 | simulated-account | dev-processor-7 | us-east-1 | platform-team | python3.11 | 1024 | OK | $0.00 |
| 123456789012 | simulated-account | dev-worker-8 | us-east-1 | ml-team | nodejs18.x | 2048 | OK | $0.00 |
| 123456789012 | simulated-account | dev-api-9 | us-east-1 | ml-team | java17 | 128 | OK | $0.00 |
| 123456789012 | simulated-account | prod-processor-10 | us-east-1 | data-team | python3.9 | 128 | OK | $0.00 |
Bedrock (1 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | pt-claude-instant-prod | Claude Instant Production | us-east-1 | ml-team | N/A | Consider on-demand pricing for variable workloads | $1,200.00 |
Cost Explorer (5 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | anomaly-4824 | Amazon CloudFront | us-east-1 | finops-team | N/A | Investigate 149.0% cost increase | $13,655.30 |
| 123456789012 | simulated-account | anomaly-3831 | AWS Lambda | us-east-1 | finops-team | N/A | Investigate 90.0% cost increase | $1,614.94 |
| 123456789012 | simulated-account | anomaly-1668 | AWS Lambda | us-east-1 | finops-team | N/A | Investigate 118.0% cost increase | $5,810.37 |
| 123456789012 | simulated-account | anomaly-9896 | AWS Lambda | us-east-1 | finops-team | N/A | Investigate 147.0% cost increase | $12,470.44 |
| 123456789012 | simulated-account | anomaly-4959 | Amazon RDS | us-east-1 | finops-team | N/A | Investigate 67.0% cost increase | $777.05 |
Eks Deployments (5 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | prod-frontend | frontend | us-east-1 | platform-team | N/A | Investigate restart issues | $0.00 |
| 123456789012 | simulated-account | prod-backend-api | backend-api | us-east-1 | frontend-team | N/A | Review and update stale deployment | $0.00 |
| 123456789012 | simulated-account | prod-worker | worker | us-east-1 | backend-team | N/A | Review and update stale deployment | $0.00 |
| 123456789012 | simulated-account | staging-scheduler | scheduler | us-east-1 | platform-team | N/A | Investigate restart issues | $0.00 |
| 123456789012 | simulated-account | staging-gateway | gateway | us-east-1 | platform-team | N/A | Investigate restart issues | $0.00 |
Eks Sessions (6 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | session-331296 | dev-cluster-session-1 | us-east-1 | devops-team | N/A | Normal session activity | $0.00 |
| 123456789012 | simulated-account | session-193012 | prod-cluster-session-2 | us-east-1 | devops-team | N/A | Review long-running session for security | $0.00 |
| 123456789012 | simulated-account | session-726157 | prod-cluster-session-3 | us-east-1 | devops-team | N/A | Review long-running session for security | $0.00 |
| 123456789012 | simulated-account | session-905983 | prod-cluster-session-4 | us-east-1 | devops-team | N/A | Normal session activity | $0.00 |
| 123456789012 | simulated-account | session-193882 | staging-cluster-session-5 | us-east-1 | devops-team | N/A | Normal session activity | $0.00 |
| 123456789012 | simulated-account | session-851597 | prod-cluster-session-6 | us-east-1 | devops-team | N/A | Review long-running session for security | $0.00 |
Rto Analysis (7 findings)
| Account ID | Account Alias | Resource ID | Name | Region | Nike Owner | Details | Recommendation | Est. Monthly Savings |
|---|
| 123456789012 | simulated-account | db-staging-1 | database-1 | us-east-1 | platform-team | N/A | Enable cross-region backup for disaster recovery | $0.00 |
| 123456789012 | simulated-account | db-staging-2 | database-2 | us-east-1 | backend-team | N/A | Backup configuration adequate | $0.00 |
| 123456789012 | simulated-account | db-prod-3 | database-3 | us-east-1 | backend-team | N/A | Enable cross-region backup for disaster recovery | $0.00 |
| 123456789012 | simulated-account | db-prod-4 | database-4 | us-east-1 | data-team | N/A | Backup configuration adequate | $0.00 |
| 123456789012 | simulated-account | bucket-critical-1 | critical-data-bucket-1 | us-east-1 | data-team | N/A | Enable cross-region replication for critical data | $0.00 |
| 123456789012 | simulated-account | bucket-critical-2 | critical-data-bucket-2 | us-east-1 | data-team | N/A | Replication configured | $0.00 |
| 123456789012 | simulated-account | bucket-critical-3 | critical-data-bucket-3 | us-east-1 | devops-team | N/A | Enable cross-region replication for critical data | $0.00 |
CloudWatch Agent Information
@@ -351,7 +351,7 @@ Installation:
- Security Findings (14 findings)
+ Security Findings (7 findings)
Review the security findings identified during the analysis. Detailed findings are listed under the 'Security and Privacy' section if available.
@@ -362,7 +362,7 @@ Installation:
+