CloudWatch Logsで特定文字列を監視しよう!
目次
こんにちは!
株式会社ビヨンド大阪オフィスのラーメン王、ヒデです。
今回が6回目の投稿です。
前回はCloudwatchアラームをChatbotを使ってSlackに通知することについて話しました!
ブログ記事では、Chatbotという便利ツールを使って通知する面白い記事を書いたので、
興味ある方は、ぜひ見てくださいね!
CloudWatch Logsの文字列監視とは?
CloudWatch Logsは、AWSリソースの監視をしているCloudWatchにある機能の一部で、
EC2にあるアプリケーション・アクセスログ等を簡単に収集してクラウド上に保存できる機能となっています。
クラウド上に保存できるので、特定のログを確認したい時に簡単に検索することが可能です。
また、収集したログを一つのサービスで一元管理が可能であるので、管理に労力がかからないのも魅力です。
次に文字列監視とは、業務効率化をするために収集したアプリケーション・アクセスログ等をリアルタイムに監視をして、出力された一定の形式や特定の文字列などを条件にして検知したら、コミュニケーションツールに通知する監視方法のことを指します。
万が一、問題が発生した場合でも早期検知できるので、問題を素早く解決することが可能です。
CloudWatch Logsでログ監視を実装することは、とても手軽に行うことができますので、
一緒に手順を見ていきましょう!
構成図
EC2の中にCloudWatch Logsに使用するエージェントをインストールして、エージェントがEC2内に存在するログをコンソールに送ります。
次に、コンソールで設定している特定の文字列を含む条件に沿って、アラートが送信されるという流れになります。
構成を見てもそこまで難しくないと思いますので、頑張って設定していきましょう!
構築手順
①IAMロールを作成
①-①IAM>ロールに移動して【ロール作成】をクリック
①-②以下を選択して【次へ】をクリック
信頼されたエンティティタイプ:AWSのサービス
ユースケース:EC2
①-③【CloudWatchFullAccess】を選択して【次へ】をクリック
①-④ロール名と説明を記入して【ロールを作成】をクリック
①-⑤EC2>作成したインスタンス選択>アクション>セキュリティ>IAMロールを変更をクリック
①-⑤先ほど作成したIAMロールを選択して【Update IAM role】をクリック
*作成したインスタンスのセキュリティタブで以下になっていれば、適用完了です。
②CloudWatchLogs エージェント設定
②-①サーバーにログイン
②-②CloudWatch Logs エージェントをインストール
*Amazon Linuxの場合は下記コマンドでインストールできます
yum install amazon-cloudwatch-agent
*Amazon Linux以外のOSの場合はインストール方法が違います。
CentOSの場合は公式を参考にインストール方法を記載しておりますので以下を参照してください。
1.CloudWatch エージェントをダウンロード
*OSごとにダウンロードリンクが違うので、こちらを参照してください
wget https://s3.amazonaws.com/amazoncloudwatch-agent/centos/amd64/latest/amazon-cloudwatch-agent.rpm
2.CloudWatch エージェントをインストール
rpm -U ./amazon-cloudwatch-agent.rpm
*また、以下エージェントは非推奨になりますので、上記でインストールするようにしてください
yum install awslogs
②-③セットアップ用wizardを起動する
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
②-④エージェント設定をする
================================================================ = Welcome to the Amazon CloudWatch Agent Configuration Manager = = = = CloudWatch Agent allows you to collect metrics and logs from = = your host and send them to CloudWatch. Additional CloudWatch = = charges may apply. = ================================================================ On which OS are you planning to use the agent? (どのOSでエージェントを使用する予定ですか?) 1. linux 2. windows 3. darwin default choice: [1]:*Linuxの場合は1を選択してください 1 Trying to fetch the default region based on ec2 metadata... Are you using EC2 or On-Premises hosts? (EC2またはオンプレミスのホストを使用していますか?) 1. EC2 2. On-Premises default choice: [1]: *EC2の場合は1を選択してください 1 Which user are you planning to run the agent? (どのユーザーでエージェントを実行する予定ですか?) 1. root 2. cwagent 3. others default choice: [1]: *rootで問題ない場合は1を選択してください 1 Do you want to turn on StatsD daemon? (StatsDデーモンをオンにしますか?) 1. yes 2. no default choice: [1]: *カスタムメトリクスを収集するのに必要ですので、1を選択してください 1 Which port do you want StatsD daemon to listen to? (StatsDデーモンはどのポートをリッスンしますか?) default choice: [8125] *問題なければEnterをクリック What is the collect interval for StatsD daemon? (StatsDデーモンの収集間隔を教えてください) 1. 10s 2. 30s 3. 60s default choice: [1]: *問題ない場合は1を選択してください 1 What is the aggregation interval for metrics collected by StatsD daemon? (StatsDデーモンが収集するメトリクスの集計間隔を教えてください) 1. Do not aggregate 2. 10s 3. 30s 4. 60s default choice: [4]: *問題ない場合は4を選択してください 4 Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start? (CollectDからメトリクスを監視しますか?警告:CollectDがインストールされていないと、Agentの起動に失敗します) 1. yes 2. no default choice: [1]: *cloudwatchlogsのみ使用するので2を選択してください 2 Do you want to monitor any host metrics? e.g. CPU, memory, etc. (CPUやメモリなど、ホストの指標を監視したいですか?) 1. yes 2. no default choice: [1]: *cloudwatchlogsのみ使用するので2を選択してください 2 Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration? (移行用にインポートする既存のCloudWatch Log Agent(http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html)の設定ファイルはありますか?) 1. yes 2. no default choice: [2]: *cloudwatchlogsの設定ファイルはないので、2を選択してください 2 Do you want to monitor any log files? (ログファイルを監視しますか?) 1. yes 2. no default choice: [1]: *cloudwatchlogsの設定ファイルが必要なので1を選択してください 1 Log file path: *指定したいログのパスを記入してください /var/log/messages Log group name: *指定したいロググループ名を記入してください default choice: [messages] cloudwatchlogs-test Log stream name: *指定したいログストリーム名を記入してください default choice: [{instance_id}] /var/log/messages Log Group Retention in days (ロググループの保存期間) 1. -1 2. 1 3. 3 4. 5 5. 7 6. 14 7. 30 8. 60 9. 90 10. 120 11. 150 12. 180 13. 365 14. 400 15. 545 16. 731 17. 1827 18. 2192 19. 2557 20. 2922 21. 3288 22. 3653 default choice: [1]: *指定したいログの保持期間を記入してください(-1は無制限になります) 1 Do you want to specify any additional log files to monitor? (監視するログファイルを追加で指定しますか?) 1. yes 2. no default choice: [1]: *設定ファイルを追加しない場合は2を選択してください 2 Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully. Current config as follows: { "agent": { "run_as_user": "root" }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/messages", "log_group_name": "cloudwatchlogs-test", "log_stream_name": "/var/log/messages", "retention_in_days": -1 } ] } } }, "metrics": { "metrics_collected": { "statsd": { "metrics_aggregation_interval": 60, "metrics_collection_interval": 10, "service_address": ":8125" } } } } Please check the above content of the config. The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json. Edit it manually if needed. Do you want to store the config in the SSM parameter store? (コンフィグをSSMパラメータストアに格納するか?) 1. yes 2. no default choice: [1]: *SSMに登録する必要がない場合は2を選択してください 2 Program exits now.
*補足資料
StatsDとは?
CollectDとは?
②-⑤エージェントを起動
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
②-⑥エージェントの状態を確認
systemctl status amazon-cloudwatch-agent
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2022-08-05 06:33:34 UTC; 3min 46s ago Main PID: 1352 (amazon-cloudwat) CGroup: /system.slice/amazon-cloudwatch-agent.service mq1352 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloudwatch-agent/etc/env-config.json -pidfile /opt/aws... Aug 05 06:33:34 ip-172-31-39-31.ap-northeast-1.compute.internal systemd[1]: Started Amazon CloudWatch Agent. Aug 05 06:33:34 ip-172-31-39-31.ap-northeast-1.compute.internal start-amazon-cloudwatch-agent[1352]: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exist or cannot read. Skipping it. Aug 05 06:33:34 ip-172-31-39-31.ap-northeast-1.compute.internal start-amazon-cloudwatch-agent[1352]: I! Detecting run_as_user...
③コンソールで収集されているか確認
③-①cloudwatch>Log groupsで指定したロググループを確認してクリック

③-②指定したログストリーム名でログが保存されていることを確認してクリック

③-③正常に収集できているかログを確認
④メトリクスフィルターを作成
④-①【メトリクスフィルターを作成】をクリック

④-②フィルターパターンを定義
*様々なパターンの定義方法があるので、こちらを参照してください
④-③フィルターパターンをテストして問題がなければ【Next】をクリック
*テスト方法
1.テストするログデータを選択から【カスタムログ】か【ログストリーム名】を選択
2.【イベントメッセージをログ記録】にフィルターパターンに合うログを作成して【パターンをテスト】をクリック
3.テスト結果が反映されれば完了
④-④以下情報を記入する
フィルター名:フィルター自体の名前
メトリクス名前空間:CloudWatchがメトリクスを送信する名前空間の名前
メトリクス名:指定した名前空間下に作成されるメトリクスの名前
メトリクス値:メトリクスとして発行される際の数値
デフォルト値:パターンが一致しない時にメトリクスに発行される値。空白のままにすると値が発行されない
④-⑤問題がなければ【メトリクスフィルターを作成】をクリック
④-⑥以下のように作成されたら完了
⑤SNSを設定
⑤-①SNS>トピックで【トピックの作成】をクリック
⑤-②以下情報を設定して【トピックの作成】をクリック
タイプ:スタンダード
名前・説明:自由に指定してください
⑤-③【サブスクリプションの作成】をクリック
⑤-④以下情報を記入して【サブスクリプションの作成】をクリック
プロトコル:Eメール
エンドポイント:自身のメールアドレス
⑤-⑤確認メールが届くので【Confirm subscription】をクリック
⑤-⑥以下表示が出たら完了
⑥CloudWatchアラームを作成
⑥-①テストとしてサーバー内の指定したログファイルに特定の文字列を含むログを出力
*messagesを指定しているので、loggerコマンドを使っておりますが、ログを出力できるなら何でも構いません
*一度でもメトリクスフィルターで検知できないとアラーム作成の際にメトリクスを選択できないのでテストしています
logger "ERROR"
⑥-②CloudWatch>アラームで【アラームの作成】をクリック
⑥-③作成した名前空間>ディメンションなしのメトリクス>作成したメトリクス名を選択して【メトリクスの選択】をクリック
⑥-④条件を設定して【次へ】をクリック
*以下では1回以上特定の文字列を検知したら、アラームを通知するという条件にしています
⑥-⑤作成したトピックを指定して【次へ】をクリック
*文字列監視になるのでリカバリー通知設定は必要ありません
⑥-⑥作成したアラーム名を記入して【次へ】をクリック
⑥-⑦設定内容に問題がなければ【アラームの作成】をクリック
⑦動作確認
⑦-①テストとしてサーバー内の指定したログファイルに特定の文字列を含むログを出力
*messagesを指定しているので、loogerコマンドを使っておりますが、ログを出力できるなら何でも構いません
logger "ERROR"
⑦-②アラームが【アラーム状態】になっていることを確認する
⑦-③アラームに関するメールが届いているか確認する
*アラームメールが自分のメールアドレス宛てに届いていれば完了です
まとめ
いかがでしたでしょうか?
CloudWatchLogsで収集したログをメトリクスフィルターで特定の文字列を設定してアラームとして通知させることは、そんなに難しくなかったのではないかと思います。
AWSで文字列監視をする際は、CloudWatchを利用すると簡単に実際することができるので、
ぜひ、運用監視で活用してみてください!
また、通知させるところは、Eメール以外にもSlack・Teems・Chatworkにも通知できます。
設定方法は前回にブログでも書いているので気になる方はチェックしてくださいね!
ありがとうございました!
・CloudwatchアラームをTeams・Chatworkに通知してみた!
・AWS ChatbotでCloudWatchアラームをslackへ通知しよう!!