EC2にSSHするときのメモ


概要

EC2にお気軽に接続するためのメモ

手順

依存パッケージのインストール

$ brew install direnv awscli peco

環境変数の設定

direnvを使ってプロジェクトごとに環境変数を設定する
プロジェクトのルートに下記のファイルを作成

.env

AWS_ACCESS_KEY_ID: <YOUR_AWS_ACCESS_KEY_ID>
AWS_SECRET_ACCESS_KEY: <YOUR_AWS_SECRET_ACCESS_KEY>
AWS_REGION: ap-northeast-1

AWS_DEFAULT_REGION: ap-northeast-1
AWS_DEFAULT_GATEWAY: manage.myapp.dev

.envrc

if [ "$(type -t direnv_load)" = 'function' ]; then
  dotenv
fi

SSHの設定を追加

踏み台サーバを経由して各インスタンスにアクセスする

/etc/hosts

xxx.xxx.xxx.xxx   manage.myapp.dev

~/.ssh/config

Host manage.myapp.dev
  IdentityFile ~/.ssh/id_rsa_myapp
  User         ec2-user
Host manage.myapp.dev/*
  ProxyCommand ssh -W "$(basename "%h")":%p "$(dirname "%h")"
  IdentityFile ~/.ssh/id_rsa_myapp
  User         ec2-user

接続用スクリプトの設置

接続用のスクリプトを作成する
スクリプトはどこかで拾ったやつを若干手直ししたもの
リンクを貼りたかったんですが、コピペ元が見つからなかった
ごめんなさい

~/usr/local/bin/ec2ssh

#!/bin/bash

SSH_COMMAND="ssh ${AWS_DEFAULT_GATEWAY}"

DESCRIBE_COMMAND=$(cat << EOS
aws ec2
  --output text
    describe-instances
  --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

EC2に接続

プロジェクトのルートで以下のコマンドを実行

$ ec2ssh