from __future__ import annotations
from ._internal import (
InteractiveShell,
OutputStream,
PortForwarder,
Session,
SessionManager,
SsmAwsError,
SsmClosedError,
SsmCryptoError,
SsmError,
SsmProtocolError,
SsmTimeoutError,
SsmTransportError,
__version__,
configure_logging,
)
__all__ = [
"SessionManager",
"Session",
"OutputStream",
"PortForwarder",
"InteractiveShell",
"configure_logging",
"connect",
"run_command",
"SsmError",
"SsmAwsError",
"SsmProtocolError",
"SsmTransportError",
"SsmClosedError",
"SsmCryptoError",
"SsmTimeoutError",
"__version__",
]
async def connect(target: str, *, region: str | None = None, reason: str | None = None) -> Session:
manager = await SessionManager.new(region=region)
return await manager.start_session(target, reason=reason)
async def run_command(
target: str,
command: str,
*,
region: str | None = None,
timeout: float = 30.0,
) -> str:
import asyncio
manager = await SessionManager.new(region=region)
session = await manager.start_session(
target,
document_name="AWS-StartNonInteractiveCommand",
parameters={"command": [command]},
)
async def collect() -> str:
chunks = []
async for chunk in session.output():
chunks.append(chunk)
return b"".join(chunks).decode(errors="replace")
try:
await session.wait_ready()
return await asyncio.wait_for(collect(), timeout=timeout)
except asyncio.TimeoutError:
return ""
finally:
await session.terminate()