Skip to main content

Python bindings for AWS Systems Manager Session Manager protocol

Project description

aws-ssm-bridge

A Rust library implementing the AWS Systems Manager (SSM) Session Manager protocol with Python bindings.

License Rust Python unsafe


⚠️ Disclaimer

This project is not affiliated with, endorsed by, or sponsored by Amazon Web Services, Inc. or any of its affiliates.

This is an independent implementation of the SSM Session Manager protocol.


Overview

Unlike the official AWS Session Manager Plugin (a CLI binary written in Go), aws-ssm-bridge is a library designed for embedding in your applications.

Features

  • Binary Protocol: Full 116-byte AWS header, SHA-256 digest validation
  • Reliable Delivery: Sequence tracking, ACK/retransmission, RTT estimation (Jacobson/Karels)
  • Interactive Shell: Raw terminal mode, resize handling (SIGWINCH)
  • Port Forwarding: TCP tunneling via PortForwarder
  • Python Bindings: Async support via PyO3, type stubs included
  • Security: #![forbid(unsafe_code)], rate limiting, SSRF protection

Installation

Rust

[dependencies]
aws-ssm-bridge = "0.1"
tokio = { version = "1", features = ["full"] }

Python

pip install aws-ssm-bridge

Quick Start

Interactive Shell

use aws_ssm_bridge::interactive::{InteractiveShell, InteractiveConfig};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let config = InteractiveConfig::default();
    let mut shell = InteractiveShell::new(config)?;
    
    // Connect and run interactive session
    // Handles raw mode, resize (SIGWINCH), signals (Ctrl+C/D/Z)
    shell.connect("i-0123456789abcdef0").await?;
    shell.run().await?;
    Ok(())
}

Programmatic Session

use aws_ssm_bridge::{SessionManager, SessionConfig};
use futures::StreamExt;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let manager = SessionManager::new().await?;
    
    let mut session = manager.start_session(SessionConfig {
        target: "i-0123456789abcdef0".into(),
        ..Default::default()
    }).await?;
    
    let mut output = session.output();
    tokio::spawn(async move {
        while let Some(data) = output.next().await {
            print!("{}", String::from_utf8_lossy(&data));
        }
    });
    
    session.send(b"hostname\n").await?;
    tokio::time::sleep(std::time::Duration::from_secs(2)).await;
    session.terminate().await?;
    
    Ok(())
}

Port Forwarding

use aws_ssm_bridge::{SessionManager, PortForwardConfig, PortForwarder};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let manager = SessionManager::new().await?;
    
    let forwarder = PortForwarder::new(&manager, PortForwardConfig {
        target: "i-0123456789abcdef0".into(),
        local_port: 8080,
        remote_port: 80,
        ..Default::default()
    }).await?;
    
    println!("Forwarding localhost:8080 -> remote:80");
    forwarder.wait().await?;
    Ok(())
}

Python

import asyncio
from aws_ssm_bridge import SessionManager

async def main():
    manager = await SessionManager.new()
    
    async with await manager.start_session(target="i-0123456789abcdef0") as session:
        await session.send(b"hostname\n")
        async for chunk in await session.output():
            print(chunk.decode(), end="")

asyncio.run(main())

Type-Safe Documents

Use type-safe document wrappers instead of magic strings:

use aws_ssm_bridge::{SessionBuilder, documents::*};

// Port forwarding to instance
let session = SessionBuilder::new("i-xxx")
    .document(PortForwardingSession::builder()
        .remote_port(3306)
        .local_port(13306)
        .build())
    .build().await?;

// Port forwarding through bastion to RDS
let session = SessionBuilder::new("i-bastion")
    .document(PortForwardingToRemoteHost::new("mydb.rds.amazonaws.com", 3306))
    .build().await?;

// SSH over Session Manager
let session = SessionBuilder::new("i-xxx")
    .document(SshSession::new())
    .build().await?;

// Interactive command execution
let session = SessionBuilder::new("i-xxx")
    .document(InteractiveCommand::new("top"))
    .build().await?;

Documentation


Examples

Rust Examples (examples/)

Example Description
interactive_shell.rs Full interactive shell with raw mode, resize, signals
shell_session.rs Programmatic shell session (send commands, read output)
port_forwarding.rs TCP port forwarding through SSM
session_pool.rs Managing multiple concurrent sessions
reconnecting.rs Auto-reconnection with exponential backoff
metrics_session.rs Session with observability hooks

Run with: cargo run --example interactive_shell -- i-0123456789abcdef0

Python Examples (python_examples/)

Example Description
interactive_shell.py Full interactive shell with raw terminal mode
shell_session.py Basic shell session with context manager
port_forwarding.py TCP port forwarding
multiple_sessions.py Concurrent sessions to multiple instances

Run with: python python_examples/interactive_shell.py i-0123456789abcdef0


Architecture

src/
├── lib.rs              # Public API
├── binary_protocol.rs  # 116-byte header, SHA-256
├── session.rs          # Session lifecycle
├── connection.rs       # WebSocket, retransmit
├── ack.rs              # ACK tracking, RTT
├── handshake.rs        # 3-phase handshake
├── port_forward.rs     # TCP tunneling
├── rate_limit.rs       # Token bucket
└── python/             # PyO3 bindings

Security

  • #![forbid(unsafe_code)]
  • SSRF protection (AWS endpoint validation)
  • Rate limiting (configurable token bucket)
  • TLS required (WSS only)
  • AWS transport encryption (all SSM traffic is encrypted)

See Security Documentation for threat model and details.


License

MIT License. See LICENSE.

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

aws_ssm_bridge-0.2.0.tar.gz (818.4 kB view details)

Uploaded Source

Built Distributions

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

aws_ssm_bridge-0.2.0-cp38-abi3-win_amd64.whl (5.8 MB view details)

Uploaded CPython 3.8+Windows x86-64

aws_ssm_bridge-0.2.0-cp38-abi3-manylinux_2_39_x86_64.whl (8.4 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.39+ x86-64

aws_ssm_bridge-0.2.0-cp38-abi3-macosx_11_0_arm64.whl (5.6 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

File details

Details for the file aws_ssm_bridge-0.2.0.tar.gz.

File metadata

  • Download URL: aws_ssm_bridge-0.2.0.tar.gz
  • Upload date:
  • Size: 818.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aws_ssm_bridge-0.2.0.tar.gz
Algorithm Hash digest
SHA256 b481d31a32f9a46372b7350201c5d7bcfc989cd654b74c5a779baabd72e0c7e4
MD5 75b25bedb3d10eaf2f32c66568b99b25
BLAKE2b-256 85c3150f3463a65b5f46e7fe20b5e7bf19aa1d9075d83cbf646aba0e8674d6e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_ssm_bridge-0.2.0.tar.gz:

Publisher: release.yml on hupe1980/aws-ssm-bridge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aws_ssm_bridge-0.2.0-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for aws_ssm_bridge-0.2.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 19d390e73fb47e29fc2785cfbb52554dfa8e631fd7f1fcae0a97593d3599368c
MD5 dd467f2c1717a56005305bf1dad48b2f
BLAKE2b-256 ebb43abaf1d08b482b83bec896440ad810d68c82374288f7f9e592d2a973571b

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_ssm_bridge-0.2.0-cp38-abi3-win_amd64.whl:

Publisher: release.yml on hupe1980/aws-ssm-bridge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aws_ssm_bridge-0.2.0-cp38-abi3-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for aws_ssm_bridge-0.2.0-cp38-abi3-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 146105f06f01a51814b592b1a9976afb2e1ac5bf04c3efa4906a28a875d5ea96
MD5 0e06357aee1bce7e7d77365b0b92c0f0
BLAKE2b-256 d6db0b577a36a17264666b306c55319ec91bc894b4699032a86a5c549fa6cd73

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_ssm_bridge-0.2.0-cp38-abi3-manylinux_2_39_x86_64.whl:

Publisher: release.yml on hupe1980/aws-ssm-bridge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aws_ssm_bridge-0.2.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aws_ssm_bridge-0.2.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 465725576f2bde3cbc66e6ed90e573a5b1f7f3dc43bb86011579b1d0dacc0dd1
MD5 92c7dad24c75506baa677fef99acea43
BLAKE2b-256 5e44655cc870b188f91ea7e77f2a5263d09b4cb02feec110f2313387242e5b2c

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_ssm_bridge-0.2.0-cp38-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on hupe1980/aws-ssm-bridge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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