
前回の記事の続き。ローカルで実行した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ロールを作成するには、以下の手順を実施します。
- AWS Management Consoleにログインし、IAM サービスに移動します。
- 左側のメニューからロールを選択し、「ロールの作成」 ボタンをクリックします。
- AWSサービスを選択し、Lambdaをクリックして、「次のステップ: アクセス権限」 ボタンをクリックします。
- 「ポリシーの作成」 ボタンをクリックして新しいポリシーを作成します。
- JSONタブを選択し、以下のポリシーを入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"logs:StartQuery",
"logs:GetQueryResults",
"logs:StopQuery"
],
"Resource": "*"
}
]
}
- 上記のポリシーは、CloudWatch Logs Insightsにクエリを投げるための基本的なアクションを許可しています。
- 「タグ」 タブをクリックして必要なタグを追加し、「次のステップ: 確認」 ボタンをクリックします。
- ポリシーの名前と説明を入力し、「ポリシーの作成」 ボタンをクリックします。
- 作成したポリシーを選択し、「次のステップ: タグ」 ボタンをクリックして必要なタグを追加します。
- 「次のステップ: 確認」 ボタンをクリックし、ロールの名前と説明を入力して、「ロールの作成」 ボタンをクリックします。
これで、Lambda関数からCloudWatch Logs Insightsのクエリを実行するためのIAMロールが作成されました。このロールをLambda関数の作成時に選択して使用します。
(著者注記: 文言微妙に変わってるかも。名前とかは適当に)
Lambda関数の作成
Pythonを使用してLambda関数を作成し、CloudWatch Logs Insightsへのクエリを実行するコードを記述します。
- AWS Management Consoleにログインし、Lambda サービスに移動します。
- 「関数の作成」 ボタンをクリックします。
- 「一から作成」 を選択し、関数名とランタイム(Python 3.x)を選択します。
- IAMロール に先ほど作成したロールを適用します
- 「関数の作成」 ボタンをクリックします。
- 関数コードエディタで下記のLambda関数のコードを貼り付けます。
- 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
テストの実行
- 「テスト」 ドロップダウンメニューをクリックし、「新しいテストイベントの設定」 を選びます。
- テストイベントの名前を入力します。特に入力などはないので、hello-worldテンプレートをそのまま使って問題ありません
- 「作成」 ボタンをクリックしてテストイベントを作成します。
- 新しく作成したテストイベントが選択されていることを確認し、「テスト」 ボタンをクリックします。
- 実行が完了すると、結果ペインに関数の結果が表示されます。ここには、戻り値やログ出力、実行時間などの詳細が含まれます。
- 結果ペインの下部にある**「ログを表示」** リンクをクリックすると、完全なログ出力をCloudWatch Logsで確認することができます。
この手順により、AWS WebコンソールからLambda関数をテスト実行し、結果とログを確認することができます。関数の挙動を調整したい場合は、コードを編集し、再度テストを実行して確認します。
初期設定の3秒ではタイムアウトが発生する場合、下記手順によりタイムアウトを増加させます。
- Lambda関数のページで**「設定」** タブをクリックします。
- 「一般設定」 セクションで**「編集」** ボタンをクリックします。
- 「タイムアウト」 の値を増やし(例: 30秒)、「保存」 ボタンをクリックします。
まとめ
AWS LambdaとCloudWatch Logs Insightsを組み合わせることで、自動化された効率的なログ分析が容易になります。この記事の手順に従い、独自の分析タスクを自動化してみてください。
寸評
内容的にちょっと複雑なためか、記事は会話の内容を自分でかなりツギハギしている。さすがにこの内容を一発で出してくれるほど有能ではない模様。でも、イチから自分で書くよりよっぽど楽だね。