接続先のインスタンスを識別する方法 (EC2 / RDS MySQL)

eyecatch_20140420_wseigo2

AWSで構築した環境の運用を行っていると、

あれ、いま自分はどこ(インスタンス)にいるんだっけ?

と思うことがあります1

たとえ思わなかったとしても、クリティカルな操作を行う前には、いま自分がログインしているホストが確実に目的のところかどうかを確認したいという運用エンジニアは多いのではないでしょうか。

オンプレミスだった場合

これがオンプレミス環境であれば、ホスト名が明示的に設定されているところが多いかと思います。

Linuxサーバであればuname -nコマンドで確認できますし、そもそもプロンプトに常時表示する設定も入っているでしょう。

[hogehoge@webapp01a]$ uname -n
webapp01a

MySQLへリモート接続している場合は、システム変数をクエリすれば確認できます。

mysql> show variables like "hostname";
+---------------+-------------+
| Variable_name | Value       |
+---------------+-------------+
| hostname      | db-slave001 |
+---------------+-------------+
1 row in set (0.01 sec)

EC2の場合

EC2の場合でも、もちろんオンプレミスと同じ方法が使えます。

しかしながら、デフォルトのままだとホスト名はプライベートIPアドレスをもとに自動的に決定されます。踏み台経由での接続ならまだしも、グローバルIPアドレス経由だった場合はちょっと混乱しますね。

それにAWS(というかクラウドインフラ)的には、やはりインスタンスIDで確認したくなるのが人情というものだと思うので、ここはインスタンスメタデータを参照したいと思います。

$ curl http://169.254.169.254/latest/meta-data/instance-id
i-0860f8b2ccd3c245d

この169.254.169.254というIPアドレスは リンクローカルアドレス と呼ばれるもので、イメージとしては loopback (127.0.0.1) と似たような使い方ができるものです。なので、どのインスタンスであってもここは変える必要はありません。

せっかくなので、これをプロンプトに設定しましょう。

$ PS1='[\u@'$(curl -s http://169.254.169.254/latest/meta-data/instance-id)' \w]\$ '
[ec2-user@i-0860f8b2cxxxxyyyy ~]$

また、インスタンスメタデータを使えば他にも様々な情報を取得できるので、今まで使ってこなかったという方もこの機会に是非確認してみて下さい。

RDS の場合 (MySQL / MariaDB)

RDSで起動したMySQL(MariaDB)の場合、ホスト名はこのような感じになっています。

$ mysql -uhogehoge -p -h rds01.c9wmxxxxyyyy.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
:

mysql> show variables like "hostname";
+---------------+--------------+
| Variable_name | Value        |
+---------------+--------------+
| hostname      | ip-10-7-1-13 |
+---------------+--------------+
1 row in set (0.01 sec)

ここで表示されているIPアドレス(10.7.1.13)は、エンドポイントのIPアドレスとは異なります。おそらくAWSの内部的な構成に由来しているのだと思いますが、いずれにせよ確認には使えません。

仕方ないので、「mysqlコマンド実行時に指定した接続先(エンドポイント)を改めて表示する」という一般的な方法で代替します。

system wとすることで、いま実行中のmysqlコマンドが起動オプションごと表示できますね。ここに-hオプションの引数も含まれるので、意図したエンドポイントに接続してるか、もう一度確認することが可能です。

mysql> system w
 01:44:46 up 23 min,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM            LOGIN@   IDLE   JCPU   PCPU WHAT
ec2-user pts/1    bastion01      02:06    1.00s  0.00s  0.00s mysql -uhogehoge -p -h rds01.c9wmxxxxyyyy.ap-northeast-1.rds.amazonaws.com
mysql> 

ただしこの手は、同じ踏み台(bastion)サーバから同時に複数のDBに接続している際には使えません。

その場合はPROMPT \u@\h >\_としてプロンプトに設定してしまう手があります2

mysql> PROMPT \u@\h >\_
PROMPT set to '\u@\h >\_'
hogehoge@rds01.c9wmxxxxyyyy.ap-northeast-1.rds.amazonaws.com >

プロンプトに設定するにはエンドポイントは長すぎる一方で、常に表示されている安心感もあるので、お好みの方法で活用してみて下さい。


  1. 非常に哲学的ですがそういう話ではないです。 
  2. あるいは、方法としてはこちらがメジャーでしょうか?