CloudWatch ログを Datadog に転送してみた
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
Datadog を利用して様々なサーバー、クラウドサービスのログ監視や分析を行うことができます。
AWS サービスのログを Datadog に転送するには Datadog Forwarder という Lambda 関数を利用します。
今回は Datadog Forwarder を利用して CloudWatch ログを Datadog に転送してみました。
Datadog Forwarder の概要
Datadog Forwarder とは、CloudWatchログ、ELBアクセスやVPCフローログ、CloudTrail ログなど様々な AWS 上のログを Datadog に転送するための Lambda 関数です。
上記の Lambda 関数を呼び出すことでログの読み取りが行われ、Datadogにログが転送されます。
Datadog におけるログの費用
Datadog では1ヶ月あたりの取り込まれたログ容量(1GB)ごとに費用が発生します。
監視に必要のないログ(例えばデバックログ等)を Datadog へ転送しまうと、ログの費用が高額になるケースがあるのでご注意ください。
後述のサブスクリプションフィルタパターンを利用することで必要なログメッセージのみを転送する設定が可能です。
事前準備
Datadog Forwarder のセットアップには以下の事前準備が必要です。
-
DatadogAPI キー
Datadog コンソールから取得できます。
DatadogAPI キーは Datadog コンソールの左下のユーザ名にカーソルを移動し、表示されるメニューより API Keys を選択します。※Application Keysではないのでご注意ください。KEY をクリックして Copy を選択するとクリップボードに APIKEY をコピーできます。
-
Datadog の利用サイト情報
Datadog コンソールの URL より利用している Datadog サイトを確認ができます。https://docs.datadoghq.com/ja/getting_started/site/#datadog-サイトにアクセスする
Datadog Forwarder のセットアップ
CloudFormation テンプレートを使用して Lambda 関数をセットアップします。
なお、 Lambda 関数は利用したい AWS リージョンごとにのセットアップが必要となります。
1)下記 URL より CloudFormation にアクセスします。
2)次のパラメータを入力します。
-
DdApiKey
DatadogAPI キーの値 -
DdSite
Datadog の利用サイト
他のパラメーターはデフォルトのままで構いません。
3)AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。にチェックを入れて「スタックの作成」をクリックします。
4)作成が完了するまで待ちます。
CREATE_COMPLETEステータスになればセットアップ完了です。
作成された Lambda 関数を見てみます。
リソースタブより論理 ID が Forwarder となっている 物理 ID の URL をクリックすることで、作成された Lambda 関数を確認できます。
Lambda 関数以外にも Datadog APIキーが格納された secret 、IAMロール、S3 バケットなどが作成されています。
Lambda 関数のコードソースが書かれていないため、あれ!?と思いますが、Lambda レイヤーを通してロジックが実装されているため、問題ありません!
CloudWatch ロググループのサブスクリプションフィルター設定
Datadog に対してログの転送を行いたい CloudWatch ロググループに対して、サブスクリプションフィルターを設定します。
サブスクリプションフィルターの設定を行うことで、ロググループにログが書き込みされたことをトリガーに Lambda 関数が呼び出され、ログ読み取りと Datadog に対してログ転送が行われます。
1)CloudWatch ロググループより転送したいロググループを選択します。
2)アクションより「サブスクリプションフィルター」を選択し、「Lambda サブスクリプションフィルタを作成」をクリックします。
3)Lambda サブスクリプションフィルタを作成します。
-
Lambda関数
CloudFormation によって作成された Lambda 関数名を選択します。
-
ログ形式
出力されるログ形式に沿ったものを選択します。
今回はその他とします。
-
サブスクリプションフィルターのパターン(任意)
転送するログをキーワードで絞り込みしたい場合はフィルタパターンを入力します。
すべてのログを転送する場合は入力不要です。
今回は ERROR または CRITICAL を含むログメッセージのみを転送する以下のフィルタパターンとしました。
?ERROR ?CRITICAL
-
サブスクリプションフィルター名
任意の値を入力します。
4)ストリーミングを開始をクリックします。
ログ出力テスト
CloudWatch ロググループに擬似的なログイベントを作成して Datadog のログ転送のテストを行なっていきます。
1)CloudWatch ロググループより転送したいロググループを選択します。
2)ログストリームがない場合はログストリームを作成をクリックします。
3)任意のログストリーム名を入力の上、Createをクリックします。
4)ログストリームをクリックします。
5)アクションよりログイベントの作成をクリックします。
6)擬似ログイベントのメッセージを入力して作成をクリックします。
今回はテストログメッセージとして次のログイベントをそれぞれ作成しました。
[ERROR] Database connection failed. Unable to establish connection to MySQL server.
[INFO] Scheduled backup process initiated.
[CRITICAL] System shutdown initiated due to critical hardware failure. Immediate attention required.
[DEBUG] Function 'calculate_total' called with parameters: quantity=5, price=19.99
7)作成したログイベントが表示されていることを確認します。
Datadog でのログ確認方法
CloudWatch ロググループに作成したログイベントを Datadog で確認して行きます。
1)Datadog コンソールの Logs より Explorer をクリックします。
2)ログが表示されていることを確認します。
Explorer ではデフォルトで直近15分間のログが表示されるため、ログが出力された時間帯を含むタイムスライスに適宜変更の上、確認してみてください。
今回はサブスクリプションフィルタパターンを利用したため、 ERROR と CRITICAL を含むメッセージのみが Datadog に転送されていることを確認できました。
よくある問題
Datadog にログが送られない
ロググループにサブスクリプションフィルターを設定していないか、フィルタパターンの誤りが原因のことが多いです。
CloudFormation スタック作成時に入力した DatadogAPI キーに誤りがないかも確認ください。
サブスクリプション設定ができない
たくさんのロググループをサブスクリプション設定していると Lambda 関数のリソースベースのポリシー上限に抵触してサブスクリプションの設定ができないことがあります。
解決策としては次の方法が考えられます。
-
新しく Lambda 関数を作成する。
-
重複するポリシーステートメントを削除の上、ワイルドカードステートメントを置き換える。
置き換え手順については Re:post 記事をご参照ください。https://repost.aws/ja/knowledge-center/lambda-resource-based-policy-size-error
予期せぬログ急増を検知したい
次のメトリクスが用意されています。
異常検知もしくは閾値でモニタリング可能です。
datadog.estimated_usage.logs.ingested_bytes
datadog.estimated_usage.logs.ingested_events
まとめ
Datadog に CloudWatch ロググループのログを転送するためには Datadog Forwarder を利用し、Lambda サブスクリプションフィルタを設定する必要があります。
不要なログの転送を防ぐにはサブスクリプションフィルタパターンが有効です。
最後までご覧いただきありがとうございました。
本記事が誰かのお役に立てれば幸いです。