kakakakakku blog

Weekly Tech Blog: Keep on Learning!

AWS CDK で AWS Lambda 関数の高度なログ制御機能(フォーマット・ログレベル・ログ集約)を設定する

2023年11月にリリースされた AWS Lambda 関数の「高度なログ制御機能 (advanced logging controls)」によって,大きく3種類の追加設定ができるようになった💡どれも AWS Lambda 関数を多く運用しているチームになどに嬉しいアップデートではあるけど,個人的には特に「任意の Amazon CloudWatch Logs Group」にログを集約できるのは便利だと思う❗️

  1. AWS Lambda 関数のログフォーマットを JSON に変更できる
  2. AWS Lambda 関数のログレベルをコードを変更せずに設定できる
  3. 任意の Amazon CloudWatch Logs Group にログを集約できる

むしろ今までの経験から AWS Lambda 関数の Amazon CloudWatch Logs Group は /aws/lambda/xxxxx である(そう仕様で決まっている✔️)という認識がまだ頭のどこかに残ってて,ログ集約の設定をした AWS Lambda 関数のモニタリング設定を見ると見慣れない感じがあるのは僕だけ?笑

aws.amazon.com

aws.amazon.com

高度なログ制御機能の詳細(ログライブラリの話など)は以下のドキュメントにまとまっている📝 現状だとまだ日本語版は内容が古そう.

docs.aws.amazon.com

AWS CDK で試す

AWS CDK では v2.110.0 から AWS Lambda 関数の高度なログ制御機能を設定できるようになっていた❗️試してみたサンプルコード (TypeScript) を載せておく.

github.com

docs.aws.amazon.com

👾 sandbox-cdk-serverless-stack.ts

サンプルコードでは以下のように高度なログ制御機能を設定した💡

  • logFormat でログフォーマットを JSON に
  • systemLogLevel でシステムログレベルを WARN に
  • applicationLogLevel でアプリケーションログレベルを INFO に
  • logGroup で Amazon CloudWatch Logs Group sandbox-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,
    });
  }
}

結果

期待通り「ロギング設定」を設定できた❗️

ロギング設定を設定できた

関連記事

kakakakakku.hatenablog.com