diary

主にコンピュータ技術関連のことを投稿。 / 投稿は個人の意見であり所属団体の立場を代表するものではありません。

通常の ssh ライクな引数で簡単に EC2 にログインできるようなスクリプトを書いた

ec2ssh

Requirements

環境変数にこれ追加したほうがいいかも。

export AWS_SDK_LOAD_CONFIG=1
sudo gem install aws-sdk
wget https://gist.githubusercontent.com/ishikuro/aca4afc01f96b9c4346b6623696d88dd/raw/4acf0f135d257ade0ae88f4fa44db51abd72605f/ec2ssh
chmod u+x ec2ssh

Usage

ec2ssh [-l username] [-p port_number] [-r region] [-i identity_file] [-q] [--profile profile] [--dry-run] [username@]instance[:port_number] [command]
  • -l username or username@
    • 省略した場合は tag:User を自動的に使用する。tag:User も無いときはデフォルト値として ec2-user が使われる。
  • -p port_number or :port_number
    • 省略した場合はデフォルト値 22 が使われる
  • -r region
    • 指定したリージョンで EC2 インスタンスを探す。省略した場合は ~/.aws/configure に設定したリージョンになる。それも無ければ us-east-1 が設定される。
  • -i identity_file
    • キーペアのファイルを指定する。ssh で適切にデフォルトが設定されているならば省略してもよい。
  • -q
    • quiet mode / セキュリティグループの設定警告や実行予定の ssh コマンドを出力しない。
  • --profile profile
    • ~/.aws/configure や ~/.aws/credentials のプロファイル切り替え
  • --dry-run
    • 実際には実行しない。インスタンスのユーザ名、IP アドレスを知りたいだけのときに有用。
  • instance
    • i- で始まっていればインスタンス ID をもとに、それ以外なら EC2 インスタンスに設定した Name タグをもとに、パブリック IP アドレスを自動で取得して ssh の対象ホストとする。
  • command
    • ssh の引数として渡せる、リモートで実行したいコマンド

Examples

$ ec2ssh MyInstanceA
# => ssh ec2-user@203.0.113.1
# インスタンスの User タグがあればそちらを拾ってユーザ名にしてくれる
# User タグが無ければ ec2-user

$ ec2ssh i-xxxxxxxxxxx
# => ssh ec2-user@203.0.113.1
# i- で始まる文字列にするとインスタンス ID と見なす

$ ec2ssh ubuntu@MyInstanceB
# => ssh ubuntu@203.0.113.2
$ ec2ssh -l ubuntu MyInstanceB
# =>  ssh ubuntu@203.0.113.2
# このようにしてユーザ名は上書き可能

$ ec2ssh -r us-east-1 MyInstanceC
# => ssh centos@203.0.113.3
# リージョン指定可能

$ ec2ssh -i ./my.pem ubuntu@MyInstanceB:10022
# => ssh  -i ./my.pem -p 10022 ubuntu@203.0.113.2

$ ec2ssh -i ./my.pem -l centos -p 10022 -r us-east-1 MyInstanceC
# => ssh -i ./my.pem -p 10022 centos@203.0.113.3

おまけ機能として、デフォルトでセキュリティグループ許可し忘れがないか警告してくれる。リンク先は当該インスタンスに紐づいたセキュリティグループでフィルタされたコンソール。出力不要な場合は -q で抑止できる。

$ ec2ssh MyInstanceA
If you cannot see the login prompt, check security group settings by
https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#SecurityGroups:groupId=sg-xxxxxx,sg-yyyyyy;sort=groupId

⚡️ ssh  -p 22 centos@3.xx.xx.xx

未実装

  • コマンド実行 ssh host ls みたいなやつ
  • 警告を出力しない、quietモード(-q)
  • scp モード
  • region 設定が無いときに us-east-1 を使うようにする
  • credential エラーの対応

gist.github.com

ec2ls

マネジメントコンソールを開かなくてもログインに必要な手がかりを一覧できるようなコマンドも作ってみた。併用すれば捗るはず。

ec2ls [-r region] [--profile profile] [-l]

AMI 名は先頭数文字だけ表示するようにした。ログインユーザ名を知るにはこれで十分。

$ ec2ls
i-xxxxxxxxxxxxxxxxxxx	running	CentOS#	Member
i-xxxxxxxxxxxxxxxxxxx	running	Window#	Admin
i-xxxxxxxxxxxxxxxxxxx	stopped	amzn2-#	WORK_AL2
i-xxxxxxxxxxxxxxxxxxx	running	ubuntu#	IoT
i-xxxxxxxxxxxxxxxxxxx	running	amzn-a#	Greengrass

$ ec2ls -l
i-xxxxxxxxxxxxxxxxxxx	running	CentOS#	Member	Directory/DirectoryPublic1a(192.168.0.0/24)
i-xxxxxxxxxxxxxxxxxxx	running	Window#	Admin	Directory/DirectoryPublic1a(192.168.0.0/24)
i-xxxxxxxxxxxxxxxxxxx	stopped	amzn2-#	WORK_AL2	default/DefaultPublic1a(172.31.16.0/20)
i-xxxxxxxxxxxxxxxxxxx	running	ubuntu#	IoT	default/DefaultPublic1a(172.31.16.0/20)
i-xxxxxxxxxxxxxxxxxxx	running	amzn-a#	Greengrass	default/DefaultPublic1a(172.31.16.0/20)

真面目に VPC, サブネット順にソートしたりしてるんだよ。


gist.github.com