はじめに
以前、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関数に切り出して実装ことも検討してみるのが良さそうです。