🧮

Session Managerで起動中のEC2に接続してみた

2021/05/31に公開

こんにちは!!

個人開発で作成した中国語学習アプリのサーバー側ソースをEC2上で起動しています。EC2に接続するために22番ポートをあけて、自宅のIPアドレスからならsshで接続できる状態にしています。

でも最近、SessionManagerを使えば22番ポートを開けたりする必要もなく、EC2に接続できるということを知ったので試してみました。

目次

  • まずは軽い調査
  • 接続してみた
  • IAMロール作成
  • EC2にIAMロールをアタッチ
  • もう一度接続してみた
  • 原因調査
  • 再び接続
  • ローカルからssh接続できないようにする

まずは軽い調査

とりあえず「SessionManager EC2接続」とかで検索して情報収集しました。

そして以下の2つができていれば接続できそうなことが分かりました。

  • EC2にSSMエージェントをインストール
  • EC2にAmazonSSMManagedInstanceCoreの権限を持つIAMロールをアタッチ

しかもLinux2ならデフォルトでSSMエージェントがインストールされていることも分かりました。使用中のEC2がLinux2なのか一応確認してみると、Linux2でした(基本的にはみんなLinux2使っていると思います)。

ラッキー

これでしないといけないことは、IAMロールをEC2にアタッチだけになりました

接続してみた

awsコンソールにログインしてEC2のページにいき、SessionManagerで接続したいEC2を選択。アクションのタブをクリックすると「接続」という文字があったのでとりあえずクリックしてみました。(後から気づいたのですが、アクションのタブの左の方にも「接続」というボタンがありました)

もしかしたらデフォルトで接続できるようになってたりしないかななんて考えましたが、やはり無理でした。

1つ目はSSMエージェントをインストールしろ、2つ目はおそらくIAMロールをアタッチしろと言っていますね。
下調べ通りです。

SSMエージェントはデフォルトでインストール済みなので、IAMロールをアタッチすればOKですね!

IAMロール作成

IAMにアクセスし、ロールをクリック。そして「ロールの作成」をクリック。

次の画面のユースケースの選択で「EC2」を選択して次のステップへ。

次の画面で検索窓にssmと入力し、AmazonSSMManagedInstanceCoreにチェックを入れる。

あとはIAMのロールの名前とかを適当に決めて完了です。僕はIAMのロールの名前を「session-manager」にしました。

EC2にIAMロールをアタッチ

先ほど作成したIAMロールをEC2にアタッチします。

まずはEC2のページにアクセスし、該当のEC2を選択。上のタブに「アクション」というのがあるので、それをクリック。その中の「セキュリティ」をクリックしてでてくる「IAMロールの変更」をクリックします

その後IAMロールを選択できるので先ほど作成したIAMロールを選択した保存します。

もう一度接続してみた

IAMロールはEC2にアタッチしたし、SSMエージェントはデフォルトでインストールされている。これで準備OKと思ってもう一度接続してみました。

しかし、さっきと同じで接続できませんでした。。

なぜ。。。

原因調査

まさかEC2にSSMエージェントがインストールされてない!?
って思ったのでEC2にアクセスし以下のコマンドを実行

systemctl status amazon-ssm-agent

「Active: active (running)」の文字が確認できました。

インストールされてるし起動もしてるやん, なんでやねん

さては再起動が必要なのか!?
って思ったので早速再起動してみようと思ったのですが、再起動して何か変な挙動になったら嫌だなと思ったのでIAMロールをアタッチした後に再起動が必要か調べてみました。

「IAMロール EC2 起動中」とかで検索してみました。
再起動が必要かどうかは書いていなかったですが、こちらの記事で以前は起動中のEC2インスタンスに後からIAMロールをアタッチできなかったという知識を得ました。

何事も調べてみるもんですね。

再び接続

原因はよくわからなかったのですがIAMロールが反映されるのに時間がかかるのかもと思い、もう一度接続してみました。

するとなんと接続できました!

時間の問題でした。

とりあえずlsコマンドを実行し配下にどんなディレクトリがあるか確認。

ls

なんかいっぱいでてきました。これは僕がいつも使っているディレクトリじゃないな。

とりあえず今どこにいるのか分からないのでpwdコマンドを実行

pwd

/usr/bin にいることが分かりました。
sshで接続したときに最初にいる位置に移動したかったので下記コマンドを実行

cd /home/ec2-user/

Permissionエラーがでました。なんでやねん。

今どのユーザーでログインしているのか確認するため下記を実行

whoami

ssm-userでした。なるほどec2-userじゃなかったのね。

となるとルートユーザーでログインするかec2-userとしてログインしないといけないのかなぁとか思いながら色々調べているとssm-userはsudoコマンドが使えることが分かりました。

なぜ使えるかは以下の記事を参考にしてください。
参考: https://dev.classmethod.jp/articles/why-does-ssm-user-use-sudo/

さらに調べていると以下のコマンドでec2-userとしてログインできることが分かりました。

sudo su --login ec2-user

参考: https://www.bioerrorlog.work/entry/session-manager-ec2-user

これで今までsshで接続したときにいる位置に移動できましたね。

ローカルからssh接続できないようにする

最後は、ローカルからsshで接続できないようにします。
めっちゃ簡単です。

セキュリティグループを編集するだけです。

  • 該当のEC2インスタンスを選択。
  • そのEC2インスタンスに紐づくセキュリティグループを選択。
  • sshの部分を削除

たったこれだけです。これらを実施した後、いつも通りローカルからsshで接続してみてください。

接続できないことがわかると思います。

まとめ

以上です。SessionManagerという機能を使ってEC2に接続するようにしてみました。
調べた感じだとIAMロールをアタッチするだけかと思いましたが、IAMロールをアタッチしてから反映されるまでにタイムラグがあることやec2-userではなくssm-userでログインしていることなどやってみないと学べないことが学べました。

また以前は起動中のEC2に後からIAMロールを紐づけることができなかったことなど、ちょっとした知識を得ることもできました。

やはり簡単そうなことでも1回やってみるべきですね。また何かあったら試してみたいと思います。
ありがとうございました。

Discussion