Skip to main content

A CLI for developers to easily manage AWS EC2 development servers.

Project description

ec2ctl: Effortless EC2 Instance Control

Python Version PyPI Version License

Read this in other languages: 한국어 | English


Tired of logging into AWS Console just to start your EC2 instance and copy the IP again?

ec2ctl is a lightweight CLI tool built for developers who use EC2 as a dev environment — turning it on/off frequently to save costs — and want a faster, simpler way to manage it.
No more digging through the console or copying dynamic IPs manually.

Table of Contents

Purpose

Many developers use EC2 as a lightweight development server — spinning it up only when needed to reduce AWS bills.
But starting/stopping instances manually via the AWS Console can be a hassle, and changing public IPs makes SSH access even more tedious.

ec2ctl eliminates that friction. It lets you:

  • Start/stop EC2 instances with a single, memorable command
  • Connect via SSH without worrying about changing IPs
  • Group and manage instances in a config file for fast lookup
  • Skip the AWS Console entirely for routine tasks

All with a simple YAML config and clean CLI UX.

Features

  • Intuitive Commands: ec2ctl start dev-server, ec2ctl stop all, ec2ctl status backend-group.
  • Flexible Configuration: Manage instances by name or group using a simple config.yaml file.
  • Enhanced User Experience: Supports --dry-run, --verbose, and --yes options.
  • Robust Error Handling: Provides clear messages for AWS authentication, instance state, and configuration issues.
  • SSH Connection: Connect directly to instances, with optional automatic stopping on disconnect.

Installation

Prerequisites

  • Python 3.7+
  • pip (Python package installer)
  • AWS CLI configured with your credentials (aws configure)

Install ec2ctl

You can install ec2ctl directly from PyPI using pip:

pip install ec2ctl

For Development

If you plan to contribute or modify the source code, you can install it in editable mode:

git clone https://github.com/eehwan/ec2-control.git
cd ec2-control
pip install -e .

This allows changes to the source code to be immediately reflected without reinstallation.

Configuration

ec2ctl uses a YAML configuration file located at ~/.ec2ctl/config.yaml. You can generate a default configuration file by running:

ec2ctl init

config.yaml Structure

default_profile: default
default_region: ap-northeast-2

instances:
  dev-server:
    id: i-0abc1234567890
    ssh_user: ec2-user
    ssh_key_path: ~/.ssh/id_rsa
    ssh_port: 2222 # Optional SSH port
  backend-api:
    - id: i-01aaa111aaa
      ssh_user: ubuntu
      ssh_key_path: ~/.ssh/backend_key.pem
    - id: i-01bbb222bbb
      ssh_user: ubuntu
      ssh_key_path: ~/.ssh/backend_key.pem
  staging: i-0123staging456 # Simple ID definition still supported
  • default_profile: (Optional) Your default AWS profile name. Defaults to default.
  • default_region: (Optional) Your default AWS region. Defaults to ap-northeast-2.
  • instances: A map of instance names or group names to their corresponding EC2 instance IDs and optional SSH details.
    • Single instance with SSH details: dev-server: { id: ..., ssh_user: ..., ssh_key_path: ..., ssh_port: ... }
    • Instance group with SSH details: backend-api: [ { id: ..., ssh_user: ..., ssh_key_path: ... }, ... ]
    • Simple ID definition is still supported: staging: i-0123staging456

Usage

All commands support --profile, --region, --dry-run, and --verbose options. Commands that modify state also support --yes (-y).

ec2ctl init [--yes]

Initializes the default config.yaml file.

ec2ctl init
# Overwrite without confirmation
ec2ctl init --yes

ec2ctl list

Lists all EC2 instances and groups configured in ~/.ec2ctl/config.yaml.

ec2ctl list

ec2ctl start [name|group]

Starts the specified EC2 instance(s).

ec2ctl start dev-server
ec2ctl start backend-api

ec2ctl stop [name|group]

Stops the specified EC2 instance(s).

ec2ctl stop dev-server
ec2ctl stop backend-api

ec2ctl status [name|group|all]

Gets the current status of the specified EC2 instance(s).

ec2ctl status dev-server
ec2ctl status all

ec2ctl connect [name] [--user USER] [--key KEY_PATH] [--port PORT] [--keep-running]

Connects to an EC2 instance via SSH, starting it if necessary. By default, the instance will be stopped when the SSH session disconnects.

  • name: The name of the instance or group as defined in config.yaml.
  • --user USER: Override the SSH user defined in config.
  • --key KEY_PATH: Override the path to the SSH private key file defined in config.
  • --port PORT: Override the SSH port defined in config.
  • --keep-running: Keep the instance running after the SSH session disconnects.
# Connect to dev-server, stop on disconnect (default)
ec2ctl connect dev-server

# Connect to dev-server with a specific port
ec2ctl connect dev-server --port 2222

# Connect to dev-server, keep running on disconnect
ec2ctl connect dev-server --keep-running

# Connect with overridden user and key
ec2ctl connect dev-server --user admin --key ~/.ssh/my_custom_key.pem

Error Handling & Troubleshooting

ec2ctl provides informative error messages for common issues:

  • Config file not found: Run ec2ctl init to create the default configuration.
  • Instance/Group not found: Ensure the name is correctly spelled and defined in config.yaml.
  • AWS Authentication/Authorization issues: Check your AWS CLI configuration (aws configure) and IAM policies (e.g., ec2:StartInstances, ec2:StopInstances, ec2:DescribeInstances).
  • Incorrect Instance State: Attempting to start an already running instance, or stop an already stopped instance.
  • SSH Connection Issues: Ensure the instance has a public IP, security groups allow SSH (port 22), and the SSH key path/permissions are correct.

Contributing

Contributions are welcome! Please feel free to open issues or submit pull requests.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ec2ctl-0.1.2.tar.gz (10.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ec2ctl-0.1.2-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file ec2ctl-0.1.2.tar.gz.

File metadata

  • Download URL: ec2ctl-0.1.2.tar.gz
  • Upload date:
  • Size: 10.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for ec2ctl-0.1.2.tar.gz
Algorithm Hash digest
SHA256 c1f7d929d31548f0e484971950858b41f76cb0791d1f0d4874c194ce4674b1a5
MD5 5c7f0932ef149090e7a86740b43d9e43
BLAKE2b-256 3ff14e5628fe73a5fa23c47eef19341e9bd1c94cfe018f2e0f68a4951e42f11c

See more details on using hashes here.

File details

Details for the file ec2ctl-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: ec2ctl-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 9.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for ec2ctl-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 a4133e69010383655423c477432859e8e111bf9e15b35e3c2e8d8378de3493a2
MD5 981bc5541a11a122c6e620b44ea9b3e5
BLAKE2b-256 9bfed661bfb2566dc8fa65a5220289ff77908c49d711fff1a1c682487ee43989

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page