send-ssh-public-key と ssm start-session の合わせ技

以前、「SSM Session Manager 経由での SSH」で、Public IP address を持たない EC2 Instance に対して SSH 接続する方法を確認したが、SSM の Session Manager だけでは事前に EC2 Instance 側に Public Key が登録されている必要があった。

しかし、今回 Public Key の登録されていない Instance に SSH したくなった。確か、一時的な Public Key を登録する機能があったよな、ということでメモっておく。

一時的な Public Key を送った後に Session Manger を使って接続すれば今回やりたいことができる。

Public Key の登録は aws ec2-instance-connect send-ssh-public-key コマンドで行う。

aws ec2-instance-connect send-ssh-public-key \
  --instance-id i-xxxxxxxxxxxxxxxxx \
  --instance-os-user ec2-user \
  --availability-zone ap-northeast-1c \
  --ssh-public-key file://$HOME/.ssh/id_rsa.pub

わざわざ --availability-zone を指定しなくてはならないというのが面倒だが Instance Id から取ってくる wrapper を書く。

aws ec2 describe-instances \
  --instance-ids i-xxxxxxxxxxxxxxxxx \
  --query 'Reservations[0].Instances[0].Placement.AvailabilityZone' \
  --output text

send-ssh-public-key で登録した Public Key は 60 秒間だけ有効なのでその間に SSM の Session Manager で接続します。これは「SSM Session Manager 経由での SSH」で書いた通りで ~/.ssh/config に次の様に書いておけば ssh ec2-user@i-xxxxxxxxxxxxxxxxx で接続できます。

host i-* mi-*
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

とりあえずこんな wrapper で

#!/bin/bash

instance_id=$1
user=ec2-user

if [ -z "$instance_id" ] ; then
  echo "Usage: ssmssh [username@]instance_id" 1>&2
  exit 1
fi

echo $instance_id | grep -q @
if [ $? -eq 0 ] ; then
  user=$(echo $instance_id | cut -d @ -f 1)
  instance_id=$(echo $instance_id | cut -d @ -f 2)
fi

echo $instance_id | grep -q ^i-
if [ $? -ne 0 ] ; then
  echo "invalid instance id: $instance_id" 1>&2
  exit 2
fi

echo "Getting availability zone of instance" 1>&2
az=$(aws ec2 describe-instances \
  --instance-ids $instance_id \
  --query 'Reservations[0].Instances[0].Placement.AvailabilityZone' \
  --output text
)

echo "Sending ssh public key" 1>&2
aws ec2-instance-connect send-ssh-public-key \
  --instance-id $instance_id \
  --instance-os-user $user \
  --availability-zone $az \
  --ssh-public-key file://$HOME/.ssh/id_rsa.pub

echo "exec ssh $user@$instance_id" 1>&2
exec ssh $user@$instance_id
Built with Hugo
テーマ StackJimmy によって設計されています。