awscliを使って楽にEC2へSSHできるMakefileを書いてみた

スポンサード リンク

AWSをコマンドiで操作する awscli というものがあるらしい。 その使い方の練習を兼ねて,EC2でインスタンスを簡単に起動,停止,ssh接続できる Makefile を作成した。

まずはインストール

$ pip install awscli

次に認証等を設定する。設定に必要なアクセスキー等の情報はAWSでユーザアカウント管理を担っているIAMサービスで登録したユーザの情報を使う。 IAMは無料サービスなので気兼ねなく登録できる。

$ aws configure

動作確認も兼ねて,EC2のインスタンス情報を取得してみよう。

$ aws ec2 describe-instances

最後に インスタンス起動 -> ssh接続 -> インスタンス停止 までの操作を楽できるように Makefileに落とし込む。

INSTANCE-ID=<YOUR EC2 INSTANCE ID>
IDENTITYFILE=/path/to/.ssh/aws-ec2.pem
SSH-USER=ubuntu
OPEN=cygstart
port=10080
protocol=http

# show infomation of the instance
describe:
    @aws ec2 describe-instances --output table --instance-ids $(INSTANCE-ID)

# start the instance
start:
    -aws ec2 start-instances --output text --instance-ids $(INSTANCE-ID)

# stop the instance
stop:
    -aws ec2 stop-instances --output text --instance-ids $(INSTANCE-ID)

# wait and print current status until the instance running
wait-start:
    @while :; do STATE=`aws ec2 describe-instances --output text --instance-ids $(INSTANCE-ID) --query "Reservations[0].Instances[0].State.Name"` ; test $$STATE = "running" && exit || echo $$STATE ; sleep 2s; done

#wait-start:
#   aws ec2 wait instance-status-ok --instance-ids $(INSTANCE-ID)

# ssh connection
ssh: start wait-start
    ssh -i $(IDENTITYFILE) $(SSH-USER)@`aws ec2 describe-instances --output text --instance-ids $(INSTANCE-ID) --query "Reservations[0].Instances[0].PublicDnsName"`

# update .ssh/config for ssh, scp, etc.
update-ssh-config:
    DNSNAME=`aws ec2 describe-instances --output text --instance-ids $(INSTANCE-ID) --query "Reservations[0].Instances[0].PublicDnsName"` ; sed -i "s/Hostname ec2.*.compute.amazonaws.com\$$/Hostname $$DNSNAME/" $$HOME/.ssh/config

# show Public DNS name
name:
    @aws ec2 describe-instances --output text --instance-ids $(INSTANCE-ID) --query "Reservations[0].Instances[0].PublicDnsName"

# open web site in local browser
open:
    $(OPEN) $(protocol)://`aws ec2 describe-instances --output text --instance-ids $(INSTANCE-ID) --query "Reservations[0].Instances[0].PublicDnsName"`:$(port)

今更だけど Makefile よりも .bashrc やら .zshrc で定義するシェル関数にしたほうが便利だったかな。

Comments !

social