まだEC2にSSHしてるの?System ManagerのSession Managerを使って楽に安全にアクセスしよう!
はじめに
よくAWSに触れるものです。
皆さんAWSのEC2インスタンスにアクセスするときはどのようにされていますか?
おそらくキーペアを作成して、それをインスタンスに紐付け、その秘密鍵をもとにSSHしていると思います。
ベーシックで簡単なやり方ですが、そもそも秘密鍵を持つとセキュリティ的に良くないですし、アクセス制御をSecurity Groupに入れていたりすると結構面倒だったりします。
そんな時、とても楽な方法がSession Managerです。
今回はそちらを紹介します!
Session Managerとは
Session Managerとは、EC2インスタンスにAWSのSystem Managerを経由してアクセスする方法です。
以下にメリットとデメリットをあげます。
・メリット
- ローカルに認証情報をもつ必要がない
- aws cliを1発叩くだけでアクセスできる
- コンソールからもアクセスできる
・デメリット
- なし
といった感じでデメリットは無いのでぜひ使ってみましょう!
デモ
簡単に2つの使い方を見てみましょう。
aws cli
以下のコマンドを叩くだけです。
$ aws ssm start-session --target <INSTANCE_ID> Starting session with SessionId: xxxxxxxxxxxx > >
これだけでアクセスできます。
コンソール
まずSystem Managerの画面を開きます。
次にセッションの開始をクリックして、指定のインスタンスをクリックするだけで...
新しいタブが開いてインスタンスにアクセスできました!
次にこのSession Managerを導入方法を説明します。
導入方法
Session Managerを使うには条件が2つあります。
- AmazonSSMManagedInstanceCoreと同等のポリシーがEC2インスタンスロールに付与されている。
- ssm-agentのバージョンが2.3.68.0 以降であること
です。
今回はAmazon Linux とAmazon Linux 2への導入方法について解説します。
両者のAMIを使ってインスタンスを作成した時、ssm-agentはインストールされているとドキュメントに書いてありますが、実際にはされていません。
(検証した結果、agentはインストール、起動されていませんでした。もしインストールされているディレクトリを知っている方がいらっしゃったら教えていただきたいです。)
ただ比較的新しめのAmazo Linux 2のAMIを使用しているとssm-agentが起動しているので、IAMロールの設定のみでSession Managerが使えます。
もしssm-agentが動いていない場合は以下を参照してインストールしてください。 ssm-agentのstatus確認方法も以下にあります。
Auto Scalingを使っている際はUserDataにインストールコマンドを入れましょう。
UserDataのCloudformationスタックのサンプルです。
LaunchTemplate: Type: "AWS::EC2::LaunchTemplate" Properties: LaunchTemplateData: UserData: Fn::Base64: sudo yum install -y https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/linux_amd64/amazon-ssm-agent.rpm
これで準備は完了です。
使い方
実際に使う際はコマンドでできるのが一番楽でしょう。
まずはローカルにSystem Manager Pluginをインストールします。
インストーラーをインストールします。
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzipします。
$ unzip sessionmanager-bundle.zip
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
環境は整いました。
私は普段、以下の2コマンドを使っています。
インスタンスを探す。
$ aws ec2 describe-instances --query "Reservations[*].Instances[*].[InstanceId,Tags[?Key=='Name'].Value]" --output=yaml - - - i-0d3xxxxxxxxxxxxxxx - - foo - - - i-042xxxxxxxxxxxxxxx - - bar
Session Managerを使ってアクセスする、
$ aws ssm start-session --target <INSTANCE_ID> Starting session with SessionId: xxxxxxxxxx > >
この2コマンドを使うだけで、AWSコンソールにログインをすることなくEC2インスタンスにアクセスできます。
終わりに
デバックなどの際はいちいちAWSコンソールに入ったり、ローカルに秘密鍵を保持したりする必要のないやり方ですが、メリットしか無いので、ぜひ使ってみてください。