aws-bootstrap-g4dn 0.6.0__tar.gz → 0.8.0__tar.gz
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.
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/.pre-commit-config.yaml +2 -2
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/CLAUDE.md +19 -1
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/PKG-INFO +34 -1
- aws_bootstrap_g4dn-0.6.0/aws_bootstrap_g4dn.egg-info/PKG-INFO → aws_bootstrap_g4dn-0.8.0/README.md +31 -19
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/cli.py +411 -101
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/ec2.py +45 -8
- aws_bootstrap_g4dn-0.8.0/aws_bootstrap/output.py +106 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/ssh.py +21 -20
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/tests/test_cli.py +377 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/tests/test_ebs.py +90 -0
- aws_bootstrap_g4dn-0.8.0/aws_bootstrap/tests/test_output.py +192 -0
- aws_bootstrap_g4dn-0.6.0/README.md → aws_bootstrap_g4dn-0.8.0/aws_bootstrap_g4dn.egg-info/PKG-INFO +52 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap_g4dn.egg-info/SOURCES.txt +2 -0
- aws_bootstrap_g4dn-0.8.0/aws_bootstrap_g4dn.egg-info/requires.txt +4 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/pyproject.toml +5 -1
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/uv.lock +101 -21
- aws_bootstrap_g4dn-0.6.0/aws_bootstrap_g4dn.egg-info/requires.txt +0 -2
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/.github/workflows/ci.yml +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/.github/workflows/publish-to-pypi.yml +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/.gitignore +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/CODE_OF_CONDUCT.md +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/CONTRIBUTING.md +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/LICENSE +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/SECURITY.md +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/__init__.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/config.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/gpu.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/resources/__init__.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/resources/gpu_benchmark.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/resources/gpu_smoke_test.ipynb +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/resources/launch.json +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/resources/remote_setup.sh +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/resources/requirements.txt +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/resources/saxpy.cu +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/resources/tasks.json +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/tests/__init__.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/tests/test_config.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/tests/test_ec2.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/tests/test_gpu.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/tests/test_ssh_config.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/tests/test_ssh_ebs.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap/tests/test_ssh_gpu.py +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap_g4dn.egg-info/dependency_links.txt +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap_g4dn.egg-info/entry_points.txt +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/aws_bootstrap_g4dn.egg-info/top_level.txt +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/docs/nsight-remote-profiling.md +0 -0
- {aws_bootstrap_g4dn-0.6.0 → aws_bootstrap_g4dn-0.8.0}/setup.cfg +0 -0
|
@@ -17,7 +17,7 @@ repos:
|
|
|
17
17
|
- id: end-of-file-fixer
|
|
18
18
|
- id: trailing-whitespace
|
|
19
19
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
20
|
-
rev: v0.
|
|
20
|
+
rev: v0.15.0
|
|
21
21
|
hooks:
|
|
22
22
|
# Run the linter.
|
|
23
23
|
- id: ruff-check
|
|
@@ -28,7 +28,7 @@ repos:
|
|
|
28
28
|
rev: v1.19.0
|
|
29
29
|
hooks:
|
|
30
30
|
- id: mypy
|
|
31
|
-
additional_dependencies: [types-pyyaml>=6.0.12]
|
|
31
|
+
additional_dependencies: [types-pyyaml>=6.0.12, types-tabulate>=0.9]
|
|
32
32
|
- repo: local
|
|
33
33
|
hooks:
|
|
34
34
|
- id: pytest
|
|
@@ -13,6 +13,8 @@ Target workflows: Jupyter server-client, VSCode Remote SSH, and NVIDIA Nsight re
|
|
|
13
13
|
- **Python 3.12+** with **uv** package manager (astral-sh/uv) — used for venv creation, dependency management, and running the project
|
|
14
14
|
- **boto3** — AWS SDK for EC2 provisioning (AMI lookup, security groups, instance launch, waiters)
|
|
15
15
|
- **click** — CLI framework with built-in color support (`click.secho`, `click.style`)
|
|
16
|
+
- **pyyaml** — YAML serialization for `--output yaml`
|
|
17
|
+
- **tabulate** — Table formatting for `--output table`
|
|
16
18
|
- **setuptools + setuptools-scm** — build backend with git-tag-based versioning (configured in pyproject.toml)
|
|
17
19
|
- **AWS CLI v2** with a configured AWS profile (`AWS_PROFILE` env var or `--profile` flag)
|
|
18
20
|
- **direnv** for automatic venv activation (`.envrc` sources `.venv/bin/activate`)
|
|
@@ -34,6 +36,7 @@ aws_bootstrap/
|
|
|
34
36
|
config.py # LaunchConfig dataclass with defaults
|
|
35
37
|
ec2.py # AMI lookup, security group, instance launch/find/terminate, polling, spot pricing, EBS volume ops
|
|
36
38
|
gpu.py # GPU architecture mapping and GpuInfo dataclass
|
|
39
|
+
output.py # Output formatting: OutputFormat enum, emit(), echo/secho wrappers for structured output
|
|
37
40
|
ssh.py # SSH key pair import, SSH readiness check, remote setup, ~/.ssh/config management, GPU queries, EBS mount
|
|
38
41
|
resources/ # Non-Python artifacts SCP'd to remote instances
|
|
39
42
|
__init__.py
|
|
@@ -48,6 +51,7 @@ aws_bootstrap/
|
|
|
48
51
|
test_config.py
|
|
49
52
|
test_cli.py
|
|
50
53
|
test_ec2.py
|
|
54
|
+
test_output.py
|
|
51
55
|
test_gpu.py
|
|
52
56
|
test_ssh_config.py
|
|
53
57
|
test_ssh_gpu.py
|
|
@@ -62,10 +66,12 @@ Entry point: `aws-bootstrap = "aws_bootstrap.cli:main"` (installed via `uv sync`
|
|
|
62
66
|
|
|
63
67
|
## CLI Commands
|
|
64
68
|
|
|
69
|
+
**Global option:** `--output` / `-o` controls output format: `text` (default, human-readable with color), `json`, `yaml`, `table`. Structured formats (json/yaml/table) suppress all progress messages and emit machine-readable output. Commands requiring confirmation (`terminate`, `cleanup`) require `--yes` in structured modes.
|
|
70
|
+
|
|
65
71
|
- **`launch`** — provisions an EC2 instance (spot by default, falls back to on-demand on capacity errors); adds SSH config alias (e.g. `aws-gpu1`) to `~/.ssh/config`; `--python-version` controls which Python `uv` installs in the remote venv; `--ssh-port` overrides the default SSH port (22) for security group ingress, connection checks, and SSH config; `--ebs-storage SIZE` creates and attaches a new gp3 EBS data volume (mounted at `/data`); `--ebs-volume-id ID` attaches an existing EBS volume (mutually exclusive with `--ebs-storage`)
|
|
66
72
|
- **`status`** — lists all non-terminated instances (including `shutting-down`) with type, IP, SSH alias, EBS data volumes, pricing (spot price/hr or on-demand), uptime, and estimated cost for running spot instances; `--gpu` flag queries GPU info via SSH, reporting both CUDA toolkit version (from `nvcc`) and driver-supported max (from `nvidia-smi`); `--instructions` (default: on) prints connection commands (SSH, Jupyter tunnel, VSCode Remote SSH, GPU benchmark) for each running instance; suppress with `--no-instructions`
|
|
67
73
|
- **`terminate`** — terminates instances by ID or SSH alias (e.g. `aws-gpu1`, resolved via `~/.ssh/config`), or all aws-bootstrap instances in the region if no arguments given; removes SSH config aliases; deletes associated EBS data volumes by default; `--keep-ebs` preserves volumes and prints reattach commands
|
|
68
|
-
- **`cleanup`** — removes stale `~/.ssh/config` entries for terminated/non-existent instances; compares managed SSH config blocks against live EC2 instances; `--dry-run` previews removals without modifying config; `--yes` skips the confirmation prompt
|
|
74
|
+
- **`cleanup`** — removes stale `~/.ssh/config` entries for terminated/non-existent instances; compares managed SSH config blocks against live EC2 instances; `--include-ebs` also finds and deletes orphan EBS data volumes (volumes in `available` state whose linked instance no longer exists); `--dry-run` previews removals without modifying config; `--yes` skips the confirmation prompt
|
|
69
75
|
- **`list instance-types`** — lists EC2 instance types matching a family prefix (default: `g4dn`), showing vCPUs, memory, and GPU info
|
|
70
76
|
- **`list amis`** — lists available AMIs matching a name pattern (default: Deep Learning Base OSS Nvidia Driver GPU AMIs), sorted newest-first
|
|
71
77
|
|
|
@@ -94,6 +100,18 @@ uv run pytest
|
|
|
94
100
|
|
|
95
101
|
Use `uv add <package>` to add dependencies and `uv add --group dev <package>` for dev dependencies.
|
|
96
102
|
|
|
103
|
+
## Structured Output Architecture
|
|
104
|
+
|
|
105
|
+
The `--output` option uses a context-aware suppression pattern via `aws_bootstrap/output.py`:
|
|
106
|
+
|
|
107
|
+
- **`output.echo()` / `output.secho()`** — wrap `click.echo`/`click.secho`; silent in non-text modes. Used in `ec2.py` and `ssh.py` for progress messages.
|
|
108
|
+
- **`is_text(ctx)`** — checks if the current output format is text. Used in `cli.py` to guard text-only blocks.
|
|
109
|
+
- **`emit(data, headers=..., ctx=...)`** — dispatches structured data to JSON/YAML/table renderers. No-op in text mode.
|
|
110
|
+
- **CLI helper guards** — `step()`, `info()`, `val()`, `success()`, `warn()` in `cli.py` check `is_text()` and return early in structured modes.
|
|
111
|
+
- Each CLI command builds a result dict alongside existing logic, emits it via `emit()` for non-text formats, and falls through to text output for text mode.
|
|
112
|
+
- **Confirmation prompts** (`terminate`, `cleanup`) require `--yes` in structured modes to avoid corrupting output.
|
|
113
|
+
- The spot-fallback `click.confirm()` in `ec2.py` auto-confirms in structured modes.
|
|
114
|
+
|
|
97
115
|
## CUDA-Aware PyTorch Installation
|
|
98
116
|
|
|
99
117
|
`remote_setup.sh` detects the CUDA toolkit version on the instance (via `nvcc`, falling back to `nvidia-smi`) and installs PyTorch from the matching CUDA wheel index (`https://download.pytorch.org/whl/cu{TAG}`). This ensures `torch.version.cuda` matches the system's CUDA toolkit, which is required for compiling custom CUDA extensions with `nvcc`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aws-bootstrap-g4dn
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: Bootstrap AWS EC2 GPU instances for hybrid local-remote development
|
|
5
5
|
Author: Adam Ever-Hadani
|
|
6
6
|
License-Expression: MIT
|
|
@@ -15,6 +15,8 @@ Description-Content-Type: text/markdown
|
|
|
15
15
|
License-File: LICENSE
|
|
16
16
|
Requires-Dist: boto3>=1.35
|
|
17
17
|
Requires-Dist: click>=8.1
|
|
18
|
+
Requires-Dist: pyyaml>=6.0.3
|
|
19
|
+
Requires-Dist: tabulate>=0.9.0
|
|
18
20
|
Dynamic: license-file
|
|
19
21
|
|
|
20
22
|
# aws-bootstrap-g4dn
|
|
@@ -232,6 +234,30 @@ Then install the [Nsight VSCE extension](https://marketplace.visualstudio.com/it
|
|
|
232
234
|
|
|
233
235
|
See [Nsight remote profiling guide](docs/nsight-remote-profiling.md) for more details on CUDA debugging and profiling workflows.
|
|
234
236
|
|
|
237
|
+
### 📤 Structured Output
|
|
238
|
+
|
|
239
|
+
All commands support `--output` / `-o` for machine-readable output — useful for scripting, piping to `jq`, or LLM tool-use:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# JSON output (pipe to jq)
|
|
243
|
+
aws-bootstrap -o json status
|
|
244
|
+
aws-bootstrap -o json status | jq '.instances[0].instance_id'
|
|
245
|
+
|
|
246
|
+
# YAML output
|
|
247
|
+
aws-bootstrap -o yaml status
|
|
248
|
+
|
|
249
|
+
# Table output
|
|
250
|
+
aws-bootstrap -o table status
|
|
251
|
+
|
|
252
|
+
# Works with all commands
|
|
253
|
+
aws-bootstrap -o json list instance-types | jq '.[].instance_type'
|
|
254
|
+
aws-bootstrap -o json launch --dry-run
|
|
255
|
+
aws-bootstrap -o json terminate --yes
|
|
256
|
+
aws-bootstrap -o json cleanup --dry-run
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Supported formats: `text` (default, human-readable with color), `json`, `yaml`, `table`. Commands that require confirmation (`terminate`, `cleanup`) require `--yes` in structured output modes.
|
|
260
|
+
|
|
235
261
|
### 📋 Listing Resources
|
|
236
262
|
|
|
237
263
|
```bash
|
|
@@ -291,6 +317,12 @@ aws-bootstrap cleanup
|
|
|
291
317
|
# Preview what would be removed without modifying config
|
|
292
318
|
aws-bootstrap cleanup --dry-run
|
|
293
319
|
|
|
320
|
+
# Also find and delete orphan EBS data volumes
|
|
321
|
+
aws-bootstrap cleanup --include-ebs
|
|
322
|
+
|
|
323
|
+
# Preview orphan volumes without deleting
|
|
324
|
+
aws-bootstrap cleanup --include-ebs --dry-run
|
|
325
|
+
|
|
294
326
|
# Skip confirmation prompt
|
|
295
327
|
aws-bootstrap cleanup --yes
|
|
296
328
|
```
|
|
@@ -324,6 +356,7 @@ Key behaviors:
|
|
|
324
356
|
- New volumes are formatted as ext4; existing volumes are mounted as-is
|
|
325
357
|
- Volumes are tagged for automatic discovery by `status` and `terminate`
|
|
326
358
|
- `terminate` deletes data volumes by default; use `--keep-ebs` to preserve them
|
|
359
|
+
- **Orphan cleanup** — use `aws-bootstrap cleanup --include-ebs` to find and delete orphan volumes (e.g. from spot interruptions or forgotten `--keep-ebs` volumes). Use `--dry-run` to preview
|
|
327
360
|
- **Spot-safe** — data volumes survive spot interruptions. If AWS reclaims your instance, the volume detaches automatically and can be reattached to a new instance with `--ebs-volume-id`
|
|
328
361
|
- EBS volumes must be in the same availability zone as the instance
|
|
329
362
|
- Mount failures are non-fatal — the instance remains usable
|
aws_bootstrap_g4dn-0.6.0/aws_bootstrap_g4dn.egg-info/PKG-INFO → aws_bootstrap_g4dn-0.8.0/README.md
RENAMED
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: aws-bootstrap-g4dn
|
|
3
|
-
Version: 0.6.0
|
|
4
|
-
Summary: Bootstrap AWS EC2 GPU instances for hybrid local-remote development
|
|
5
|
-
Author: Adam Ever-Hadani
|
|
6
|
-
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/promptromp/aws-bootstrap-g4dn
|
|
8
|
-
Project-URL: Issues, https://github.com/promptromp/aws-bootstrap-g4dn/issues
|
|
9
|
-
Keywords: aws,ec2,gpu,cuda,deep-learning,spot-instances,cli
|
|
10
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
11
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
13
|
-
Requires-Python: >=3.12
|
|
14
|
-
Description-Content-Type: text/markdown
|
|
15
|
-
License-File: LICENSE
|
|
16
|
-
Requires-Dist: boto3>=1.35
|
|
17
|
-
Requires-Dist: click>=8.1
|
|
18
|
-
Dynamic: license-file
|
|
19
|
-
|
|
20
1
|
# aws-bootstrap-g4dn
|
|
21
2
|
|
|
22
3
|
--------------------------------------------------------------------------------
|
|
@@ -232,6 +213,30 @@ Then install the [Nsight VSCE extension](https://marketplace.visualstudio.com/it
|
|
|
232
213
|
|
|
233
214
|
See [Nsight remote profiling guide](docs/nsight-remote-profiling.md) for more details on CUDA debugging and profiling workflows.
|
|
234
215
|
|
|
216
|
+
### 📤 Structured Output
|
|
217
|
+
|
|
218
|
+
All commands support `--output` / `-o` for machine-readable output — useful for scripting, piping to `jq`, or LLM tool-use:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# JSON output (pipe to jq)
|
|
222
|
+
aws-bootstrap -o json status
|
|
223
|
+
aws-bootstrap -o json status | jq '.instances[0].instance_id'
|
|
224
|
+
|
|
225
|
+
# YAML output
|
|
226
|
+
aws-bootstrap -o yaml status
|
|
227
|
+
|
|
228
|
+
# Table output
|
|
229
|
+
aws-bootstrap -o table status
|
|
230
|
+
|
|
231
|
+
# Works with all commands
|
|
232
|
+
aws-bootstrap -o json list instance-types | jq '.[].instance_type'
|
|
233
|
+
aws-bootstrap -o json launch --dry-run
|
|
234
|
+
aws-bootstrap -o json terminate --yes
|
|
235
|
+
aws-bootstrap -o json cleanup --dry-run
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Supported formats: `text` (default, human-readable with color), `json`, `yaml`, `table`. Commands that require confirmation (`terminate`, `cleanup`) require `--yes` in structured output modes.
|
|
239
|
+
|
|
235
240
|
### 📋 Listing Resources
|
|
236
241
|
|
|
237
242
|
```bash
|
|
@@ -291,6 +296,12 @@ aws-bootstrap cleanup
|
|
|
291
296
|
# Preview what would be removed without modifying config
|
|
292
297
|
aws-bootstrap cleanup --dry-run
|
|
293
298
|
|
|
299
|
+
# Also find and delete orphan EBS data volumes
|
|
300
|
+
aws-bootstrap cleanup --include-ebs
|
|
301
|
+
|
|
302
|
+
# Preview orphan volumes without deleting
|
|
303
|
+
aws-bootstrap cleanup --include-ebs --dry-run
|
|
304
|
+
|
|
294
305
|
# Skip confirmation prompt
|
|
295
306
|
aws-bootstrap cleanup --yes
|
|
296
307
|
```
|
|
@@ -324,6 +335,7 @@ Key behaviors:
|
|
|
324
335
|
- New volumes are formatted as ext4; existing volumes are mounted as-is
|
|
325
336
|
- Volumes are tagged for automatic discovery by `status` and `terminate`
|
|
326
337
|
- `terminate` deletes data volumes by default; use `--keep-ebs` to preserve them
|
|
338
|
+
- **Orphan cleanup** — use `aws-bootstrap cleanup --include-ebs` to find and delete orphan volumes (e.g. from spot interruptions or forgotten `--keep-ebs` volumes). Use `--dry-run` to preview
|
|
327
339
|
- **Spot-safe** — data volumes survive spot interruptions. If AWS reclaims your instance, the volume detaches automatically and can be reattached to a new instance with `--ebs-volume-id`
|
|
328
340
|
- EBS volumes must be in the same availability zone as the instance
|
|
329
341
|
- Mount failures are non-fatal — the instance remains usable
|