aws EC2をEIPつけないで毎日再起動する状況で活躍するshellくんです。
(EIPはお金かかるんで、ケチりたいんです。)
挙動
ec2の起動と、ssh/configのIPアドレスの書き換えを行います。
ec2の停止を行います。
(当環境はmacですが、linuxでも動作可かと思います。windowsはパスさえ正しく設定すればいけるのでは無いでしょうか。また、zshrcではコメントアウト処理に特別の設定が必要なので、.shファイルのコメントアウトは取り除いてください。)
EC2はEIPをつけないと一日起きにIPアドレスが変わってしまいます。
すると、sshやwebサーバを立てている場合は毎日指定するIPアドレスが変わってしまいます。(ドメインも無い場合)
当環境ではvscodeによるremotesshも行いたいので、~/.ssh/configにて設定をしています。
ここら辺の設定を毎回手動で行うのは面倒くさいので、簡略化させました。以下ソースです。
(事前にaws configureの設定は行ってください。)
インスタンス設定.sh
ec2.sh
#!/bin/bash
KEY_NAME="your_key" # ec2にsshを行う際のkey名を元に開始、停止するインスタンスを指定します。
SSH_AWS_NAME="your_aws" # .ssh/configにおけるHOSTNAMEを記載してください。
EC2_PRIVATE_ADDR=$( \
aws ec2 describe-instances --filters Name=key-name,Values=${KEY_NAME} \
--query 'Reservations[].Instances[].PrivateIpAddress' \
--output text \
)
EC2_INSTANCE_ID=$( \
aws ec2 describe-instances \
--filters Name=private-ip-address,Values=${EC2_PRIVATE_ADDR} \
--query 'Reservations[].Instances[].InstanceId' \
--output text \
)
EC2_STATE=$( \
aws ec2 describe-instances --filters Name=key-name,Values=${KEY_NAME} \
--query 'Reservations[].Instances[].State.Name' \
--output text \
)
if [ ${EC2_STATE} = "stopped" ]; then
echo "plz wait, starting ec2"
aws ec2 start-instances --instance-ids ${EC2_INSTANCE_ID} 1>/dev/null && aws ec2 wait instance-running --instance-ids ${EC2_INSTANCE_ID}
SSH_IP_BEFORE=$(cat ~/.ssh/config | awk '/'${SSH_AWS_NAME}'/ { getline; print $2}')
EC2_PUBLIC_ADDR=$(aws ec2 describe-instances --filters Name=key-name,Values=${KEY_NAME} \
--query 'Reservations[].Instances[].PublicIpAddress' \
--output text \
)
sed -i -e "s/${SSH_IP_BEFORE}/${EC2_PUBLIC_ADDR}/g" ~/.ssh/config
echo "http://${EC2_PUBLIC_ADDR}/" #URL指定になっているものはcommnad+クリックでブラウザに飛べます。
echo "ssh aws" #.ssh/configに記載しているためpemファイルを指定しなくてもログインできます。
echo "running ec2"
elif [ ${EC2_STATE} = "running" ]; then
echo "plz wait, stopping ec2"
aws ec2 stop-instances --instance-ids ${EC2_INSTANCE_ID} 1>/dev/null && aws ec2 wait instance-stopped --instance-ids ${EC2_INSTANCE_ID}
echo "stopped ec2"
fi
実行結果
[bash] % bash ec2.sh
plz wait, stopping ec2
stoped ec2
[bash] % bash ec2.sh
plz wait, starting ec2
http://XX.XXX.XXX.XXX/
ssh aws
running ec2
参考
ssh.config参考
vscode remote-ssh参考
↧