LoginSignup
2
3

More than 3 years have passed since last update.

EC2のパブリックIPアドレスを意識せずにSSHログインする

Last updated at Posted at 2019-11-26

やりたいこと

踏み台サーバーを構築した際などは、基本的にSSHでログインすることになる。
そのEC2のパブリックIPアドレスを知らない状態で、SSHログインをしたい。

EC2を起動する度にパブリックIPアドレスは切り替わるので、ElasticIPを付与するケースが多かったりする。
しかし、ElasticIPは1AWSアカウントに対し、デフォルトではリージョン毎に5つしか設定できなかったりと何かと制約がある。
そのため、不必要にElasticIPを使うのも避けたい。

解決策

下記の流れで解決できます。

  1. (事前準備) EC2インスタンスにタグを貼っておく
  2. (SSH接続時) SSH接続したいインスタンスのオブジェクトをタグで検索をかける
  3. (SSH接続時) ヒットしたEC2のパブリックIPアドレスを取得
  4. (SSH接続時) 取得したパブリックIPアドレスに対し、SSH接続

インスタンスへのタグ付

下記のように、Nameというキー名でタグを貼ると、コンソール画面のNameの場所にタグの値が表示されます。
スクリーンショット 2019-11-26 15.57.14.png

今回は、Nameというタグをvrf-bastionという名前で貼りました。

SSH接続

AWS CLIを使ったスクリプトを書きます。
インスタンス情報を取得するには、 aws ec2 describe-instances を使用します。
追加で指定するオプションは下記の通りです。

  • --filters : 指定したインスタンス情報で検索するインスタンスを絞り込む
  • --query : 取得したインスタンス情報から、抽出するフィールドを指定する

作成したスクリプト

ssh-ec2.sh
#!/bin/bash

# ------------------------------------------
# 踏み台サーバーにSSHログイン
#
# 実行例:
#   $ sh ssh-ec2.sh
# ------------------------------------------

KEY_PATH_LOCAL=~/.ssh/key-pair.pem

PUBLIC_IP=$(
    aws ec2 describe-instances \
        --filters \
            "Name=tag:Name,Values=vrf-bastion" \
            "Name=instance-state-name,Values=running" \
        --query "Reservations[0].Instances[0].PublicIpAddress" \
    | tr -d \"
)
ssh -i ${KEY_PATH_LOCAL} ec2-user@${PUBLIC_IP}

--filters では、タグのName属性がvrf-bastionであるものを指定しており、さらに起動中のインスタンスの指定をしています。
検索に引っかかったインスタンスが1つであっても、リスト形式で情報が帰ってくるので --queryに、Instance[0]という形で先頭のインスタンスを取得し、パブリックIPアドレスのみを出力するよう指定しています。

また、 "aaa.bbb.ccc.ddd" というダブルクオーテーション付きでパブリックIPが出力されるので、最後に両サイドのダブルクオーテーションを取り除いて変数に代入。

最後にそれらの変数を用い、SSH接続。

あとは、下記のようスクリプトを実行するだけです。

$ sh ssh-ec2.sh

これで動的にインスタンス名からIPアドレスを取得し、SSH接続できるようになりました。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3