キーペアをダウンロードせずにSSHログインするスクリプトで2つのキーペアを使えるようにしてみました

記事タイトルとURLをコピーする

こんにちは。
アプリケーションサービス部インターナルエデュケーション課で修行中(研修中)の大浪です。

私がサーバーワークスに入社してからそろそろ4ヵ月になります、本当にあっという間です。
現在、研修の中で模擬案件という実践的な案件形式のトレーニングを受けています。

模擬案件の中でCloudFormationでキーペアを作り、そのキーペアを使ったEC2にSSH接続する時があります。
この時にローカルに秘密鍵をダウンロードしたくないため、弊社の水本が別記事で公開したスクリプトを使っています。

blog.serverworks.co.jp

今回はこのスクリプトを、踏み台のEC2インスタンスとその先の接続先のEC2インスタンスで違うキーペアになるケースに対応してみましたので紹介します。

スクリプト

いきなりですがスクリプトです。

#!/bin/sh
if [ -z "$1" ]; then
  echo """
Usage:
login-ec2.sh <keyname> <target_ip> <aws_profile> <bastion_ip> <second_keyname>
  """
  exit 1
fi
# Vars
KeyName=$1
TargetIp=$2
Profile=$3
BastionIp=$4
SecondKeyName=$5


# find keypair id
KeyPairID=$(aws ec2 describe-key-pairs --key-names ${KeyName} --profile ${Profile} --query 'KeyPairs[].KeyPairId' --output text)
echo "KeyPairID: ${KeyPairID}"
if [ -z "$KeyPairID" ]; then
  echo "Can't find Keypair SecureStrings. Check if keyname is correct."
  exit 1
fi
# ssh-add
echo "$(aws ssm get-parameter --name /ec2/keypair/${KeyPairID} --with-decryption --profile ${Profile} --query Parameter.Value --output text)" | ssh-add -

if [ -n "$5" ]; then
    SecondKeyPairID=$(aws ec2 describe-key-pairs --key-names ${SecondKeyName} --profile ${Profile} --query 'KeyPairs[].KeyPairId' --output text)
    echo "SecondKeyPairID: ${SecondKeyPairID}"
    if [ -z "$SecondKeyPairID" ]; then
        echo "Can't find Second Keypair SecureStrings. Check if keyname is correct."
            exit 1
    fi

    echo "$(aws ssm get-parameter --name /ec2/keypair/${SecondKeyPairID} --with-decryption --profile ${Profile} --query Parameter.Value --output text)" | ssh-add -
fi

# connect
if [ -z "$4" ]; then
  ssh ec2-user@${TargetIp}
else
  ssh -v -oProxyCommand="ssh -W %h:%p ec2-user@${BastionIp}" ec2-user@${TargetIp}
fi

スクリプトの使い方

元々のスクリプトから第五引数が増えてます。
第五引数 second_keyname に2つ目のキーペア名を指定します。

sh login-ec2.sh <keyname> <target_ip> <aws_profile> <bastion_ip> <second_keyname>

スクリプトの差分の説明

2箇所追記をしています。

第五引数の受け取り

SecondKeyName=$5

第五引数が存在する場合の処理

第五引数のキーペア名から辿ってパラメータストア内の秘密鍵の情報を取得して、取得した秘密鍵の情報をssh-agentに追加しています。
これだけやれば後はssh-agentが、第二引数と第五引数のキーペアの秘密鍵を良しなに使い分けてくれます。

if [ -n "$5" ]; then
    SecondKeyPairID=$(aws ec2 describe-key-pairs --key-names ${SecondKeyName} --profile ${Profile} --query 'KeyPairs[].KeyPairId' --output text)
    echo "SecondKeyPairID: ${SecondKeyPairID}"
    if [ -z "$SecondKeyPairID" ]; then
        echo "Can't find Second Keypair SecureStrings. Check if keyname is correct."
            exit 1
    fi

    echo "$(aws ssm get-parameter --name /ec2/keypair/${SecondKeyPairID} --with-decryption --profile ${Profile} --query Parameter.Value --output text)" | ssh-add -
fi

上手く接続できない場合

The key pair '****' does not exist

下記のようなエラーが発生した場合は、第二引数か第五引数で指定しているキーペア名のキーペアが存在していません。

An error occurred (InvalidKeyPair.NotFound) when calling the DescribeKeyPairs operation: The key pair '****' does not exist

キーペア名が合っているか確認しましょう。

Connection timed out

下記のようなエラーが発生した場合は、複数の原因が考えられます。

open failed: connect failed: Connection timed out

良くある原因は下記になります。

  • セキュリティグループで接続元IPからのsshが許可されていない
  • 接続先のEC2インスタンス(もしくは踏み台)が停止している

また、コマンド実行後に途中で応答がない場合も、最終的に Connection timed out のエラーになりますので、上記の原因を疑ってみてください。

以上、この情報が誰かのちょっとした時間短縮になれば幸いです。