EC2の操作ログを CloudWatch Logs に出力する

こんにちは、yuhanです!
今回のブログでは、EC2の操作ログを CloudWatch Logs に出力する方法についてご紹介したいと思います。
概要
- EC2
- AmazonLinux2023 を使用
- SSMエージェントがインストール済みのため、インストール手順は省略
- プライベートサブネットに配置
- VPCエンドポイントを利用
- AmazonLinux2023 を使用
- ログ
- KMS による暗号化
- CloudWatch Logs に出力
本記事では、プライベートサブネットにあるEC2の操作ログを CloudWatch Logs に出力するまでの一連の流れを解説していきます。
各種設定
IAM ロール
まず、EC2インスタンス用にIAMロールを作成します。
ロールには、下記のAWSマネージドポリシーを付与します。
AmazonSSMManagedInstanceCore
:Session Manager を使うために必要CloudWatchAgentServerPolicy
:CloudWatch Logs へログを吐き出すために必要

EC2の起動
test-instance
という名前でEC2インスタンスを立ち上げます。
作成したIAMロールをアタッチしておきます。

また、EC2のセキュリティグループでは、アウトバウンドルールで HTTPS を許可します。

今回は、AmazonLinux2023 を使用しているので、SSMエージェントのインストール手順は省きます。
VPC エンドポイントの作成
EC2インスタンスを配置したサブネットに、下記の4つのVPCエンドポイントを作成します。
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ssmmessages
com.amazonaws.ap-northeast-1.ec2messages
com.amazonaws.ap-northeast-1.logs
エンドポイントに設定するセキュリティグループについて、インバウンドルールで、EC2のセキュリティグループからの HTTPS を許可します。

アウトバウンドルールでは全ての通信を許可しておきます。

セキュリティグループの設定が抜けていると、セッションマネージャーでEC2インスタンスに接続する際にうまくいきません。
KMS でキーの作成
ログを暗号化するためのキーをKMSで作成していきます。

エイリアスは、何のために使用されるものかわかるようなものに設定します。

キー管理者には、使用しているIAMユーザーもしくはロールを設定します。

キーの使用者も同様に使用しているIAMユーザーもしくはロールを選択します。

確認画面で、キーポリシーについて下記の該当箇所を編集します。"Service": "logs.ap-northeast-1.amazonaws.com"
を追記することで、CloudWatch Logs がこのキーを使うことを許可しています。
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {
"AWS": <設定したIAMユーザーもしくはロール>,
"Service": "logs.ap-northeast-1.amazonaws.com" // ここを追加
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
},
CloudWatch Logs ロググループの作成
CloudWatch Logs にログの出力先になるロググループを作成します。

任意のロググループ名を設定して、作成した KMS の ARN を設定します。

Session Manager の設定
Session Manager にアクセスして、設定を行う
から設定を行います。

スクロールすると、CloudWatch へのロギングを有効化する箇所があるので、チェックを入れます。

チェックを入れると、各設定項目が表示されます。Upload session logs
を選択して、Allow only CloudWatch log groups that are encrypted by customers master keys (CMK)
にはチェックを入れます。

作成したロググループを選択します。

一番下にある 保存
ボタンで設定を保存すれば、ログを出力するための設定は完了です。
変更後の設定は、下記のようになります。

Session Manager で EC2 に接続する
ログの設定を行なったので、実際に操作ログが CloudWatch Logs に吐き出されるのか確認するため、Session Manager 経由で EC2 インスタンスに接続します。
Session Manager のページにアクセスしたら、セッションを開始する
をクリックします。

対象インスタンスを選択して、Start session
をクリックすると、別タブでセッションが開始します。

無事に接続できました。
※ 下記スクリーンショットのような真っ黒な画面が表示された状態でプロンプトが表示されない場合は、正常に接続できていない可能性が高いので、セキュリティグループの設定を見直しましょう。

適当なコマンド操作を行なっていきます。

ある程度、コマンドを実行したら、セッションを終了します。
CloudWatch Logsでログを確認する
CloudWatch Logs でロググループを確認すると、ログが出力されています。

ログを開いて中を確認すると、先ほど実行したコマンドについて出力されています。


まとめ
プライベートなEC2の場合、セッションマネージャーで接続するときに、セキュリティグループの設定で躓くことがよくあります。
本検証の際も、セッションマネージャーでいざ接続してみたら真っ黒な画面のままEC2に接続できず、セキュリティグループの設定漏れが発覚しました。
サーバーの操作ログを記録しておく必要のあるユースケースは多々あると思うので、EC2の操作ログを記録しておく方法もバッチリ理解しておきたいですね。
本ブログでは触れませんでしたが、CloudWatch Logs にログを保存しておくと S3 に保存しておくよりもコストがかかるため、一定期間経過後に S3 にエクスポートするような要件もよくあるかと思います。
CloudWatch Logs から S3 へのエクスポート方法はいくつかあるので、また、次回以降のブログでご紹介させていただければと思います。
参考
Amazon CloudWatch Logs を使用してセッションデータをストリーミングする (コンソール)