目的
- 今までインスタンスに接続するのにレガシーにTeratermでssh接続していたが、心を入れ替えて、セキュアにSesson Managerを使うように変えていこうかなと思い、使い方を確認する。
AWS Systems Manager Session Manager とは(自分の理解)
- AWS Systems Managerの中の一機能で、sshをせずに、AWSの機能としてLinuxにシェルアクセス(WindowsにはPowerShell)できる。
やったこと
- 以下の環境のEC2インスタンス(Amazon linux 2)へSession Managerを用いて接続できることを確認する。
- インターネット接続あり(IGW/EIP, NatGateway)
- インターネット接続なし(VPCエンドポイント)
- 接続のログが取れることを確認する。
構成図
予習
-
公式ドキュメント等を見て、Session ManagerでEC2インスタンスにアクセスするには何が必要なのかを予習する。
-
以下の3つの条件が必要と理解した。
- 条件1: インスタンスにSSM Agentがインストールされ起動していること。
- 条件2: 対象のEC2インスタンスに適切なIAM Roleが付与されていること。
- 条件3: VPCの外にあるSSM用のAPIと通信できること。
手順
環境準備
- VPC/Subnet の作成
- 構成図のVPC(2個)/Subnet(3個)を作成する。
- IGWを作成しVPC1にアタッチする。
- インスタンスの作成
- 構成図の通り4つのインスタンス(mksamba-ssm01~04)を作成する。今回は全てAmazon Linux 2を使用(SSM Agentがプリインストールされているため)。
Session Manager 利用の準備
- 条件1(SSM Agent起動)
- Amazon Linux 2の場合、プリインストールされているので追加は不要。一応動作確認を行う。(状態がActiveになっていることを確認する。)
[ec2-user@ip-10-0-0-220 ~]$ sudo systemctl status amazon-ssm-agent
● amazon-ssm-agent.service - amazon-ssm-agent
Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-07-18 15:21:24 UTC; 18min ago
Main PID: 3251 (amazon-ssm-agen)
CGroup: /system.slice/amazon-ssm-agent.service
mq3251 /usr/bin/amazon-ssm-agent
- 条件2(適切なIAM Roleの付与)
- Session Managerを使用するために必要とされる権限「AmazonSSMManagedInstanceCore」を含むIAM Role「mksamba_AmazonSSMManagedInstanceCore」を作成し、4つのインスタンスに割り当てる。
- 条件3(VPC外のSSM用のAPIとの疎通)
- IGWによる外部接続
- インスタンス(mksamba-ssm01)にEIPを割り当てる。(比較のため、同じsubnetのインスタンス(mksamba-ssm02)にはEIPを割り当てない)
- NatGatewayによる外部接続
- NatGatewayを作成し、インスタンス(mksamba-ssm03)が所属するsubnetのRoutetableにNatGatewayへの経路を設定する。
- VPCエンドポイントによる接続
- 以下の3つのエンドポイントを作成し、エンドポイントの作成先としてインスタンス(mksamba-ssm04)が所属するsubnetを指定する。
- com.amazonaws.ap-northeast-1.ssm
- com.amazonaws.ap-northeast-1.ec2messages
- com.amazonaws.ap-northeast-1.ssmmessages
- 以下の3つのエンドポイントを作成し、エンドポイントの作成先としてインスタンス(mksamba-ssm04)が所属するsubnetを指定する。
- IGWによる外部接続
接続確認
- 「AWS Systems Manager」 - 「インスタンスとノード」 - 「マネージドインスタンス」 のメニューを開き、対象のインスタンスが「マネージドインスタンス」として表示されていることを確認する。
- インスタンスssm01(IGW/EIPあり)、ssm03(NatGateway)、ssm04(VPCエンドポイント)は経路があるので管理対象として表示されている。ssm02(IGW/EIPなし)は経路がないので表示されない。
- 上記の画面からインスタンスを選択し、「アクション」- 「Start Session」を選択し、ブラウザから接続する。sshして接続するのと同様にコマンド実行することができる。ローカルPCとのテキストのコピーペーストも可能。
ログの確認
- 接続の概要(接続したIAMユーザ, 接続先インスタンス、時刻)についてはマネージメントコンソールで確認可能。
- 接続してどんなコマンドを打ったのかの詳細をS3バケットやCloudWatch Logsに出力可能。そのためには以下の追加設定(3点)が必要。
-
Roleへの権限追加
- インスタンスに付与しているRole「mksamba_AmazonSSMManagedInstanceCore」にS3バケット及びCloudWatchLogsへのアクセス権を追加する。(今回は検証なので「S3FullAccess」「CloudWatchLogsFullAccess」を追加。本来は必要最小限に)
-
S3エンドポイントの追加
- インターネット接続がない場合(今回はインスタンスssm04)はS3エンドポイントの追加が必要。
- VPCエンドポイント「com.amazonaws.ap-northeast-1.s3」を追加する。
-
セッションマネージャーでのログ出力の設定
- 「AWS Systems Manager」 - 「インスタンスとノード」 - 「セッションマネージャー」-「設定」にて、セッションのログをS3バケット及びCloudWatch Logsに出力する設定を追加する。(S3はバケット、CloudWatch Logsはロググループを指定)
-
- S3バケットの中にセッション毎にログファイルが作成される。各ファイルの中に実施したコマンドが保存される。
S3のログファイル(IAMユーザ-セッションID.log)
Script started on 2020-09-02 07:06:54+0000
sh-4.2$
sh-4.2$ date
Wed Sep 2 07:06:51 UTC 2020
sh-4.2$ pwd
/usr/bin
sh-4.2$ exit
exit
Script done on 2020-09-02 07:06:54+0000
- CloudWatch Logsでも同様にセッション毎にログが保存される。
所感
- 慣れればそんなに面倒ではないのかも、、