みなさんこんにちは。マネージドサービス部MSS課の塩野(正)です。
早いもので今週が終われば今年も残りあと3か月となりました。 そろそろモンブランやらサツマイモのスイーツやら秋の味覚が出そろってくるので、また体重が増えそうな予感がします(汗
さて、前回はAmazon CloudWatch Logsのメトリクスフィルタとサブスクリプションフィルタの違いについてのお話をしましたが、今回はこれらのフィルタの設定についてのお話をさせていただきます。メトリクスフィルタとサブスクリプションフィルタの違いについては下記の記事をご確認ください。
目次
想定読者
- CloudwatchLogsのメトリクスフィルタ、サブスクリプションフィルタの設定方法を知りたい方
- コマンドラインでメトリクスフィルタ、サブスクリプションフィルタを設定したい方
Amazon CloudWatchLogs ロググループの設定
まずか検証を行うためのロググループを作成します。AWSマネジメントコンソールにログインし、CloudWatch>ロググループの画面を開き、ロググループを作成ボタンをクリックします。

任意のロググループ名を入力し、作成ボタンをクリックします。もしログを長期保存したくない場合は保持期間の設定を適宜修正してみてください。

これでCloudWatchLogs のロググループが作成できました。

メトリクスフィルタの設定
設定の流れ
それではメトリクスフィルタの設定を実施していきます。先ほど作成したロググループをクリックして開きます。

次にメトリクスフィルタのタブをクリックして開き、「メトリクスフィルターを作成」をクリックします。

フィルタパターンにフィルタしたい文字列を入れてNextをクリックします。フィルタパターンはフィルタしたい文字列が1つだけの場合はそのまま文字列を入力すればよく、複数あったりもう少し細かい条件を指定したい場合は正規表現で指定します。

次にフィルタ名、メトリクス名前空間、メトリクス名を入力します。

フィルタ名はメトリクスフィルタの一覧に表示される名前で、メトリクス名前空間とメトリクス名は両方ともCloudwatchメトリクスとして出力されます。メトリクス名前空間はそれぞれのメトリクスをグループ化する器のようなものと認識いただければ問題ありません。メトリクス名はその中に値を入れるための場所となり、同じ名前空間でもメトリクス名が異なっている場合は別物として扱われます。
このあたりの細かい概念については下記ドキュメントをご参照ください。
メトリクス値の部分はフィルタパターンが一致した場合のCloudwatchに発行する値になります。またデフォルト値は値が一致しなかった場合に発行する値となり、Cloudwatchアラーム側でどのように監視をおこなうかといった観点でメトリクス値やデフォルト値を決めていくのがいいと思います。値の設定が終わりましたらNextをクリックします。

設定値に間違いがないことを確認の上、「メトリクスフィルタを作成」をクリックして設定を完了させます。

動作確認
それでは作成したロググループに書き込みをしてみましょう。今回はテストとなりますので、AWSマネジメントコンソール上でテストログの書き込みを行います。先ほど設定したロググループの詳細画面を開き、ログストリームタブからログストリームを作成します。

任意の名前で問題ありませんので、今回は kensho-log-stream で作成します。

ログストリームが完成しました。次に作成したロググループを開きます。

アクションからログイベントの作成を行います。

今回の検知文字列はERRORで設定していますので、ERRORを含む任意の文字列を含むログイベントを作成します。

意図した通り、ログイベントが書き込まれました。それではこのログイベントからメトリクスフィルタを介して検知できたか確認してみましょう。

Cloudwatchの画面内にあるすべてのメトリクスを開きます。すると先ほど設定したkensho-log-groupが見つかりますので、これを開きます。

ディメンションなしのメトリクスを開きます。

設定したメトリクスが検知できていることを確認できました。

メトリクスストリームの設定と動作確認は以上になります。
サブスクリプションフィルタの設定
設定の流れ
次にサブスクリプションフィルタの設定を実施していきます。先ほど作成したロググループをクリックして開きます。サブスクリプションフィルタのタブの中にある作成をクリックし、作成したいサブスクリプションフィルタの種類を選択します。今回はAmazon Data Firehoseサブスクリプションフィルタの作成を行います。

事前に作成しておいた、Amazon Data FirehoseストリームとIAMロールを選択します。

サブスクリプションフィルタ名を入力します。また、必要に応じてサブスクリプションフィルタのパターンを設定します。

転送先の要件でログ形式の変更が必要な場合は下記の中から要件を満たすログ形式を選択します。

設定内容に問題がなければストリーミングを開始をクリックします。

サブスクリプションフィルタの一覧にフィルタ名が表示されていれば設定は完了です。

動作確認
それでは作成したロググループに書き込みをしてみましょう。今回はテストとなりますので、AWSマネジメントコンソール上でテストログの書き込みを行います。 先ほど作成したログストリームを流用します。

先ほどと同様にログイベントの作成を行います。

ログイベントが作成できました。

Amazon Data Firehoseストリームは、New Relicのログ機能に転送される設定になっているものを使用していたので、ログがNew Relicのログ機能に転送されていることを確認します。New Relicにログインし、Logsメニューからログが転送されていることを確認します。
意図した通りログが転送されていることを確認できました。

このようにサブスクリプションフィルタでは、Amazon CloudWatch Logsの情報を他のAWSサービスや他のSaaSサービスに転送できるサービスになります。
おまけ
サブスクリプションフィルタ設定(AWS CLI版)
たくさんのロググループに対してサブスクリプションフィルタの設定を行いたい場合、ひとつひとつGUIの画面上でポチポチやると設定ミスが起こったり、膨大な時間がかかりますよね。下記のようなaws cliコマンドを使用するとこの設定をコマンドラインで実施することができます。
aws logs put-subscription-filter \
--log-group-name <ロググループ名> \
--filter-name <フィルタ名> \
--filter-pattern <フィルタパターン> \
--destination-arn <送信先のARN> \
--role-arn <IAMロールのARN>
AWS CLIを使ったロググループ一覧の抽出
まロググループをAWSマネジメントコンソールからコピペするのも割と大変なので、こういったコマンドを併用すると設定作業がとても楽になれます。
テーブル形式で出力
aws logs describe-log-groups --query 'logGroups[].[logGroupName,arn]' --output table
JSON形式で出力
aws logs describe-log-groups --query 'logGroups[].[logGroupName,arn]' --output json
ファイルに出力する
aws logs describe-log-groups --query 'logGroups[].[logGroupName,arn]' --output text >> ./output.txt aws logs describe-log-groups --query 'logGroups[].[logGroupName,arn]' --output table >> ./output.txt
サブスクリプションフィルタが設定されているロググループ抽出
最後にサブスクリプションフィルタを設定確認する際にGUIでポチポチ確認していくのって大変ですよね。 そんな時にはこちらのコマンドを使うことでサブスクリプションフィルタ設定済みのロググループと送信先ARNを抽出することができます。
aws logs describe-log-groups --query 'logGroups[*].logGroupName' --output text | \
tr '\t' '\n' | \
while IFS= read -r log_group; do
filters=$(aws logs describe-subscription-filters --log-group-name "$log_group" --query "subscriptionFilters[0].[logGroupName, destinationArn]" --output text 2>/dev/null)
if [ -n "$filters" ] && ! echo "$filters" | grep -q "None"; then
echo "$filters" | awk '{if ($1 != "None" && $2 != "None") print $0}'
fi
done

まとめ
今回はAmazon CloudWatch Logsのメトリクスフィルタとサブスクリプションフィルタの設定方法についてまとめてみました。設定する数が少なければGUIでポチポチやる方がいいですし、設定する数が多い場合はaws cliを併用して設定することで素早く設定ができると思います。特にAmazon CloudWatch LogsのメトリクスフィルタとサブスクリプションフィルタはAWSログ監視でよく使用する機能となりますので、もし使ったことがないよという方がいらっしゃったら一度試していただければと思います。
こちらの記事がどなたかのお役に立てれば幸いです。
関連記事
◆ 塩野 正人
◆ マネージドサービス部 所属
◆ X(Twitter):@shioccii
◆ 過去記事はこちら
前職ではオンプレミスで仮想化基盤の構築や運用に従事。現在は運用部隊でNew Relicを使ってサービス改善に奮闘中。New Relic User Group運営。