目的
EC2インスタンス自体にawscliをインストールせず、インスタンスのhostnameをNameタグの値にする
経緯
仕事上複数のインスタンスを扱うことがあるのですが、その際に今どのインスタンスにログインしているかがわからなくなります。
ネットにはインスタンスにログインしてNameタグを取得するためにawscliをインストールして...といった記事はありましたが、一つ一つにそのような作業をするのはめんどくさいですし無駄にパッケージを追加したくありません。
そこでローカルでNameタグを取得して、それをリモートのhostnameに適用する、というようなシェルスクリプトを書きました。
前提
awscli がローカルにインストール、設定されていること
スクリプト
tag_name=`aws ec2 describe-instances \
--query 'Reservations[].Instances[].{Name:Tags[?Key==\`Name\`].Value}' \
--filter "Name=ip-address,Values=$1" \
--profile プロファイル \
| jq -r '.[0].Name[0]'`
echo $tag_name
ssh -i <秘密鍵へのパス> ec2-user@$1 "sh " <<-EOS
sudo hostnamectl set-hostname $tag_name
EOS
set-hostname.sh <設定したいインスタンスのPublic IP>
説明
ほぼ見たままなので詳細は省きますが、ローカルの変数をリモートで使用するというところで少し詰まりました。参考欄のteratailで同じような質問をされている方がいたので興味があれば。
プロファイルや秘密鍵へのパス、ユーザー名などは引数にする。スクリプトの最後にsshコマンドを書いてそのままログインできるようにする。などして各々利便性を向上していただければと思います。
(自分は複数のAWS環境にアクセスする必要があるのでプロファイルを引数に取れるようにしています)
参考
- AWS EC2のNameタグをインスタンスのホスト名として設定する方法
https://qiita.com/tabimoba/items/4fc4a38d93499c72a99f - AWS公式ドキュメント
https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html - ローカルのシェル変数をリモートで適用
https://teratail.com/questions/53734