こんにちは。
アプリケーションサービス部インターナルエデュケーション課で修行中(研修中)の大浪です。
私がサーバーワークスに入社してからそろそろ4ヵ月になります、本当にあっという間です。
現在、研修の中で模擬案件という実践的な案件形式のトレーニングを受けています。
模擬案件の中でCloudFormationでキーペアを作り、そのキーペアを使ったEC2にSSH接続する時があります。
この時にローカルに秘密鍵をダウンロードしたくないため、弊社の水本が別記事で公開したスクリプトを使っています。
今回はこのスクリプトを、踏み台の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
のエラーになりますので、上記の原因を疑ってみてください。
以上、この情報が誰かのちょっとした時間短縮になれば幸いです。