はじめに
ECS上のタスクで特定の文字列をログに出力した際にCloudWatch Logsでアラームとして表示する方法を紹介します。
全体の流れ
やることは以下の通りです。
- CloudWatch Logsでロググループを作成する(任意)
- ECSでタスク定義を作成(更新)する(任意)
- CloudWatch Logsでメトリクスフィルタを作成する
- SNSでトピックとサブスクリプションを作成する
- CloudWatch Logsでアラームを作成する
ECSのデフォルトのロググループを使用する場合はロググループの作成は不要です。また、すでにタスク定義があり、ロググループを変更しない場合はタスク定義の作成(更新)は不要です。
CloudWatch Logsでロググループを作成する
まず始めにCloudWatch Logsでロググループを作成します。サイドバーの「ロググループ」の「ロググループの作成」から作成します。
ロググループ名と保存期間を決めてロググループを作成します。
ECSでタスク定義を作成(更新)する
ロググループを作成したらECSのタスク定義を更新します。「新しいリビジョンの作成」の「JSONを使用した新しいリビジョンの作成」をクリックし、「containerDefinitions」の中の「logConfiguration」の「awslogs-group」を作成したロググループ名にします。
更新後、新しいタスク定義をデプロイしておいてください。
CloudWatch Logsでメトリクスフィルタを作成する
タスクが立ち上がったら作成したロググループの「メトリクスフィルタ」のタブを開き、「メトリクスフィルタの作成」をクリックします。
フィルターパターンに検知したいログの文字列を入力します。
フィルター対象のログデータを選択し、パターンをテストしておきます(事前にログを出力させておきます)。
正しく検知できていれば、次へ進み任意のフィルタ名を入力します。
最後に、細かな設定を行っていきます。
「メトリクス名前空間」と「メトリクス名」に任意の名前を入力します。
「メトリクス値」はログが検知された際に記録される値(重み)です。今回は1にしておきます。
これらが設定できたら作成します。
SNSでトピックとサブスクリプションを作成する
アラームを作成する際に最低1つの通知先を登録する必要があるので、SNSでメールの送信先を登録します。
「トピック」から「トピックの作成」をクリックします。
「タイプ」で「スタンダード」を選択し、任意の名前を入力して作成します。
「プロトコル」にEメールを選択し、通知先のメールアドレスを入力して作成します。
サブスクリプションを作成すると以下のようなメールが送られてくるので、リンクをクリックしてSNSの設定は完了です。
CloudWatch Logsでアラームを作成する
最後にアラームを設定します。サイドバーの「アラームの作成」を開き、「アラームの作成」をクリックします。
メトリクスの選択で、先程作成したメトリクスを選択します(カスタム名前空間の中にある入力したメトリクス名前空間をクリックし、ディメンションなしのメトリクスに作成したメトリクスフィルターがあります)。
注意点として、1度でもメトリクスが記録されないと一覧に出てこないので、予めログを出力させてメトリクスフィルターに反映されていることを確認しておきます。
「メトリクスの選択」をクリックし、「条件」の「しきい値の種類」を「静的」、「以上」を選択し、しきい値の値(今回はすぐに確認したいので1とする)を入力して「次へ」をクリックします。
「アラーム状態トリガー」で「アラーム状態」を選択し、「通知の送信先」に先程作成したSNSのトピックを選択し、「次へ」をクリックします。
「アラーム名」に任意の名前を入力し、「次へ」をクリックします。
内容を確認して「アラームの作成」をクリックして作成します。作成後にログを出力させると以下のようなメールが送られてきます(一部抜粋)
その他
Slackに通知する
アラームが発生した際にSlackに通知する方法を紹介します。
Chatbotの画面を開き「チャットクライアント」にSlackを選択して「クライアント設定」をクリックします。
Slackとの連携画面が表示されるので連携したいワークスペースを選択して「許可する」をクリックします(事前にSlackへのログインが求められる場合があります)。
Slackのワークスペースが登録されたら、「新しいチャネルを設定」をクリックします。
任意の「設定名」を入力し、Slackチャネルを選択(プライベートチャネルの場合はチャネルIDを入力)します。
「アクセス許可」で任意のロール名を入力します。
「通知」でリージョンを選択し、トピックに先ほど作成したSNSのトピックを選択して「設定」をクリックします。
成功するとワークスペースにチャネルが追加されています。
構造化ログをメトリクスフィルタで扱う
構造化されたログを出力している場合、文字列一致ではなくキーとバリューが一致しているものを検知したいケースがあるとおもいます。その場合は以下のような書式で対応可能です。
特定のキーとバリューの組み合わせ
以下のように
{($.キー=バリュー)}
の書式でマッチさせることができます。
1 | {($.xxx="yyy")} |
配列の場合
配列の場合は添字
[i]
を付けます。
1 | {($.xxx[0]="yyy")} |
nullの場合
nullの場合は
IS NULL
を記載します。
1 | {($.xxx IS NULL)} |
他にもありますので詳しくは公式ドキュメントをご覧ください。
さいごに
ECSで特定の文字列をログ出力した際にCloud Watch Logsでアラームに表示する方法を紹介しました。