API Getewayの実行ログ保持期間をCDKで設定する方法 <Custom Resourcesのみを使用するパターン>
はじめに
以前、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の実行について記載しています。
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関数に切り出して実装ことも検討してみるのが良さそうです。