2023年11月にリリースされた AWS Lambda 関数の「高度なログ制御機能 (advanced logging controls)」によって,大きく3種類の追加設定ができるようになった💡どれも AWS Lambda 関数を多く運用しているチームになどに嬉しいアップデートではあるけど,個人的には特に「任意の Amazon CloudWatch Logs Group」にログを集約できるのは便利だと思う❗️
- AWS Lambda 関数のログフォーマットを JSON に変更できる
- AWS Lambda 関数のログレベルをコードを変更せずに設定できる
- 任意の Amazon CloudWatch Logs Group にログを集約できる
むしろ今までの経験から AWS Lambda 関数の Amazon CloudWatch Logs Group は /aws/lambda/xxxxx
である(そう仕様で決まっている✔️)という認識がまだ頭のどこかに残ってて,ログ集約の設定をした AWS Lambda 関数のモニタリング設定を見ると見慣れない感じがあるのは僕だけ?笑
高度なログ制御機能の詳細(ログライブラリの話など)は以下のドキュメントにまとまっている📝 現状だとまだ日本語版は内容が古そう.
AWS CDK で試す
AWS CDK では v2.110.0 から AWS Lambda 関数の高度なログ制御機能を設定できるようになっていた❗️試してみたサンプルコード (TypeScript) を載せておく.
👾 sandbox-cdk-serverless-stack.ts
サンプルコードでは以下のように高度なログ制御機能を設定した💡
logFormat
でログフォーマットを JSON にsystemLogLevel
でシステムログレベルを WARN にapplicationLogLevel
でアプリケーションログレベルを INFO にlogGroup
で Amazon CloudWatch Logs Groupsandbox-cdk-aggregated-lambda-log-group
にログを集約するように
import { RemovalPolicy, Stack, StackProps, aws_iam, aws_lambda, aws_logs, } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import path = require('path'); export class SandboxCdkServerlessStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const lambdaBasicExecutionRole = new aws_iam.Role(this, 'SandboxCdkLambdaBasicExecutionRole', { roleName: 'lambda-basic-execution-role', assumedBy: new aws_iam.ServicePrincipal('lambda.amazonaws.com'), managedPolicies: [ aws_iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole') ] }); const aggregatedLambdaLogGroup = new aws_logs.LogGroup(this, 'SandboxCdkAggregatedLambdaLogGroup', { logGroupName: 'sandbox-cdk-aggregated-lambda-log-group', retention: aws_logs.RetentionDays.ONE_WEEK, removalPolicy: RemovalPolicy.DESTROY, }); new aws_lambda.Function(this, 'SandboxCdkLambdaFunctionHello', { functionName: 'sandbox-cdk-hello-function', runtime: aws_lambda.Runtime.PYTHON_3_12, code: aws_lambda.Code.fromAsset(path.join(__dirname, '../functions/hello')), handler: 'app.lambda_handler', role: lambdaBasicExecutionRole, logFormat: aws_lambda.LogFormat.JSON, systemLogLevel: aws_lambda.SystemLogLevel.WARN, applicationLogLevel: aws_lambda.ApplicationLogLevel.INFO, logGroup: aggregatedLambdaLogGroup, }); new aws_lambda.Function(this, 'SandboxCdkAwsLambdaFunctionBye', { functionName: 'sandbox-cdk-bye-function', runtime: aws_lambda.Runtime.PYTHON_3_12, code: aws_lambda.Code.fromAsset(path.join(__dirname, '../functions/bye')), handler: 'app.lambda_handler', role: lambdaBasicExecutionRole, logFormat: aws_lambda.LogFormat.JSON, systemLogLevel: aws_lambda.SystemLogLevel.WARN, applicationLogLevel: aws_lambda.ApplicationLogLevel.INFO, logGroup: aggregatedLambdaLogGroup, }); } }
結果
期待通り「ロギング設定」を設定できた❗️