やりたいこと
踏み台サーバーを構築した際などは、基本的にSSHでログインすることになる。
そのEC2のパブリックIPアドレスを知らない状態で、SSHログインをしたい。
EC2を起動する度にパブリックIPアドレスは切り替わるので、ElasticIPを付与するケースが多かったりする。
しかし、ElasticIPは1AWSアカウントに対し、デフォルトではリージョン毎に5つしか設定できなかったりと何かと制約がある。
そのため、不必要にElasticIPを使うのも避けたい。
解決策
下記の流れで解決できます。
- (事前準備) EC2インスタンスにタグを貼っておく
- (SSH接続時) SSH接続したいインスタンスのオブジェクトをタグで検索をかける
- (SSH接続時) ヒットしたEC2のパブリックIPアドレスを取得
- (SSH接続時) 取得したパブリックIPアドレスに対し、SSH接続
インスタンスへのタグ付
下記のように、Nameというキー名でタグを貼ると、コンソール画面のNameの場所にタグの値が表示されます。
今回は、Nameというタグをvrf-bastionという名前で貼りました。
SSH接続
AWS CLIを使ったスクリプトを書きます。
インスタンス情報を取得するには、 aws ec2 describe-instances
を使用します。
追加で指定するオプションは下記の通りです。
-
--filters
: 指定したインスタンス情報で検索するインスタンスを絞り込む -
--query
: 取得したインスタンス情報から、抽出するフィールドを指定する
作成したスクリプト
#!/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接続できるようになりました。