ELB経由でSSH接続する

2014.06.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。

タイトルを読んで「何言ってんだこいつ」と思った方もいらっしゃると思いますが、本日はELB経由でSSH接続するお話です。

何に使うの?

「Auto Healing」の構成を実現している時に有効な方法です。Auto Healingでは、最小構成のAutoScalingGroup(=MaxSize,MinSize,DesiredCapacityが全て1)を構成し、常に1台がELBの配下で生存するようなパターンです。以下の図のようなイメージですね。

Untitled

この状態では、ELB配下のEC2が不調になった場合に新規にEC2インスタンスが起動されるのですが、そのIPアドレスは新しいインスタンスが起動される度に変わります。そのため、EC2インスタンスにSSHアクセスしたい際は都度IPアドレスを調べなくてはならず、かなり面倒です *1

この構成においては、ELBは常に起動された状態ですので、ELBをRoute53に登録しておけば、常にELB経由でのアクセスを実行することは可能です。ですが、アクセスする度にSSH接続先がランダムに振り分けられたら嫌ですよね。

ですが、Auto Healing構成のように、ELBの配下インスタンスが常に1台なら話は別です。ELBの配下には1台のEC2インスタンスしか存在しないため、ELB経由でも常に特定のEC2インスタンスにアクセスすることが出来ます。これなら、ELB経由でもSSHができそうですね。

設定

設定は非常に単純で、ELBのリスナーを追加してあげるだけです。ただし、ELBの待ち受けポートは25、80、443、1024-65535が利用可能なので、SSH(22)はそのまま利用できません。そのため別のポート(例:10022)を割り当ててあげましょう。

elb_1 この設定が終わり、配下のInstanceがHealthyであれば、ポート番号をELBの待ち受けポート番号に指定することでSSH接続できます。

$ ssh -i ~/.ssh/id_rsa -p 10022 ec2-user@<ELBのホスト名>
Last login: Tue Jun 17 11:18:54 2014 from ip-10-5-0-28.ap-northeast-1.compute.internal

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/
11 package(s) needed for security, out of 33 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-5-10-24 ~]$

注意が必要なのが、SSHの接続元IPアドレスがELBのIPアドレスになってしまっている点です。
監査などでSSH接続元IPアドレスを取得する必要がある場合は、この方法が利用できないので注意して下さい。

今日思いつきでこの機能を試してみたらうまくいったのでブログに書いてみました。ですが、私が気づいていない問題点がありそうなので何か思いついた方は指摘いただけると嬉しいです!

追記(6/19 11:40)

ご指摘の通り、デフォルトの設定だとELBのタイムアウトにより1分間無操作でSSH接続がタイムアウトしてしまいます。そのため手元の端末の~/.ssh/config

ServerAliveInterval 30

を設定してあげましょう。(設定値は60以下ならOKだと思います。)

脚注

  1. 「SSHしたら負けだと思っている」という名言もありますが...