~~NOCACHE~~ ~~DISCUSSION~~ ## CloudWatchLogsの自動ログ解析/要約/通知 AmazonBedrockちょろっと試してみました。 構成はこんな感じで、定期実行したLambdaにCloudwatchlogsのログをBedrockに要約させてSNSでメール通知する仕組み 従来の英語だらけのエラーメッセージを自然言語のメールとすることで運用効率を向上できないかな!みたいな {{:Aws:AmazonBedrock:pasted:20251029-105133.png?nolink 800}} ### 設定 EventBridge、SNSは、CloudwatchLogsは割愛します。 IAMはLambdaに以下のポリシーをアタッチしています。※業務利用では絞ってください。 ・AmazonBedrockFullAccess1 ・AmazonSNSFullAccess1 ・AWSLambdaBasicExecutionRole ・CloudWatchLogsFullAccess #### Lambdaサンプルコード ハイライト行は適宜書き換えてください。 コード自体もAmazon Qに殆ど書いてもらいました ※Bedrockの応答に時間がかかる場合があるので、Lambdaの実行時間を延ばすのもポイントです。 8行目のmodel_id = "amazon.titan-text-express-v1"ですが、利用に際し申請が必要なものとそうでないものがあるので 申請不要のモデルとして上記の記載としています。 import json import boto3 from datetime import datetime, timedelta bedrock = boto3.client("bedrock-runtime", region_name="ap-northeast-1") logs = boto3.client("logs") sns = boto3.client("sns") model_id = "amazon.titan-text-express-v1" def summarize_with_claude(log_messages): messages = "\n".join(f"- {line}" for line in log_messages) prompt = f"""以下はログの抜粋です。内容を簡潔に要約し原因や傾向があれば記述してください。 {messages} 要約:""" body = { "inputText": prompt, "textGenerationConfig": { "maxTokenCount": 300, "temperature": 0.5 } } response = bedrock.invoke_model( modelId=model_id, body=json.dumps(body), contentType="application/json", accept="application/json" ) result = json.loads(response["body"].read()) return result["results"][0]["outputText"] def lambda_handler(event, context): log_group_name = "/aws/lambda/XXXXXXXXXXXXXXX" end_time = datetime.now() start_time = end_time - timedelta(hours=1) try: response = logs.filter_log_events( logGroupName=log_group_name, startTime=int(start_time.timestamp() * 1000), endTime=int(end_time.timestamp() * 1000) ) log_messages = [event['message'] for event in response['events']] if log_messages: summary = summarize_with_claude(log_messages[-20:]) sns.publish( TopicArn='arn:aws:sns:ap-northeast-1:111111111111:XXXXXXXX', Subject='定期ログ解析結果', Message=f"=== 定期ログ解析結果 ===\n{summary}" ) print("解析完了:", summary) else: print("対象期間にログなし") except Exception as e: print("エラー:", e) return { 'statusCode': 200, 'body': json.dumps('Log analysis completed.') } {{tag>AWS AmazonBedrock}}