Hyperpod Ssm
AWS LabsOfficialPublished by AWS Labs
- Skill
- Tool integration
- Cloud and DevOps
- Apache-2.0
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The hyperpod-ssm skill serves as the primary interface for interacting with SageMaker HyperPod cluster nodes, as direct SSH access is unavailable. It leverages AWS Systems Manager (SSM) to facilitate remote command execution, file uploads, and file retrieval. The skill includes a set of helper scripts to resolve cluster information, list nodes, and manage SSM sessions, ensuring that users can perform diagnostics, install packages, and manage node-level operations effectively.
What it does
- Executes shell commands on specific HyperPod cluster nodes.
- Transfers files to and from cluster nodes.
- Resolves cluster IDs and retrieves node lists for targeting.
- Provides diagnostic command templates for system monitoring.
- Handles SSM session management and output buffering requirements.
When to use it
- When you need to run diagnostics or install packages on HyperPod nodes.
- When you need to upload configuration files or scripts to cluster instances.
- When you need to retrieve logs or output files from a specific node.
- When you need to perform administrative tasks that require shell access.
Advantages
- Enables secure, shell-level access to nodes where SSH is disabled.
- Automates the complex target formatting required for HyperPod SSM sessions.
- Includes built-in handling for common SSM output buffering issues.
- Provides a consistent interface for managing large-scale cluster operations.
Usage examples
- “Run nvidia-smi on all nodes in the cluster named my-cluster.”
- The agent will use list-nodes.sh to identify all instances and then iterate through them using ssm-exec.sh to execute the nvidia-smi command.
- “Upload a local script setup.sh to instance i-0123456789abcdef0 in my-cluster.”
- The agent will resolve the target ID and use the --upload flag in ssm-exec.sh to transfer the file to the specified node.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/awslabs/hyperpod-ssm/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip hyperpod-ssm.zip -d .agents/skills
Documentation by AWS Labs
HyperPod SSM Access
Prerequisites
awsCLI v2, authenticated for the target account/Region.session-manager-plugin— installed alongside the AWS CLI.jq— the scripts build JSON payloads with it.unbuffer(from theexpectpackage) — wrapsaws ssm start-sessionwith a PTY so the session-manager-plugin flushes stdout instead of racing to close. Without it, calls intermittently return empty output withCannot perform start session: EOFeven when the command ran. Install withsudo yum install expect,sudo apt install expect, orbrew install expect.ssm-exec.shdetects and uses it automatically; falls back with a warning if missing.
SSM Target Format
Target: sagemaker-cluster:<CLUSTER_ID>_<GROUP_NAME>-<INSTANCE_ID>
CLUSTER_ID: Last segment of cluster ARN (NOT the cluster name). Extract viaget-cluster-info.sh.GROUP_NAME: Instance group name — retrieve vialist-nodes.sh.INSTANCE_ID: EC2 instance ID (e.g.,i-0123456789abcdef0)
Scripts
Three scripts under scripts/. Resolve cluster info and nodes once, then execute per node.
get-cluster-info.sh — Resolve cluster name → ID (call once)
scripts/get-cluster-info.sh CLUSTER_NAME [--region REGION]
# Output: {"cluster_id":"...","cluster_arn":"...","cluster_name":"...","region":"..."}list-nodes.sh — List all nodes with pagination (call once)
scripts/list-nodes.sh CLUSTER_NAME [--region REGION] [--instance-group GROUP] [--instance-id ID]
# Output: JSON array of ClusterNodeSummaries (InstanceId, InstanceGroupName, InstanceStatus, etc.)list-cluster-nodes paginates at 100 nodes. This script handles pagination automatically.
ssm-exec.sh — Execute command on a node (call per node)
# Execute — with pre-built target
scripts/ssm-exec.sh --target "sagemaker-cluster:CLUSTERID_GROUP-INSTANCEID" 'command' [--region REGION]
# Execute — with parts
scripts/ssm-exec.sh --cluster-id ID --group GROUP --instance-id INSTANCE_ID 'command' [--region REGION]
# Upload
scripts/ssm-exec.sh --target TARGET --upload LOCAL_PATH REMOTE_PATH [--region REGION]
# Read remote file
scripts/ssm-exec.sh --target TARGET --read REMOTE_PATH [--region REGION]Running Commands Across Many Nodes
SSM start-session rate limit: 3 TPS per account. Plan batch size and delay accordingly.
aws ssm send-command does NOT support sagemaker-cluster: targets — only start-session works.
Manual SSM Commands
When the scripts aren't suitable, use aws ssm start-session directly with AWS-StartNonInteractiveCommand. Wrap every invocation in unbuffer — without it, stdout is intermittently empty (see Prerequisites).
cat > /tmp/cmd.json << 'EOF'
{"command": ["bash -c 'echo hello && whoami'"]}
EOF
unbuffer aws ssm start-session \
--target sagemaker-cluster:{CLUSTER_ID}_{GROUP_NAME}-{INSTANCE_ID} \
--region REGION \
--document-name AWS-StartNonInteractiveCommand \
--parameters file:///tmp/cmd.jsonAlways use a JSON file for
--parameters— inline parameters break with special characters.The document's
commandparameter is argv, not shell input. Wrap multi-statement scripts inbash -c '...'so pipes, semicolons, and redirects evaluate.
Common Diagnostic Commands
| Task | Command |
|---|---|
| Lifecycle logs | cat /var/log/provision/provisioning.log |
| Memory | free -h |
| Disk/mounts | df -h && lsblk |
| GPU status | nvidia-smi |
| GPU memory | nvidia-smi --query-gpu=memory.used,memory.total --format=csv |
| EFA/network | fi_info -p efa |
| CloudWatch agent | sudo systemctl status amazon-cloudwatch-agent |
| Top processes | ps aux --sort=-%mem | head -20 |
Key Details
Default SSM non-interactive user is
root.SSM rate limit: 3 TPS per account.
For interactive sessions (rare), omit
--document-nameto get a shell.Interactive commands (vim, top) are not supported via
AWS-StartNonInteractiveCommand.Large outputs may be truncated by SSM.
For troubleshooting common errors, see references/troubleshooting.md.
Files
- ATTRIBUTION.mdAdded by AutoGineer908 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer89 B
- SKILL.md5.1 KiB
- references/troubleshooting.md2.0 KiB
- scripts/get-cluster-info.shScript983 B
- scripts/list-nodes.shScript1.6 KiB
- scripts/ssm-exec.shScript4.4 KiB
scripts/ssm-exec.sh
#!/usr/bin/env bash
# Execute SSM command on a HyperPod node using a pre-resolved target
# Usage:
# Execute: ./ssm-exec.sh --target TARGET 'command' [--region REGION]
# Upload: ./ssm-exec.sh --target TARGET --upload LOCAL_PATH REMOTE_PATH [--region REGION]
# Read: ./ssm-exec.sh --target TARGET --read REMOTE_PATH [--region REGION]
#
# Target format: sagemaker-cluster:<CLUSTER_ID>_<GROUP_NAME>-<INSTANCE_ID>
# Build target from parts: use --cluster-id, --group, --instance-id instead of --target
set -euo pipefail
command -v jq >/dev/null 2>&1 || { echo "Error: jq is required but not installed" >&2; exit 1; }
REGION="${AWS_DEFAULT_REGION:-us-west-2}"
TARGET="" ; CLUSTER_ID="" ; GROUP="" ; INSTANCE_ID=""
MODE="exec" ; CMD="" ; LOCAL_PATH="" ; REMOTE_PATH=""
while [[ $# -gt 0 ]]; do
case "$1" in
--target) TARGET="$2"; shift 2 ;;
--cluster-id) CLUSTER_ID="$2"; shift 2 ;;
--group) GROUP="$2"; shift 2 ;;
--instance-id) INSTANCE_ID="$2"; shift 2 ;;
--upload) MODE="upload"; LOCAL_PATH="$2"; REMOTE_PATH="$3"; shift 3 ;;
--read) MODE="read"; REMOTE_PATH="$2"; shift 2 ;;
--region) REGION="$2"; shift 2 ;;
-*) echo "Unknown option: $1" >&2; exit 1 ;;
*) [[ -n "$CMD" ]] && { echo "Error: Unexpected argument: $1 (command already set)" >&2; exit 1; }
CMD="$1"; shift ;;
esac
done
# Build target from parts if --target not provided
if [[ -z "$TARGET" ]]; then
[[ -z "$CLUSTER_ID" || -z "$GROUP" || -z "$INSTANCE_ID" ]] && \
echo "Error: Provide --target or all of --cluster-id, --group, --instance-id" >&2 && exit 1
TARGET="sagemaker-cluster:${CLUSTER_ID}_${GROUP}-${INSTANCE_ID}"
fi
TMPFILE=$(mktemp "${TMPDIR:-/tmp}/ssm-cmd-XXXXXXXXXX.json")
chmod 600 "$TMPFILE"
trap 'rm -f "$TMPFILE"' EXIT
# Cross-platform base64 encode with no line wrapping (GNU: -w0, macOS: -b0)
# Usage: b64_encode FILE or cmd | b64_encode
b64_encode() {
if base64 --help 2>&1 | grep -q '\-w'; then
if [[ $# -gt 0 ]]; then base64 -w 0 "$1"; else base64 -w 0; fi
else
if [[ $# -gt 0 ]]; then base64 -b 0 -i "$1"; else base64 -b 0; fi
fi
}
json_cmd() {
local cmd="$1"
jq -n --arg c "$cmd" '{"command":[$c]}'
}
safe_quote() {
# Shell-safe quoting via jq @sh (handles all special characters)
jq -n --arg s "$1" '$s | @sh' -r
}
case "$MODE" in
exec)
[[ -z "$CMD" ]] && echo "Error: No command specified" >&2 && exit 1
json_cmd "$CMD" > "$TMPFILE"
;;
upload)
[[ ! -f "$LOCAL_PATH" ]] && echo "Error: Local file not found: $LOCAL_PATH" >&2 && exit 1
SAFE_REMOTE=$(safe_quote "$REMOTE_PATH")
ENCODED=$(b64_encode "$LOCAL_PATH")
# Compress large files to stay within SSM command limits (~64KB)
if [[ ${#ENCODED} -gt 8000 ]]; then
ENCODED=$(gzip -c "$LOCAL_PATH" | b64_encode)
# ENCODED is base64 (only A-Za-z0-9+/=), safe inside single quotes
json_cmd "echo '${ENCODED}' | base64 -d | gunzip > ${SAFE_REMOTE}" > "$TMPFILE"
else
# ENCODED is base64 (only A-Za-z0-9+/=), safe inside single quotes
json_cmd "echo '${ENCODED}' | base64 -d > ${SAFE_REMOTE}" > "$TMPFILE"
fi
;;
read)
SAFE_REMOTE=$(safe_quote "$REMOTE_PATH")
json_cmd "cat ${SAFE_REMOTE}" > "$TMPFILE"
;;
esac
# The session-manager-plugin races against stdout when it writes to a pipe:
# under "Cannot perform start session: EOF" it closes before flushing, so the
# caller intermittently sees empty stdout even when the command ran. Running
# under `unbuffer` (expect) attaches a PTY, which forces line-buffered I/O
# and eliminates the race. See https://github.com/aws/amazon-ssm-agent/issues/358.
# If `unbuffer` isn't on PATH, fall back to the bare invocation.
if command -v unbuffer >/dev/null 2>&1; then
exec unbuffer aws ssm start-session \
--target "$TARGET" \
--region "$REGION" \
--document-name AWS-StartNonInteractiveCommand \
--parameters "file://$TMPFILE"
else
echo "Warning: 'unbuffer' (from the 'expect' package) is not installed." >&2
echo " Without it, 'aws ssm start-session' will intermittently return empty" >&2
echo " stdout with 'Cannot perform start session: EOF'." >&2
echo " Install with: sudo yum install expect | sudo apt install expect | brew install expect" >&2
exec aws ssm start-session \
--target "$TARGET" \
--region "$REGION" \
--document-name AWS-StartNonInteractiveCommand \
--parameters "file://$TMPFILE"
fi
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
What our scanner noticed· Low risk
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS Labs
- Publisher
- AWS Labs (Official)
- Source
- awslabs/agent-plugins · plugins/sagemaker-ai/skills/hyperpod-ssm · commit fbefb37
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by AWS Labs or AWS Labs.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download hyperpod-ssm.zip