初心者もCloudwatch Logsでサーバーログを監視してみよう

Cloudwatchのメトリクスフィルターを利用して、ログ監視を設定する方法を初心者向けで書いた記事です。
2021.07.07

こんにちは。クラスメソッドのスジェです。
今回Cloudwatchでログを監視する作業のができました。
今まで1度も触ってみたことがないので、初心者の方も理解できるように記事を書いてみました。

どのような作業をするのか

この記事ではec2インスタンスのApach サーバアクセスログをCloudwatch Logsに送り、
これを活用して特定のIPがフィルタリングされると警報メールが送信されるようにする
簡単な設定をしてみます。 この記事では、簡単に誰がアクセスしているかを監視するが、同じ方法で様々なログを監視することができます。
使うサービスは下記の通りです。

  • AWS Cloudwatch(ログ収集、フィルタリング、アラーム設定)
  • AWS Systems Manager(エージェント仁洙取る・設定、Parameter store)
  • AWS SNS(サブスクリプション)

設定してみましょ

インスタンスはすでに作成されていると仮定して作業を進めます。
テストインスタンスのAMIはAmazonLinux2(ami-06631ebafb3ae5d34) です。

フロー

作業のフローは下記の通りです。

  1. 作業用IAMロール作成・設定
  2. Systems ManagerでCloudwatch Agentインストール・設定
  3. ログフィルター・アラーム設定

この中でIAMロール作成・設定は内容が長すぎるためこの記事では省略します。
当過程を簡単に説明すると下記の通りです。

  1. IAMサービスコンソルアクセス
  2. ロールタブ -> ロール作成に進む
  3. ポリシーで[CloudWatchAgentServerPolicy, AmazonSSMManagedInstanceCore]を含めてロール作成
  4. EC2インスタンス一覧で設定できるインスタンスをクリック -> 右上のアクション -> セキュリティ -> IAMロール修正で作成したロールを選択

簡単に説明しましたが、上記の設定がIAMロールの作成・設定のすべてです。
詳細は次のリンクを参照してください。Cloudwatch Agent 用IAM 設定

Systems Manager(SSM)で
Cloudwatch Agent インストール・設定

SSMでCloudwatch Agentインストール

SSMでインストールする前にインスタンスに2.2.93.0以上のSystems Manager Agentをインストールする必要があります。
下のAMIには基本的にインストールされているため特に作業が必要ではないですが、
その他の場合はこのページを参照してインスタンスにSSM Agentをインストールして進行してください。

  • SSM Agentが事前にインストールされているAMI
    • Amazon Linux
    • Amazon Linux 2
    • Amazon Linux 2 ECS-Optimized Base AMIs
    • Ubuntu Server 16.04, 18.04, and 20.04

必要バージョン以上のSSM Agentがインストールされたら、Cloudwatch Agentを次の手順に従ってインストールします。

  1. AWS SSMの左側にあるRun Commandタブをクリック、Run commandボタンをクリックします。
  2. コマンドリストでAWS-Configure AWS PackageをクリックしてNameパラメータに
    Amazon CloudWatch Agentを入力します。
  3. 次のターゲットインスタンスを手動で選択するをチェックし、インストールするインスタンスを選択します。
  4. 出力オプションのS3 バケットへの書き込み有効化は、必要であれば結果を出力するバケットを選択します。そうではないとチェックを消します。
  5. 実行後、成功したら結果を確認します。

2~4のイメージは次のとおりです。

Cloudwatch Agent設定ファイルを作成して変更

エージェントはインストールしましたが、まだ停止状態です。
引き続き、収集するメトリクスとログを指定する設定ファイルを作成します。
設定ファイルはSSMのParameter Storeに保存して使用されます。

設定ファイルを作成するためには、インスタンスに接続した後、設定ファイル作成ウィザードを利用したり手動で作成したりします。
ウィザードを利用して作成すると、基本的な内容を素早く作成することができ、手動で作成すると必要なメトリクスやログごとに指定して作成することができます。
ウィザードを利用して作成する場合は、公式ページを参照してください。
手動で作成する場合、設定できるパラメータは公式ドキュメントを参照してください。

  • agent
    • Cloudwatch Agentの設定です。
  • logsのcollect_list
    • file_pathでファイルを指定し、log_group_name / log_stream_nameに指定した名前でCloudwatch Logsに送ります。
  • metrics
    • Cloudwatchのメトリクス一覧に見せるメトリクスです。
{
        "agent": {
                "metrics_collection_interval": 60,
                "region": "ap-northeast-2",
                "run_as_user": "cwagent"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/httpd/access_log",
                                                "log_group_name": "CWTEST",
                                                "log_stream_name": "accessLog"
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "metrics_collected": {
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}

こうして作成したjsonの設定ファイルをインスタンスに保存して参照したり、Parameter Sotreに保存して参照したりして使うことができます。
ドキュメント上の推薦方法は、Parameter Storeに保存して参照する方法です。

それでは上の内容で設定ファイルをParameter Storeに保存して、インスタンスを設定してみます。

  1. AWS Systems Managerサービスの左側にあるパラメータストアパラメータの作成をクリックします。
  2. 名前を指定し、に設定ファイルの内容を入力後、パラメータを作成します。
  3. AWS Systems Managerサービスの左側にある_Run Command___のRun commandをクリックします。
  4. コマンドドキュメントでAmazonCloudWatch-ManageAgentをクリックし、OptionalConfigurationLocation
    先ほどParameter Storeに保存したファイルの名前を入力します。 1.ターゲットインスタンスを手動で選択するを選んで設定するインスタンスをチェックします。
  5. 出力オプションのS3 バケットへの書き込み有効化は、必要であれば結果を出力するバケットを選択します。
  6. 実行した後に成功できたら、結果を確認します。

2番作業のイメージは以下の通りです。

4~6番作業のイメージは以下の通りです。

設定が完了したら、Cloudwatchのロググループを見ると、ログが追加されているのを確認することができます。

ログで特定文字を監視する

ログは成功的に読んできたので、特定の文字を監視するようにします。
ロググループのメトリクスフィルターという機能を利用して、特定のIPがアクセスすると通知が発生するように設定します。

設定

作業に使用するCWTESTというロググループ名は、設定ファイルで指定した「log_group_name」というオプションの値です。
そして、accessLogというログ名は、「log_stream_name」の値です。ということを考慮して手順を参考してください。

  1. CloudWatchサービスのロググループタブでCWTEST(log_group_name)に入り、accessLog(log_stream_name)をチェックします。
  2. 右上のアクションメトリクスフィルターを作成をクリックします。
  3. フィルターバターンに対象IPを指定し、テストするログを指定します。
  4. パターンテストをして結果に問題がなければ、次へ進みます。
  5. フィルターパターン、メトリクス名前空間、メトリクス名、メトリクス値を指定して、次をクリックして作成します。 フィルターパターンは本フィルタリングの名前であり、メトリクス名前空間はメトリクスのグループ名、メトリクス名はメトリクス一覧内での名前、メトリクス値はメトリクスの単位です。

作成後、ロググループを見れば、監視しようとするロググループに指標フィルターが 1つできたことが確認できます。

続いてアラームを設定します。
既存のAWS SNSを活用してもいいし、アラームを作成しながら一緒に作成してもいいです。

  1. 作成されたメトリクスフィルターをクリックしてリストを確認して、設定するメトリクスフィルターをチェックして、アラームを作成をクリックします。
  2. アクセスが感知できたらすぐ通知が出るように以上よりも(しきい値)1を指定します。
  3. 既存のSNSが設定されている場合は、既存のSNSを使用します。でなければ__新しいトピックの作成___で新しいトピックを作成した後、次に進みます。
    新しくトピックを作成したら、認証メールが送信されますので、確認してください。 1.アラート名を設定した後、アラート作成を完了します。

その後、サーバーにIPがアクセスすると、イメージのようにメールが送信されてきたことを確認できます。

まとめ

こうしてCloudwatchを利用してログを監視する方法ができました。
細かいところまではフィルターリングできないですが、ある程度は感知できるので、ご興味がございましたら試してみてください。 以上、ありがとうございました!