runbooks 0.6.1__py3-none-any.whl → 0.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- jupyter-agent/.env +2 -0
- jupyter-agent/.gradio/certificate.pem +31 -0
- jupyter-agent/__main__.log +8 -0
- jupyter-agent/tmp/4ojbs8a02ir/jupyter-agent.ipynb +68 -0
- jupyter-agent/tmp/cm5iasgpm3p/jupyter-agent.ipynb +91 -0
- jupyter-agent/tmp/crqbsseag5/jupyter-agent.ipynb +91 -0
- jupyter-agent/tmp/hohanq1u097/jupyter-agent.ipynb +57 -0
- jupyter-agent/tmp/jns1sam29wm/jupyter-agent.ipynb +53 -0
- jupyter-agent/tmp/jupyter-agent.ipynb +27 -0
- runbooks/__init__.py +1 -1
- runbooks/finops/README.md +337 -0
- runbooks/finops/__init__.py +1 -3
- runbooks/inventory/FAILED_SCRIPTS_TROUBLESHOOTING.md +619 -0
- runbooks/inventory/PASSED_SCRIPTS_GUIDE.md +738 -0
- runbooks/inventory/aws_organization.png +0 -0
- runbooks/main.py +230 -11
- runbooks/{security_baseline → security}/README.md +191 -68
- runbooks/security/__init__.py +71 -0
- runbooks/{security_baseline → security}/security_baseline_tester.py +2 -2
- {runbooks-0.6.1.dist-info → runbooks-0.7.0.dist-info}/METADATA +5 -3
- {runbooks-0.6.1.dist-info → runbooks-0.7.0.dist-info}/RECORD +56 -44
- runbooks/security_baseline/__init__.py +0 -0
- runbooks/security_baseline/requirements.txt +0 -7
- /runbooks/{security_baseline → security}/checklist/__init__.py +0 -0
- /runbooks/{security_baseline → security}/checklist/account_level_bucket_public_access.py +0 -0
- /runbooks/{security_baseline → security}/checklist/alternate_contacts.py +0 -0
- /runbooks/{security_baseline → security}/checklist/bucket_public_access.py +0 -0
- /runbooks/{security_baseline → security}/checklist/cloudwatch_alarm_configuration.py +0 -0
- /runbooks/{security_baseline → security}/checklist/direct_attached_policy.py +0 -0
- /runbooks/{security_baseline → security}/checklist/guardduty_enabled.py +0 -0
- /runbooks/{security_baseline → security}/checklist/iam_password_policy.py +0 -0
- /runbooks/{security_baseline → security}/checklist/iam_user_mfa.py +0 -0
- /runbooks/{security_baseline → security}/checklist/multi_region_instance_usage.py +0 -0
- /runbooks/{security_baseline → security}/checklist/multi_region_trail.py +0 -0
- /runbooks/{security_baseline → security}/checklist/root_access_key.py +0 -0
- /runbooks/{security_baseline → security}/checklist/root_mfa.py +0 -0
- /runbooks/{security_baseline → security}/checklist/root_usage.py +0 -0
- /runbooks/{security_baseline → security}/checklist/trail_enabled.py +0 -0
- /runbooks/{security_baseline → security}/checklist/trusted_advisor.py +0 -0
- /runbooks/{security_baseline → security}/config-origin.json +0 -0
- /runbooks/{security_baseline → security}/config.json +0 -0
- /runbooks/{security_baseline → security}/permission.json +0 -0
- /runbooks/{security_baseline → security}/report_generator.py +0 -0
- /runbooks/{security_baseline → security}/report_template_en.html +0 -0
- /runbooks/{security_baseline → security}/report_template_jp.html +0 -0
- /runbooks/{security_baseline → security}/report_template_kr.html +0 -0
- /runbooks/{security_baseline → security}/report_template_vn.html +0 -0
- /runbooks/{security_baseline → security}/run_script.py +0 -0
- /runbooks/{security_baseline → security}/utils/__init__.py +0 -0
- /runbooks/{security_baseline → security}/utils/common.py +0 -0
- /runbooks/{security_baseline → security}/utils/enums.py +0 -0
- /runbooks/{security_baseline → security}/utils/language.py +0 -0
- /runbooks/{security_baseline → security}/utils/level_const.py +0 -0
- /runbooks/{security_baseline → security}/utils/permission_list.py +0 -0
- {runbooks-0.6.1.dist-info → runbooks-0.7.0.dist-info}/WHEEL +0 -0
- {runbooks-0.6.1.dist-info → runbooks-0.7.0.dist-info}/entry_points.txt +0 -0
- {runbooks-0.6.1.dist-info → runbooks-0.7.0.dist-info}/licenses/LICENSE +0 -0
- {runbooks-0.6.1.dist-info → runbooks-0.7.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
{
|
2
|
+
"metadata": {
|
3
|
+
"kernel_info": {
|
4
|
+
"name": "python3"
|
5
|
+
},
|
6
|
+
"language_info": {
|
7
|
+
"name": "python",
|
8
|
+
"version": "3.12"
|
9
|
+
}
|
10
|
+
},
|
11
|
+
"nbformat": 4,
|
12
|
+
"nbformat_minor": 0,
|
13
|
+
"cells": [
|
14
|
+
{
|
15
|
+
"cell_type": "markdown",
|
16
|
+
"metadata": {},
|
17
|
+
"source": "<p align=\"center\">\n <img src=\"cloudops-agent.png\" alt=\"Jupyter Agent\" />\n</p>\n\n\n<p style=\"text-align:center;\">Let a LLM agent write and execute code inside a notebook!</p>"
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"cell_type": "markdown",
|
21
|
+
"metadata": {},
|
22
|
+
"source": "<details>\n <summary style=\"display: flex; align-items: center;\">\n <div class=\"alert alert-block alert-info\" style=\"margin: 0; width: 100%;\">\n <b>System: <span class=\"arrow\">\u25b6</span></b>\n </div>\n </summary>\n <div class=\"alert alert-block alert-info\">\n # Data Science Agent Protocol<br><br>You are an intelligent data science assistant with access to an IPython interpreter. Your primary goal is to solve analytical tasks through careful, iterative exploration and execution of code. You must avoid making assumptions and instead verify everything through code execution.<br><br>## Core Principles<br>1. Always execute code to verify assumptions<br>2. Break down complex problems into smaller steps<br>3. Learn from execution results<br>4. Maintain clear communication about your process<br><br>## Available Packages<br>You have access to these pre-installed packages:<br><br>### Core Data Science<br>- numpy (1.26.4)<br>- pandas (1.5.3)<br>- scipy (1.12.0)<br>- scikit-learn (1.4.1.post1)<br><br>### Visualization<br>- matplotlib (3.9.2)<br>- seaborn (0.13.2)<br>- plotly (5.19.0)<br>- bokeh (3.3.4)<br>- e2b_charts (latest)<br><br>### Image & Signal Processing<br>- opencv-python (4.9.0.80)<br>- pillow (9.5.0)<br>- scikit-image (0.22.0)<br>- imageio (2.34.0)<br><br>### Text & NLP<br>- nltk (3.8.1)<br>- spacy (3.7.4)<br>- gensim (4.3.2)<br>- textblob (0.18.0)<br><br>### Audio Processing<br>- librosa (0.10.1)<br>- soundfile (0.12.1)<br><br>### File Handling<br>- python-docx (1.1.0)<br>- openpyxl (3.1.2)<br>- xlrd (2.0.1)<br><br>### Other Utilities<br>- requests (2.26.0)<br>- beautifulsoup4 (4.12.3)<br>- sympy (1.12)<br>- xarray (2024.2.0)<br>- joblib (1.3.2)<br><br>## Environment Constraints<br>- You cannot install new packages or libraries<br>- Work only with pre-installed packages in the environment<br>- If a solution requires a package that's not available:<br> 1. Check if the task can be solved with base libraries<br> 2. Propose alternative approaches using available packages<br> 3. Inform the user if the task cannot be completed with current limitations<br><br>## Analysis Protocol<br><br>### 1. Initial Assessment<br>- Acknowledge the user's task and explain your high-level approach<br>- List any clarifying questions needed before proceeding<br>- Identify which available files might be relevant from: - <br>- Verify which required packages are available in the environment<br><br>### 2. Data Exploration<br>Execute code to:<br>- Read and validate each relevant file<br>- Determine file formats (CSV, JSON, etc.)<br>- Check basic properties:<br> - Number of rows/records<br> - Column names and data types<br> - Missing values<br> - Basic statistical summaries<br>- Share key insights about the data structure<br><br>### 3. Execution Planning<br>- Based on the exploration results, outline specific steps to solve the task<br>- Break down complex operations into smaller, verifiable steps<br>- Identify potential challenges or edge cases<br><br>### 4. Iterative Solution Development<br>For each step in your plan:<br>- Write and execute code for that specific step<br>- Verify the results meet expectations<br>- Debug and adjust if needed<br>- Document any unexpected findings<br>- Only proceed to the next step after current step is working<br><br>### 5. Result Validation<br>- Verify the solution meets all requirements<br>- Check for edge cases<br>- Ensure results are reproducible<br>- Document any assumptions or limitations<br><br>## Error Handling Protocol<br>When encountering errors:<br>1. Show the error message<br>2. Analyze potential causes<br>3. Propose specific fixes<br>4. Execute modified code<br>5. Verify the fix worked<br>6. Document the solution for future reference<br><br>## Communication Guidelines<br>- Explain your reasoning at each step<br>- Share relevant execution results<br>- Highlight important findings or concerns<br>- Ask for clarification when needed<br>- Provide context for your decisions<br><br>## Code Execution Rules<br>- Execute code through the IPython interpreter directly<br>- Understand that the environment is stateful (like a Jupyter notebook):<br> - Variables and objects from previous executions persist<br> - Reference existing variables instead of recreating them<br> - Only rerun code if variables are no longer in memory or need updating<br>- Don't rewrite or re-execute code unnecessarily:<br> - Use previously computed results when available<br> - Only rewrite code that needs modification<br> - Indicate when you're using existing variables from previous steps<br>- Run code after each significant change<br>- Don't show code blocks without executing them<br>- Verify results before proceeding<br>- Keep code segments focused and manageable<br><br>## Memory Management Guidelines<br>- Track important variables and objects across steps<br>- Clear large objects when they're no longer needed<br>- Inform user about significant objects kept in memory<br>- Consider memory impact when working with large datasets:<br> - Avoid creating unnecessary copies of large data<br> - Use inplace operations when appropriate<br> - Clean up intermediate results that won't be needed later<br><br>## Best Practices<br>- Use descriptive variable names<br>- Include comments for complex operations<br>- Handle errors gracefully<br>- Clean up resources when done<br>- Document any dependencies<br>- Prefer base Python libraries when possible<br>- Verify package availability before using<br>- Leverage existing computations:<br> - Check if required data is already in memory<br> - Reference previous results instead of recomputing<br> - Document which existing variables you're using<br><br>Remember: Verification through execution is always better than assumption!\n </div>\n</details>\n\n<style>\ndetails > summary .arrow {\n display: inline-block;\n transition: transform 0.2s;\n}\ndetails[open] > summary .arrow {\n transform: rotate(90deg);\n}\n</style>\n"
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"cell_type": "markdown",
|
26
|
+
"metadata": {},
|
27
|
+
"source": "<div class=\"alert alert-block alert-success\">\n<b>User:</b> Solve the Bayes' theorem equation and plot the results.\n</div>\n"
|
28
|
+
},
|
29
|
+
{
|
30
|
+
"cell_type": "code",
|
31
|
+
"execution_count": 1,
|
32
|
+
"metadata": {},
|
33
|
+
"source": "import numpy as np\nimport matplotlib.pyplot as plt\n\n# Define the prior probability distribution\ndef prior(theta):\n return np.ones(len(theta)) / len(theta)\n\n# Define the likelihood function\ndef likelihood(theta, x):\n return np.exp(-((theta - x) ** 2) / (2 * 0.1))\n\n# Define the posterior probability distribution using Bayes' theorem\ndef posterior(theta, x):\n prior_prob = prior(theta)\n likelihood_prob = likelihood(theta, x)\n evidence = np.sum(prior_prob * likelihood_prob)\n return likelihood_prob * prior_prob / evidence\n\n# Generate a range of theta values\ntheta = np.linspace(0, 1, 100)\n\n# Calculate the posterior probabilities for different x values\nposterior_probs = []\nfor x in [0.2, 0.5, 0.8]:\n posterior_prob = posterior(theta, x)\n posterior_probs.append(posterior_prob)\n\n# Plot the posterior probability distributions\nplt.plot(theta, posterior_probs[0], label='x=0.2')\nplt.plot(theta, posterior_probs[1], label='x=0.5')\nplt.plot(theta, posterior_probs[2], label='x=0.8')\nplt.xlabel('Theta')\nplt.ylabel('Posterior Probability')\nplt.title('Posterior Probability Distributions')\nplt.legend()\nplt.show()",
|
34
|
+
"outputs": [
|
35
|
+
{
|
36
|
+
"output_type": "display_data",
|
37
|
+
"metadata": {},
|
38
|
+
"data": {
|
39
|
+
"text/plain": [
|
40
|
+
"<Figure size 640x480 with 1 Axes>"
|
41
|
+
],
|
42
|
+
"image/png": "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"
|
43
|
+
}
|
44
|
+
}
|
45
|
+
]
|
46
|
+
},
|
47
|
+
{
|
48
|
+
"cell_type": "markdown",
|
49
|
+
"metadata": {},
|
50
|
+
"source": "This code first defines the prior probability distribution, likelihood function, and posterior probability distribution according to Bayes' theorem. It then generates a range of theta values and calculates the posterior probabilities for different x values. Finally, it plots the posterior probability distributions for these x values.\n\nThe resulting plot shows how the posterior probability distribution changes as the observed value x changes. The peak of the posterior distribution represents the most likely value of theta given the observation x. This demonstrates how Bayes' theorem updates our belief about the parameter theta based on new observations."
|
51
|
+
}
|
52
|
+
]
|
53
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
{
|
2
|
+
"metadata": {
|
3
|
+
"kernel_info": {
|
4
|
+
"name": "python3"
|
5
|
+
},
|
6
|
+
"language_info": {
|
7
|
+
"name": "python",
|
8
|
+
"version": "3.12"
|
9
|
+
}
|
10
|
+
},
|
11
|
+
"nbformat": 4,
|
12
|
+
"nbformat_minor": 0,
|
13
|
+
"cells": [
|
14
|
+
{
|
15
|
+
"cell_type": "markdown",
|
16
|
+
"metadata": {},
|
17
|
+
"source": "<p align=\"center\">\n <img src=\"cloudops-agent.png\" alt=\"Jupyter Agent\" />\n</p>\n\n\n<p style=\"text-align:center;\">Let a LLM agent write and execute code inside a notebook!</p>"
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"cell_type": "code",
|
21
|
+
"execution_count": null,
|
22
|
+
"metadata": {},
|
23
|
+
"source": "",
|
24
|
+
"outputs": []
|
25
|
+
}
|
26
|
+
]
|
27
|
+
}
|
runbooks/__init__.py
CHANGED
@@ -18,7 +18,7 @@ try:
|
|
18
18
|
__version__ = _pkg_version("runbooks")
|
19
19
|
except Exception:
|
20
20
|
# Fallback if metadata is unavailable during editable installs
|
21
|
-
__version__ = "0.6.
|
21
|
+
__version__ = "0.6.2"
|
22
22
|
|
23
23
|
# Core module exports
|
24
24
|
from runbooks.config import RunbooksConfig, load_config, save_config
|
@@ -0,0 +1,337 @@
|
|
1
|
+
# AWS FinOps Dashboard (CLI)
|
2
|
+
|
3
|
+
The AWS FinOps Dashboard is an open-source, Python-based command-line tool (built with the Rich library) for AWS cost monitoring. It provides multi-account cost summaries by time period, service, and cost allocation tags; budget limits vs. actuals; EC2 instance status; six‑month cost trend charts; and “FinOps audit” reports (e.g. untagged or idle resources). It can export data to CSV/JSON/PDF.
|
4
|
+
|
5
|
+
## Why AWS FinOps Dashboard?
|
6
|
+
|
7
|
+
Managing and understanding your AWS expenditure, especially across multiple accounts and services, can be complex. The AWS FinOps Dashboard CLI aims to simplify this by providing a clear, concise, and actionable view of your AWS costs and operational hygiene directly in your terminal.
|
8
|
+
|
9
|
+
Key features include:
|
10
|
+
* **Unified View:** Consolidate cost and resource data from multiple AWS accounts.
|
11
|
+

|
12
|
+
* **Cost Trend Analysis:** View how your AWS costs have been for the past six months.
|
13
|
+

|
14
|
+
* **Audit Your AWS Accounts:** Quickly identify spending patterns, untagged resources, underutilised resources and potential savings.
|
15
|
+

|
16
|
+
* **Generate Cost & Audit Reports:** You can generate Cost, Trend and Audit Reports in PDF, CSV & JSON formats for further analysis and reporting purposes.
|
17
|
+

|
18
|
+

|
19
|
+
|
20
|
+
## Table of Contents
|
21
|
+
|
22
|
+
- [Features](#features)
|
23
|
+
- [Prerequisites](#prerequisites)
|
24
|
+
- [Installation](#installation)
|
25
|
+
- [AWS CLI Profile Setup](#aws-cli-profile-setup)
|
26
|
+
- [Command Line Usage](#command-line-usage)
|
27
|
+
- [Options](#command-line-options)
|
28
|
+
- [Examples](#examples)
|
29
|
+
- [Using a Configuration File](#using-a-configuration-file)
|
30
|
+
- [TOML Configuration Example (`config.toml`)](#toml-configuration-example-configtoml)
|
31
|
+
- [YAML Configuration Example (`config.yaml` or `config.yml`)](#yaml-configuration-example-configyaml-or-configyml)
|
32
|
+
- [JSON Configuration Example (`config.json`)](#json-configuration-example-configjson)
|
33
|
+
- [Export Formats](#export-formats)
|
34
|
+
- [Cost For Every Run](#cost-for-every-run)
|
35
|
+
- [Contributing](#contributing)
|
36
|
+
- [License](#license)
|
37
|
+
|
38
|
+
---
|
39
|
+
|
40
|
+
## Features
|
41
|
+
|
42
|
+
- **Cost Analysis by Time Period**:
|
43
|
+
- View current & previous month's spend by default
|
44
|
+
- Set custom time ranges (e.g., 7, 30, 90 days) with `--time-range` option
|
45
|
+
- **Cost by AWS Service**: Sorted by highest cost for better insights
|
46
|
+
- **Cost by Tag**: Get the cost data by one or more tags with `--tag`(cost allocation tags must be enabled)
|
47
|
+
- **AWS Budgets Information**: Displays budget limits and actual spend
|
48
|
+
- **EC2 Instance Status**: Detailed state information across specified/accessible regions
|
49
|
+
- **Cost Trend Analysis**: View detailed cost trends in bar charts for the last 6 months across AWS profiles
|
50
|
+
- **FinOps Audit**: View untagged resources, unused or stopped resources, and Budget breaches across AWS profiles.
|
51
|
+
- **Profile Management**:
|
52
|
+
- Automatic profile detection
|
53
|
+
- Specific profile selection with `--profiles`
|
54
|
+
- Use all available profiles with `--all`
|
55
|
+
- Combine profiles from the same AWS account with `--combine`
|
56
|
+
- **Region Control**: Specify regions for EC2 discovery using `--regions`
|
57
|
+
- **Export Options**:
|
58
|
+
- CSV export with `--report-name` and `--report-type csv`
|
59
|
+
- JSON export with `--report-name` and `--report-type json`
|
60
|
+
- PDF export with `--report-name` and `--report-type pdf`
|
61
|
+
- Export to both CSV and JSON formats with `--report-name` and `--report-type csv json`
|
62
|
+
- Specify output directory using `--dir`
|
63
|
+
- **Note**: Trend reports (generated via `--trend`) currently only support JSON export. Other formats specified in `--report-type` will be ignored for these reports.
|
64
|
+
- **Improved Error Handling**: Resilient and user-friendly error messages
|
65
|
+
- **Beautiful Terminal UI**: Styled with the Rich library for a visually appealing experience
|
66
|
+
|
67
|
+
---
|
68
|
+
|
69
|
+
## Prerequisites
|
70
|
+
|
71
|
+
- **Python 3.8 or later**: Ensure you have the required Python version installed
|
72
|
+
- **AWS CLI configured with named profiles**: Set up your AWS CLI profiles for seamless integration
|
73
|
+
- **AWS credentials with permissions**:
|
74
|
+
- `ce:GetCostAndUsage`
|
75
|
+
- `budgets:ViewBudget`
|
76
|
+
- `ec2:DescribeInstances`
|
77
|
+
- `ec2:DescribeRegions`
|
78
|
+
- `sts:GetCallerIdentity`
|
79
|
+
- `ec2:DescribeInstances`
|
80
|
+
- `ec2:DescribeVolumes`
|
81
|
+
- `ec2:DescribeAddresses`
|
82
|
+
- `rds:DescribeDBInstances`
|
83
|
+
- `rds:ListTagsForResource`
|
84
|
+
- `lambda:ListFunctions`
|
85
|
+
- `lambda:ListTags`
|
86
|
+
- `elbv2:DescribeLoadBalancers`
|
87
|
+
- `elbv2:DescribeTags`
|
88
|
+
|
89
|
+
---
|
90
|
+
|
91
|
+
## AWS CLI Profile Setup
|
92
|
+
|
93
|
+
If you haven't already, configure your named profiles using the AWS CLI:
|
94
|
+
|
95
|
+
```bash
|
96
|
+
aws configure --profile profile1-name
|
97
|
+
aws configure --profile profile2-name
|
98
|
+
# ... etc ...
|
99
|
+
```
|
100
|
+
|
101
|
+
Repeat this for all the profiles you want the dashboard to potentially access.
|
102
|
+
|
103
|
+
---
|
104
|
+
|
105
|
+
## Command Line Usage
|
106
|
+
|
107
|
+
Run the script using `runbooks finops` followed by options:
|
108
|
+
|
109
|
+
```bash
|
110
|
+
runbooks finops [options]
|
111
|
+
```
|
112
|
+
|
113
|
+
### Command Line Options
|
114
|
+
|
115
|
+
| Flag | Description |
|
116
|
+
|---|---|
|
117
|
+
| `--config-file`, `-C` | Path to a TOML, YAML, or JSON configuration file. Command-line arguments will override settings from the config file. |
|
118
|
+
| `--profiles`, `-p` | Specific AWS profiles to use (space-separated). If omitted, uses 'default' profile if available, otherwise all profiles. |
|
119
|
+
| `--regions`, `-r` | Specific AWS regions to check for EC2 instances (space-separated). If omitted, attempts to check all accessible regions. |
|
120
|
+
| `--all`, `-a` | Use all available AWS profiles found in your config. |
|
121
|
+
| `--combine`, `-c` | Combine profiles from the same AWS account into single rows. |
|
122
|
+
| `--tag`, `-g` | Filter cost data by one or more cost allocation tags in `Key=Value` format. Example: `--tag Team=DevOps Env=Prod` |
|
123
|
+
| `--report-name`, `-n` | Specify the base name for the report file (without extension). |
|
124
|
+
| `--report-type`, `-y` | Specify report types (space-separated): 'csv', 'json', 'pdf'. For reports generated with `--audit`, only 'pdf' is applicable and other types will be ignored. |
|
125
|
+
| `--dir`, `-d` | Directory to save the report file(s) (default: current directory). |
|
126
|
+
| `--time-range`, `-t` | Time range for cost data in days (default: current month). Examples: 7, 30, 90. |
|
127
|
+
| `--trend` | View cost trend analysis for the last 6 months. |
|
128
|
+
| `--audit` | View list of untagged, unused resoruces and budget breaches. |
|
129
|
+
|
130
|
+
### Examples
|
131
|
+
|
132
|
+
```bash
|
133
|
+
# Use default profile, show output in terminal only
|
134
|
+
runbooks finops
|
135
|
+
|
136
|
+
# Use specific profiles 'dev' and 'prod'
|
137
|
+
runbooks finops --profiles dev prod
|
138
|
+
|
139
|
+
# Use all available profiles
|
140
|
+
runbooks finops --all
|
141
|
+
|
142
|
+
# Combine profiles from the same AWS account
|
143
|
+
runbooks finops --all --combine
|
144
|
+
|
145
|
+
# Specify custom regions to check for EC2 instances
|
146
|
+
runbooks finops --regions us-east-1 eu-west-1 ap-southeast-2
|
147
|
+
|
148
|
+
# View cost data for the last 30 days instead of current month
|
149
|
+
runbooks finops --time-range 30
|
150
|
+
|
151
|
+
# View cost data only for a specific tag (e.g., Team=DevOps)
|
152
|
+
runbooks finops --tag Team=DevOps
|
153
|
+
|
154
|
+
# View cost data for multiple tags (e.g., Team=DevOps and Env=Prod)
|
155
|
+
runbooks finops --tag Team=Devops Env=Prod
|
156
|
+
|
157
|
+
# Export data to CSV only
|
158
|
+
runbooks finops --all --report-name aws_dashboard_data --report-type csv
|
159
|
+
|
160
|
+
# Export data to JSON only
|
161
|
+
runbooks finops --all --report-name aws_dashboard_data --report-type json
|
162
|
+
|
163
|
+
# Export data to both CSV and JSON formats simultaneously
|
164
|
+
runbooks finops --all --report-name aws_dashboard_data --report-type csv json
|
165
|
+
|
166
|
+
# Export combined data for 'dev' and 'prod' profiles to a specific directory
|
167
|
+
runbooks finops --profiles dev prod --combine --report-name report --report-type csv --dir output_reports
|
168
|
+
|
169
|
+
# View cost trend analysis as bar charts for profile 'dev' and 'prod'
|
170
|
+
runbooks finops --profiles dev prod -r us-east-1 --trend
|
171
|
+
|
172
|
+
# View cost trend analysis for all cli profiles for a specific cost tag 'Team=DevOps'
|
173
|
+
runbooks finops --all --trend --tag Team=DevOps
|
174
|
+
|
175
|
+
# View audit report for profile 'dev' in region 'us-east-1'
|
176
|
+
runbooks finops -p dev -r us-east-1 --audit
|
177
|
+
|
178
|
+
# View audit report for profile 'dev' in region 'us-east-1' and export it as a pdf file to current working dir with file name 'Dev_Audit_Report'
|
179
|
+
runbooks finops -p dev -r us-east-1 --audit -n Dev_Audit_Report -y pdf
|
180
|
+
|
181
|
+
# Use a configuration file for settings
|
182
|
+
runbooks finops --config-file path/to/your_config.toml
|
183
|
+
# or
|
184
|
+
runbooks finops -C path/to/your_config.yaml
|
185
|
+
```
|
186
|
+
|
187
|
+
You'll see a live-updating table of your AWS account cost and usage details in the terminal. If export options are specified, a report file will also be generated upon completion.
|
188
|
+
|
189
|
+
---
|
190
|
+
|
191
|
+
## Using a Configuration File
|
192
|
+
|
193
|
+
Instead of passing all options via the command line, you can use a configuration file in TOML, YAML, or JSON format. Use the `--config-file` or `-C` option to specify the path to your configuration file.
|
194
|
+
|
195
|
+
Command-line arguments will always take precedence over settings defined in the configuration file.
|
196
|
+
|
197
|
+
Below are examples of how to structure your configuration file.
|
198
|
+
|
199
|
+
### TOML Configuration Example (`config.toml`)
|
200
|
+
|
201
|
+
```toml
|
202
|
+
# config.toml
|
203
|
+
profiles = ["dev-profile", "prod-profile"]
|
204
|
+
regions = ["us-east-1", "eu-west-2"]
|
205
|
+
combine = true
|
206
|
+
report_name = "monthly_finops_summary"
|
207
|
+
report_type = ["csv", "pdf"] # For cost dashboard. For audit, only PDF is used.
|
208
|
+
dir = "./reports/runbooks finops" # Defaults to present working directory
|
209
|
+
time_range = 30 # Defaults to 30 days
|
210
|
+
tag = ["CostCenter=Alpha", "Project=Phoenix"] # Optional
|
211
|
+
audit = false # Set to true to run audit report by default
|
212
|
+
trend = false # Set to true to run trend report by default
|
213
|
+
```
|
214
|
+
|
215
|
+
### YAML Configuration Example (`config.yaml` or `config.yml`)
|
216
|
+
|
217
|
+
```yaml
|
218
|
+
# config.yaml
|
219
|
+
profiles:
|
220
|
+
- dev-profile
|
221
|
+
- prod-profile
|
222
|
+
regions:
|
223
|
+
- us-east-1
|
224
|
+
- eu-west-2
|
225
|
+
combine: true
|
226
|
+
report_name: "monthly_finops_summary"
|
227
|
+
report_type:
|
228
|
+
- csv
|
229
|
+
- pdf # For cost dashboard. For audit, only PDF is used.
|
230
|
+
dir: "./reports/runbooks finops"
|
231
|
+
time_range: 30
|
232
|
+
tag:
|
233
|
+
- "CostCenter=Alpha"
|
234
|
+
- "Project=Phoenix"
|
235
|
+
audit: false # Set to true to run audit report by default
|
236
|
+
trend: false # Set to true to run trend report by default
|
237
|
+
```
|
238
|
+
|
239
|
+
### JSON Configuration Example (`config.json`)
|
240
|
+
|
241
|
+
```json
|
242
|
+
{
|
243
|
+
"profiles": ["dev-profile", "prod-profile"],
|
244
|
+
"regions": ["us-east-1", "eu-west-2"],
|
245
|
+
"combine": true,
|
246
|
+
"report_name": "monthly_finops_summary",
|
247
|
+
"report_type": ["csv", "pdf"], /* For cost dashboard. For audit, only PDF is used. */
|
248
|
+
"dir": "./reports/runbooks finops",
|
249
|
+
"time_range": 30,
|
250
|
+
"tag": ["CostCenter=Alpha", "Project=Phoenix"],
|
251
|
+
"audit": false, /* Set to true to run audit report by default */
|
252
|
+
"trend": false /* Set to true to run trend report by default */
|
253
|
+
}
|
254
|
+
```
|
255
|
+
---
|
256
|
+
|
257
|
+
## Export Formats
|
258
|
+
|
259
|
+
### CSV Output Format
|
260
|
+
|
261
|
+
When exporting to CSV, a file is generated with the following columns:
|
262
|
+
|
263
|
+
- `CLI Profile`
|
264
|
+
- `AWS Account ID`
|
265
|
+
- `Last Month Cost` (or previous period based on time range)
|
266
|
+
- `Current Month Cost` (or current period based on time range)
|
267
|
+
- `Cost By Service` (Each service and its cost appears on a new line within the cell)
|
268
|
+
- `Budget Status` (Each budget's limit and actual spend appears on a new line within the cell)
|
269
|
+
- `EC2 Instances` (Each instance state and its count appears on a new line within the cell)
|
270
|
+
|
271
|
+
**Note:** Due to the multi-line formatting in some cells, it's best viewed in spreadsheet software (like Excel, Google Sheets, LibreOffice Calc) rather than plain text editors.
|
272
|
+
|
273
|
+
### JSON Output Format
|
274
|
+
|
275
|
+
When exporting to JSON, a structured file is generated that includes all dashboard data in a format that's easy to parse programmatically.
|
276
|
+
|
277
|
+
### PDF Output Format (for Audit Report)
|
278
|
+
|
279
|
+
When exporting to PDF, a file is generated with the following columns:
|
280
|
+
|
281
|
+
- `Profile`
|
282
|
+
- `Account ID`
|
283
|
+
- `Untagged Resources`
|
284
|
+
- `Stopped EC2 Instances`
|
285
|
+
- `Unused Volumes`
|
286
|
+
- `Unused EIPs`
|
287
|
+
- `Budget Alerts`
|
288
|
+
|
289
|
+
---
|
290
|
+
|
291
|
+
## Cost For Every Run
|
292
|
+
|
293
|
+
This script makes API calls to AWS, primarily to Cost Explorer, Budgets, EC2, and STS. AWS may charge for Cost Explorer API calls (typically `$0.01` for each API call, check current pricing).
|
294
|
+
|
295
|
+
The number of API calls depends heavily on the options used:
|
296
|
+
|
297
|
+
- **Default dashboard when `--audit` or `--trend` flags not used**:
|
298
|
+
- It costs you $0.06 for one AWS Profile and $0.03 extra for each AWS profile queried.
|
299
|
+
- **Cost Trend dashboard when `--trend` flag is used**:
|
300
|
+
- It costs you $0.03 for each AWS profile queried.
|
301
|
+
- **Audit Dashboard when `--audit` flag is used**:
|
302
|
+
- Free
|
303
|
+
|
304
|
+
**To minimize API calls and potential costs:**
|
305
|
+
|
306
|
+
- Use the `--profiles` argument to specify only the profiles you need.
|
307
|
+
- Consider using the `--combine` option when working with multiple profiles from the same AWS account.
|
308
|
+
|
309
|
+
The exact cost per run is usually negligible but depends on the scale of your usage and AWS pricing.
|
310
|
+
|
311
|
+
---
|
312
|
+
|
313
|
+
## Contributing
|
314
|
+
|
315
|
+
Contributions are welcome! Feel free to fork and improve the project.
|
316
|
+
|
317
|
+
### Development Setup with pip
|
318
|
+
|
319
|
+
```bash
|
320
|
+
# cd src/runbooks/finops
|
321
|
+
|
322
|
+
## Run the tool
|
323
|
+
runbooks finops --help
|
324
|
+
```
|
325
|
+
|
326
|
+
### Development Setup with uv
|
327
|
+
|
328
|
+
`uv` provides a much faster development environment setup:
|
329
|
+
|
330
|
+
```bash
|
331
|
+
# cd src/runbooks/finops
|
332
|
+
|
333
|
+
# Run the tool
|
334
|
+
runbooks finops
|
335
|
+
```
|
336
|
+
|
337
|
+
---
|
runbooks/finops/__init__.py
CHANGED
@@ -29,15 +29,13 @@ from runbooks.finops.aws_client import (
|
|
29
29
|
)
|
30
30
|
|
31
31
|
# Data processors
|
32
|
-
from runbooks.finops.cost_processor import get_cost_data, get_trend
|
32
|
+
from runbooks.finops.cost_processor import export_to_csv, export_to_json, get_cost_data, get_trend
|
33
33
|
from runbooks.finops.dashboard_runner import run_dashboard
|
34
34
|
from runbooks.finops.helpers import (
|
35
35
|
export_audit_report_to_csv,
|
36
36
|
export_audit_report_to_json,
|
37
37
|
export_audit_report_to_pdf,
|
38
38
|
export_cost_dashboard_to_pdf,
|
39
|
-
export_to_csv,
|
40
|
-
export_to_json,
|
41
39
|
export_trend_data_to_json,
|
42
40
|
load_config_file,
|
43
41
|
)
|