CloudWatch Logs で特定文字列を監視しよう!
目次
こんにちは!
株式会社ビヨンド大阪オフィスのラーメン王、ヒデです。
今回が6回目の投稿です。
前回は Cloudwatch アラームを Chatbot を使って Slack に通知することについて書きました。
Chatbot という便利ツールを使って通知する、面白い記事を書いたので、ぜひ興味ある方は見てくださいね!
CloudWatch Logs の文字列監視とは?
CloudWatch Logs は、AWS リソースの監視をしている CloudWatch にある機能の一部で、Amazon EC2 にあるアプリケーション・アクセスログ等を簡単に収集してクラウド上に保存できる機能となっています。
クラウド上に保存できるので、特定のログを確認したい時に簡単に検索することが可能です。
また、収集したログを一つのサービスで一元管理が可能であるので、管理に労力がかからないのも魅力です。
次に文字列監視とは、業務効率化をするために収集したアプリケーション・アクセスログ等をリアルタイムに監視をして、出力された一定の形式や特定の文字列などを条件にして検知したら、コミュニケーションツールに通知する監視方法のことを指します。万が一、問題が発生した場合でも早期検知できるので、問題を素早く解決することが可能です。
CloudWatch Logs でログ監視を実装することは、とても手軽に行うことができますので、一緒に手順を見ていきましょう!
構成図
EC2 の中に CloudWatch Logs に使用するエージェントをインストールして、エージェントがEC2内に存在するログをコンソールに送ります。
次に、コンソールで設定している特定の文字列を含む条件に沿って、アラートが送信されるという流れになります。構成を見てもそこまで難しくないと思いますので、頑張って設定していきましょう。
構築手順
① IAMロールを作成
①-①:IAM > ロールに移動して【ロール作成】をクリック
①-②:以下を選択して【次へ】をクリック
● 信頼されたエンティティタイプ:AWSのサービス
● ユースケース:EC2
①-③:【CloudWatchFullAccess】を選択して【次へ】をクリック
①-④:ロール名と説明を記入して【ロールを作成】をクリック
①-⑤:EC2 > 作成したインスタンス選択 > アクション > セキュリティ > IAMロールを変更をクリック
①-⑥:先ほど作成したIAMロールを選択して【Update IAM role】をクリック
*作成したインスタンスのセキュリティタブで、以下の状態になっていれば適用完了です。
② CloudWatch Logs エージェント設定
②-①:サーバーにログイン
②-②: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"
⑦-②:アラームが【アラーム状態】になっていることを確認する
⑦-③:アラームに関するメールが届いているか確認する
*アラームメールが自分のメールアドレス宛てに届いていれば完了です。
まとめ
いかがでしたでしょうか?CloudWatch Logs で収集したログを、メトリクスフィルターで特定の文字列を設定してアラームとして通知させることは、そんなに難しくなかったのではないかと思います。
AWS で文字列監視をする際は、CloudWatch を利用すると簡単に実際することができるので、ぜひ運用監視で活用してみてください!
また、通知させるところは、Eメール以外にも Slack・Teems・Chatworkにも通知できます。設定方法は前回にブログでも書いているので気になる方はチェックしてくださいね!
ありがとうございました!
◇ CloudWatch アラーム を Teams・Chatwork に通知してみた!
◇ AWS Chatbot で CloudWatch アラームを Slack へ通知しよう!