EC2 Instance ConnectのAPIを直接叩いてSSHする

2019.07.04

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

EC2 Instance Connectを利用すると、EC2インスタンスへのSSHアクセスをIAMで制御できます。

Connect Using EC2 Instance Connect - Amazon Elastic Compute Cloud

EC2 Instance ConnectのSSH 方法は以下の3通りがあります。

  1. マネジメントコンソールからブラウザ越しにSSH
  2. EC2 Instance Connect CLIを利用してSSH
  3. ユーザーが直接APIを叩いてコマンドラインからSSH

3つ目を使いやすくしたのが2つ目であるため、通常は

  • ブラウザから利用したい場合1つ目
  • コマンドランから利用したい場合2つ目

を採用することが多いかと思います。

今回は、 EC2 Instance Connect CLI が何をやっているのか理解するために、あえて手間のかかる3つ目で SSH する方法を紹介します。

ゴール

EC2 Instance Connect CLI の mssh を使うと

$ mssh i-1234

でSSHできます。

eic-cli.sh というBashスクリプトを自作し、同じように

$ eic-cli.sh i-1234

でSSHできるようにします。

処理の流れ

EC2 Instance Connect を使った SSH は以下の流れで行われます。

図の引用元 https://dev.classmethod.jp/cloud/aws/ec2-instance-connect/

この内、 EC2 Instance Connect CLI の責務は以下のステップです。

  • #1:公開鍵/秘密鍵のペアを生成する
  • #2:SendSSHPublicKey APIで公開鍵を登録する
  • #5:秘密鍵でEC2にログインする

これらステップの中で、 EC2 インスタンスのアベイラビリティーゾーンやパブリックIPアドレスといった情報も必要になるため、シェルスクリプト内ではそれらの情報も取得します。

実際のコード

実際のBashスクリプトは以下の通りです。

重要な箇所のみ解説します。

EC2 のメタ情報を取得

EC2のインスタンスIDを元に、インスタンスのメタ情報

  • アベイラビリティーゾーン (ステップ #2 で利用)
  • IPアドレス(ステップ #5 で利用)

EC2::DescribeInstances API から取得します。

AWS EC2 Instance Connect CLI では ec2_util.py で実装されています。

キーペアの生成

SSh 接続時に利用する公開鍵のペアを作成します。 シェルスクリプトでは OpenSSH の ssh-keygen コマンドを直接叩いています。

AWS EC2 Instance Connect CLI ではkey_utils.py で実装されています。

SSH 公開鍵を登録。

生成された公開鍵を EC2 Instance Connect::SendSSHPublicKey API でAWS に登録します。

登録時には、以下の情報が必要です。

  • InstanceId : インスタンス ID
  • AvailabilityZone : アベイラビリティゾーン
  • InstanceOSUser : ログインするユーザー名(今回は ec2-user にハードコード)
  • SSHPublicKey : 公開鍵

登録した鍵は60秒だけ有効です。

AWS EC2 Instance Connect CLI では key_publisher.py で実装されています。

実行してみる

このスクリプトを実際に実行してみます。

$ bash eic-cli.sh i-0184d8ed11294e779
/tmp/ssh.yZFLoE already exists.
Overwrite (y/n)? y
private key path : /tmp/ssh.yZFLoE
{
"RequestId": "90588414-feb8-4cc4-beb4-70fc01c6ed73",
"Success": true
}
Last login: Wed Jul 3 14:16:48 2019 from ***

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

https://aws.amazon.com/amazon-linux-2/
$
$ curl http://169.254.169.254/latest/meta-data/instance-id
i-0184d8ed11294e779
$

無事 SSH でログインできました。

最後の箇所では、シェルスクリプトで指定したインスタンスIDとログイン先インスタンスのインスタンスIDが一致していることを、念のために確認しています。

最後に

AWS EC2 Instance Connect のヘルパー CLI「mssh」を使わずに、各処理を直接実行して SSH する方法を紹介しました。

AWS EC2 Instance Connect でブラウザ越しや公式CLI経由のSSHがうまく動作しないときは、APIを直接呼び出して、問題切り分けすることも検討ください。

それでは。

参考