use aws_ssm_bridge::{SessionConfig, SessionManager, SessionType};
use futures::StreamExt;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::from_default_env()
.add_directive(tracing::Level::INFO.into()),
)
.init();
let args: Vec<String> = std::env::args().collect();
if args.len() < 2 {
eprintln!("Usage: {} <instance-id> [region]", args[0]);
std::process::exit(1);
}
let instance_id = &args[1];
let region = args.get(2).cloned();
println!("Starting SSM session to {}", instance_id);
if let Some(ref r) = region {
println!("Region: {}", r);
}
let manager = SessionManager::new().await?;
let config = SessionConfig {
target: instance_id.clone(),
region,
session_type: SessionType::StandardStream,
document_name: None,
parameters: std::collections::HashMap::new(),
reason: Some("Example shell session".to_string()),
..Default::default()
};
let mut session = manager.start_session(config).await?;
println!("✓ Session started: {}", session.id());
let state = session.state().await;
println!(" State: {:?}", state);
let mut output = session.output();
let output_task = tokio::spawn(async move {
while let Some(data) = output.next().await {
print!("{}", String::from_utf8_lossy(&data));
}
});
println!("\nWaiting for session to be protocol-ready...");
let ready = session
.wait_for_ready(tokio::time::Duration::from_secs(30))
.await;
if !ready {
println!("⚠ Session did not become ready within timeout");
println!(" This may indicate the agent isn't responding with start_publication");
println!(" Protocol state: is_ready={}", session.is_ready());
} else {
println!("✓ Session protocol ready (can_send=true)");
}
println!("\nSending command: echo 'Hello from Rust!'");
session
.send(bytes::Bytes::from("echo 'Hello from Rust!'\n"))
.await?;
tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
session.send(bytes::Bytes::from("exit\n")).await?;
tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
println!("\nTerminating session...");
session.terminate().await?;
output_task.abort();
println!("✓ Session terminated successfully");
Ok(())
}