読者です 読者をやめる 読者になる 読者になる

私と私の猫の他は誰でも隠し事を持っている

野良プログラマ発、日々のアウトプット

【AWS EC2】bash プロンプトにインスタンス名を表示する

プログラミング

インフラ屋の皆様、年末年始に向けたサーバ増強はお済でしょうか。そんな貴兄に EC2 関連の小ネタです。

スケールアウトなんかを目的としてクローン・サーバー・パターンを実施するとき、同じ AMI から立てたインスタンスだと bash のプロンプトもぜんぶ同じになっちゃうのですが、やっぱりこれはインスタンス毎に変えておきたい。でないと思わぬ操作ミスをしちゃいそうですもんね。

さて、どうするか。まず、起動したインスタンスで自分のメタデータ(インスタンスIDとか)を取得するには、こうすれば良いみたい。

Amazon EC2インスタンスの自身のMetadataを簡単に取得する

ふむふむ、

wget -q -O - http://169.254.169.254/latest/meta-data/instance-id

とすれば良いのですな(チョー簡単で嬉しいけどなんで生の IP なんだろ?)。

インスタンス名が判ればあとは AWS CLIインスタンスに付けた名前(タグの Name の値)を取得出来ますね。こんな感じ?

aws ec2 describe-instances --instance-ids <インスタンスID> --query "Reservations[*].Instances[*].[Tags]" --output table

これで問題は解決。perl で 上記出力からインスタンス名だけ抜き取って PS1 にセットすればよしっと。

export PS1="["$(/usr/bin/aws ec2 describe-instances --instance-ids $(/usr/bin/wget -q -O - http://169.254.169.254/latest/meta-data/instance-id) --query "Reservations[*].Instances[*].[Tags]" --output table | /usr/bin/perl -n -e 'print $1 if / Name \|\s*([^\s]+)/')" \W]\$ "

これを .bash_profile でも追記して完了! ムキになってワンライナーにしちゃいましたが、可読性が悪くていやんという場合は、

INSTANCE_ID=`/usr/bin/wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
MYNAME=`/usr/bin/aws ec2 describe-instances --instance-ids $INSTANCE_ID --query "Reservations[*].Instances[*].[Tags]" --output table | /usr/bin/perl -n -e 'print $1 if / Name \|\s*([^\s]+)/'`
export PS1="["$MYNAME" \W]\$ "

でも良いと思います。さあ、紅白歌合戦でも除夜の鐘でもどんと来い!(うそ、なるべく来ないで)。