API Getewayの実行ログ保持期間をCDKで設定する方法 <Custom Resourcesのみを使用するパターン>

2024.04.28

はじめに

以前、API Getewayの実行ログ保持期間をCDKで設定する方法として、Custom Resources と Lambda関数 を使用する方法を紹介しました。
※ 実行ログのログ保存期間はAPI Gatewayのコンストラクトでは設定できないため、Custom Resources と Lambda関数を使用して設定しました。


今回はCustom Resourcesのみで同様の設定を実現する方法を紹介します。

Custom Resources のみで実行ログの保持期間を設定する方法概要

今回はCustom Resourcesでデプロイ時にCloudWatchのAPI呼び出しをおこないます。
前回のブログでLambda関数内でSDKを使用して実行していたPutRetentionPolicyのAPI呼び出しを、Custom Resources内で実行します。

CDKのコード

32行目以降のCustom Resourcesの記述にCloudWatchのputRetentionPolicyのAPIの実行について記載しています。

./lib/api-stack.ts

import {
  aws_lambda,
  aws_lambda_nodejs,
  aws_apigateway,
  custom_resources,
} from 'aws-cdk-lib';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class ApiStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    const testFunc = new aws_lambda_nodejs.NodejsFunction(this, 'testFunc', {
      functionName: 'testFunc',
      runtime: aws_lambda.Runtime.NODEJS_20_X,
      architecture: aws_lambda.Architecture.ARM_64,
      entry:
        './src/lambda/handler.ts',
    });

    const restApi = new aws_apigateway.LambdaRestApi(this, 'RestApi', {
      handler: testFunc,
      deployOptions: {
        stageName: 'v1',
        tracingEnabled: true,
        dataTraceEnabled: true,
        loggingLevel: aws_apigateway.MethodLoggingLevel.ERROR,
      }
    });

    // デプロイ時にAPI Gatewayの実行ログの保持期間を変更するカスタムリソース
    new custom_resources.AwsCustomResource(this, 'CustomResource', {
      policy: custom_resources.AwsCustomResourcePolicy.fromSdkCalls({
        resources: custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE,
      }),
      onCreate: {
        service: 'CloudWatchLogs',
        action: 'putRetentionPolicy',
        parameters: {
          logGroupName: `API-Gateway-Execution-Logs_${restApi.restApiId}/${restApi.deploymentStage.stageName}`,
          retentionInDays: 180,
        },
        physicalResourceId: custom_resources.PhysicalResourceId.of(
          `API-Gateway-Execution-Logs_${restApi.restApiId}/${restApi.deploymentStage.stageName}`
        ),
      },
      onDelete: {
        service: 'CloudWatchLogs',
        action: 'deleteRetentionPolicy',
        parameters: {
          logGroupName: `API-Gateway-Execution-Logs_${restApi.restApiId}/${restApi.deploymentStage.stageName}`,
        },
      },
    });
  }
}

onCreate

onCreate配下にデプロイ時に実行したいAPIの詳細を記載します

  • service
    • どのサービスを使うかを指定します。今回はここの設定をCloudWatchLogsとしています。
  • action
    • CloudWatchLogsのどのアクションを行うか記載します。ここに今回肝となるputRetentionPolicyを記載します。
  • parameters
    • このパラメーター設定で対象のログループの指定と保持期間を設定します。
  • physicalResourceId
    • リソースの物理IDを指定します。ここは一意の値となる必要があり、今回はログループ名にしてます。

onDelete

onDelete配下にCDKスタック削除時に実行したい事を書きます。
今回、ログ保持期間をCDKコンストラクトで設定してないので、スタック削除で自動的には保持期間の設定が削除されないため、onDeleteで削除するように設定しています。

  • service
    • 対象サービスのCloudWatchLogsを指定します。
  • action
    • 保持期間を削除できるdeleteRetentionPolicyを指定します。

デプロイ

デプロイすると以下のようにAPI Gatewayの実行ログの保持期間が設定されます。

スタック削除

スタックを削除してみるとonDeleteで設定したdeleteRetentionPolicyが実行され、API Gatewayの実行ログの保持期間が削除され、Never Expireとなっています。

最後に

前回のブログでLambda関数内で実行していたPutRetentionPolicyのAPI呼び出しを、Custom Resources内で実行することで、Lambda関数を作成する手間が省けたり、CDKのコードをシンプルにできました。
今回のようにシンプルな処理であればCustom Resourcesのみで実装するほうが良さそうです。
対してより複雑な処理を実行したい場合はLambda関数に切り出して実装ことも検討してみるのが良さそうです。