Help us understand the problem. What is going on with this article?

EC2インスタンスのNameタグをhostnameに(ローカルから)

目的

EC2インスタンス自体にawscliをインストールせず、インスタンスのhostnameをNameタグの値にする

経緯

仕事上複数のインスタンスを扱うことがあるのですが、その際に今どのインスタンスにログインしているかがわからなくなります。
ネットにはインスタンスにログインしてNameタグを取得するためにawscliをインストールして...といった記事はありましたが、一つ一つにそのような作業をするのはめんどくさいですし無駄にパッケージを追加したくありません。
そこでローカルでNameタグを取得して、それをリモートのhostnameに適用する、というようなシェルスクリプトを書きました。

前提

awscli がローカルにインストール、設定されていること

スクリプト

set-hostname.sh
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環境にアクセスする必要があるのでプロファイルを引数に取れるようにしています)

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away