概要

IPアドレス非固定のEC2インスタンスへのアクセスを簡単にするときのメモ
踏み台サーバ経由で各インスタンスに接続する

前提条件

  • EC2インスタンスにNameタグをつけておく
  • セキュリティグループでグループ間の全てのインバウンド接続を許可しておく
  • 踏み台サーバの外部ネットワークからのssh接続を許可、普通にssh接続できる状態を確保

やり方

以下のファイルを作成

#!/bin/bash

PROXY_HOST=$1
SSH_COMMAND="ssh ${PROXY_HOST}"

DESCRIBE_COMMAND=$(cat << EOS
aws ec2
  --output text
    describe-instances
  --filters
    'Name=instance-state-name,Values=running'
  --query
    'sort_by(Reservations[].Instances[].{InstanceId:InstanceId,Tags:Tags[?Key==\`Name\`].Value|[0],InstanceType:InstanceType,State:State.Name,Ip:PrivateIpAddress},&Tags)'
EOS
)


IP=()
COUNT=1
IFS=$'\n'

SERVER_LIST=$(eval $DESCRIBE_COMMAND)

for line in $SERVER_LIST; do
    IFS=$'\t'
    set -- $line
    IP=("${IP[@]}" $3)
    LIST=$LIST"$COUNT: $5 $3 $4 $1 $2\n"
    (( COUNT++ ))
done
RET=$(echo -e "$LIST" | column -t -s " ")

if type peco > /dev/null 2>&1 ; then
    SELECTED="$(echo $RET | peco)"
    IFS=$':'
    set -- $SELECTED
    ITEM=$1
else
    echo $RET
    echo -n "number? : "
    read ITEM
fi

if expr "$ITEM" : '[0-9]*' > /dev/null ; then
    if [ 1 -le "$ITEM" -a "$ITEM" -le $COUNT ]; then
        (( ITEM-- ))
        eval "${SSH_COMMAND}"/"${IP[$ITEM]}"
    fi
fi

以下のエントリを追加

Host *
  ServerAliveInterval 120
  TCPKeepAlive yes
Host */*
  ProxyCommand ssh -W "$(basename "%h")":%p "$(dirname "%h")"
  IdentityFile ~/.ssh/id_rsa.ec2
  User         ec2-user

コマンドを実行

$ ec2ssh fgrate.com

fgrate.com は踏み台サーバ
pecoが立ち上がってインスタンスに付与されたタグから選択して接続できる