MENU

AWS LambdaとCloudWatch Logs Insightsを組み合わせて効率的にログ分析

あわせて読みたい
AWS CloudWatch Logs Insightsで効率的なログ分析 AWS CloudWatch Log Insights便利だよね。まぁまぁコストはかかるけれど。これをプログラム的に実行するためのスニペットをChatGPT-4に書いてもらったので、その備忘録...

前回の記事の続き。ローカルで実行したCloudWatch Logs Insightsを使ったコードを、Lambda関数で実行するよ。

目次

はじめに

AWS LambdaとCloudWatch Logs Insightsを連携させることで、自動化された効率的なログ分析が可能になります。この記事では、その設定方法からテスト実行までの手順を詳しく説明します。

以下は、Lambda関数を使用してCloudWatch Logs Insightsからログを取得する一連の手順です。

IAMロールの作成

Lambda関数に適切な権限を持たせるために、関数に割り当てるIAMロールにCloudWatch Logs Insightsへのアクセス権限を付与する必要があります。この権限は、logs:StartQuery, logs:GetQueryResults, logs:StopQuery などが含まれます。

AWS Webコンソールを使用してLambda関数に適切なIAMロールを作成するには、以下の手順を実施します。

  1. AWS Management Consoleにログインし、IAM サービスに移動します。
  2. 左側のメニューからロールを選択し、「ロールの作成」 ボタンをクリックします。
  3. AWSサービスを選択し、Lambdaをクリックして、「次のステップ: アクセス権限」 ボタンをクリックします。
  4. 「ポリシーの作成」 ボタンをクリックして新しいポリシーを作成します。
  5. JSONタブを選択し、以下のポリシーを入力します。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "logs:StartQuery",
        "logs:GetQueryResults",
        "logs:StopQuery"
      ],
      "Resource": "*"
    }
  ]
}
  1. 上記のポリシーは、CloudWatch Logs Insightsにクエリを投げるための基本的なアクションを許可しています。
  2. 「タグ」 タブをクリックして必要なタグを追加し、「次のステップ: 確認」 ボタンをクリックします。
  3. ポリシーの名前と説明を入力し、「ポリシーの作成」 ボタンをクリックします。
  4. 作成したポリシーを選択し、「次のステップ: タグ」 ボタンをクリックして必要なタグを追加します。
  5. 「次のステップ: 確認」 ボタンをクリックし、ロールの名前と説明を入力して、「ロールの作成」 ボタンをクリックします。

これで、Lambda関数からCloudWatch Logs Insightsのクエリを実行するためのIAMロールが作成されました。このロールをLambda関数の作成時に選択して使用します。

(著者注記: 文言微妙に変わってるかも。名前とかは適当に)

Lambda関数の作成

Pythonを使用してLambda関数を作成し、CloudWatch Logs Insightsへのクエリを実行するコードを記述します。

  1. AWS Management Consoleにログインし、Lambda サービスに移動します。
  2. 「関数の作成」 ボタンをクリックします。
  3. 「一から作成」 を選択し、関数名とランタイム(Python 3.x)を選択します。
  4. IAMロール に先ほど作成したロールを適用します
  5. 「関数の作成」 ボタンをクリックします。
  6. 関数コードエディタで下記のLambda関数のコードを貼り付けます。
  7. Deployします
import boto3
import time
from datetime import datetime, timedelta

def lambda_handler(event, context):
    client = boto3.client('logs')
    log_group = 'your-log-group-name'
    end_time = datetime.now()
    start_time = end_time - timedelta(hours=1)

    start_query_response = client.start_query(
        logGroupName=log_group,
        startTime=int(start_time.timestamp() * 1000), # 開始時間(UNIXタイムスタンプ、ミリ秒)
        endTime=int(end_time.timestamp() * 1000),   # 終了時間(UNIXタイムスタンプ、ミリ秒)
        queryString="fields @timestamp, @message | filter level='INFO' | sort @timestamp desc",
        limit=1000
    )

    query_id = start_query_response['queryId']

    while True:
        response = client.get_query_results(queryId=query_id)
        if response['status'] == 'Complete':
            results = response['results']
            break
        time.sleep(1)

    return results

テストの実行

  1. 「テスト」 ドロップダウンメニューをクリックし、「新しいテストイベントの設定」 を選びます。
  2. テストイベントの名前を入力します。特に入力などはないので、hello-worldテンプレートをそのまま使って問題ありません
  3. 「作成」 ボタンをクリックしてテストイベントを作成します。
  4. 新しく作成したテストイベントが選択されていることを確認し、「テスト」 ボタンをクリックします。
  5. 実行が完了すると、結果ペインに関数の結果が表示されます。ここには、戻り値やログ出力、実行時間などの詳細が含まれます。
  6. 結果ペインの下部にある**「ログを表示」** リンクをクリックすると、完全なログ出力をCloudWatch Logsで確認することができます。

この手順により、AWS WebコンソールからLambda関数をテスト実行し、結果とログを確認することができます。関数の挙動を調整したい場合は、コードを編集し、再度テストを実行して確認します。

初期設定の3秒ではタイムアウトが発生する場合、下記手順によりタイムアウトを増加させます。

  1. Lambda関数のページで**「設定」** タブをクリックします。
  2. 「一般設定」 セクションで**「編集」** ボタンをクリックします。
  3. 「タイムアウト」 の値を増やし(例: 30秒)、「保存」 ボタンをクリックします。

まとめ

AWS LambdaとCloudWatch Logs Insightsを組み合わせることで、自動化された効率的なログ分析が容易になります。この記事の手順に従い、独自の分析タスクを自動化してみてください。

寸評

内容的にちょっと複雑なためか、記事は会話の内容を自分でかなりツギハギしている。さすがにこの内容を一発で出してくれるほど有能ではない模様。でも、イチから自分で書くよりよっぽど楽だね。

目次