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.1.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.1.0-cp38-abi3-win_amd64.whl (5.8 MB view details)

Uploaded CPython 3.8+Windows x86-64

aws_ssm_bridge-0.1.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.1.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.1.0.tar.gz.

File metadata

  • Download URL: aws_ssm_bridge-0.1.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.1.0.tar.gz
Algorithm Hash digest
SHA256 c4530c2278a6e24a24336e3cf6750655b8217a7af2686f1c395cc59c72295708
MD5 f6bc8d67c2abe1959aa41dd486e7ef7b
BLAKE2b-256 48a7a34992ec7a6f73b1747f17e3b218308d71be5eb481ec2d114b72d10523c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_ssm_bridge-0.1.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.1.0-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for aws_ssm_bridge-0.1.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 7813adbcb3732ec28286bbd48b65a74a82673f73ffeb3f5d4c2fcc0a3ffd3804
MD5 222639c4a6494fb20360081fbcee8297
BLAKE2b-256 8b4dd0c4198c4c02396a8b7925fcd4499663b658cff7ea0cf41105a9a060a812

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_ssm_bridge-0.1.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.1.0-cp38-abi3-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for aws_ssm_bridge-0.1.0-cp38-abi3-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 bd1c4de465e0b92431309cb2087ffea837c1296e64a47647fb37aed14ee19a8b
MD5 2654535d01893c728430e50519008bb6
BLAKE2b-256 59895b4b5b8bb7fd62eac470fbb27e35c84b793b32931e7b255297a0a4ae335a

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_ssm_bridge-0.1.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.1.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aws_ssm_bridge-0.1.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6300c54c4ffd582c6fc9bb1c8680f93d9ed23f13abd6a9a4dc8e550e01972a18
MD5 cf980dbc0412bbacf197ebe8b4b4ad0f
BLAKE2b-256 7fc12da6463164828ecea9cc50411d9d52e3517e3bfc435413c650a7158b6233

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_ssm_bridge-0.1.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