AWS CDK v2.111.0 で Amazon CloudWatch Logs 低頻度アクセスを L2 Construct で設定可能になりました #AWSreInvent

2023.11.28

こんにちは、CX 事業本部 Delivery 部の若槻です。

昨日のアップデートで、Amazon CloudWatch Logs でロググループクラスに Infrequent Access が追加され、ログを低頻度アクセスとすることによるコスト削減が可能になりました。

そして本日リリースされた AWS CDK v2.111.0 でも、ログクラスが Amazon CloudWatch Logs Group の L2 Construct で設定可能になりました。

aws-logs: add LogGroupClass property to AWS::Logs::LogGroup (da47ee6)

試してみた

CDK モジュールのアップデート

AWS CDK のモジュールを v2.111.0 以上にアップグレードします。

npm i aws-cdk@latest aws-cdk-lib@latest

型定義の確認

aws_logs のプロパティを確認すると、LogGroupClass というプロパティが追加されており、標準の STANDARD と低頻度の INFREQUENT_ACCESS が設定可能になっています。

node_modules/aws-cdk-lib/aws-logs/lib/log-group.d.ts

/**
 * Class of Log Group.
 */
export declare enum LogGroupClass {
    /**
     * Default class of logs services
     */
    STANDARD = "STANDARD",
    /**
     * Class for reduced logs services
     */
    INFREQUENT_ACCESS = "INFREQUENT_ACCESS"
}

Infrequent Access を設定してみる

ロググループに Infrequent Access を CDK で設定してみます。

lib/cdk-sample-stack.ts

import { aws_logs, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

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

    new aws_logs.LogGroup(this, 'LogGroup', {
      logGroupClass: aws_logs.LogGroupClass.INFREQUENT_ACCESS,
    });
  }
}

CDK デプロイにより作成されたロググループの設定を確認すると、Log class が Infrequent Access となり、また一部の機能が制限されていることが確認できます。

ログクラスを Infrequent Access としてロググループを作成することができました。

作成済みのロググループのログクラスは変更不可

作成済みのロググループのログクラスを変更することはできません。

先程作成したロググループのログクラスを STANDARD に変更してみます。

lib/cdk-sample-stack.ts

import { aws_logs, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

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

    new aws_logs.LogGroup(this, 'LogGroup', {
      logGroupClass: aws_logs.LogGroupClass.STANDARD,
    });
  }
}

CDK デプロイをすると、以下のようにエラーが発生しログクラスは変更できない挙動となります。

cdk deploy --method=direct

✨  Synthesis time: 2.42s

CdkSampleStack:  start: Building f2d00789720ead1d47bde1e0ff45537a408daaa12eafa568fa7e97767f4f5288:current_account-current_region
CdkSampleStack:  success: Built f2d00789720ead1d47bde1e0ff45537a408daaa12eafa568fa7e97767f4f5288:current_account-current_region
CdkSampleStack:  start: Publishing f2d00789720ead1d47bde1e0ff45537a408daaa12eafa568fa7e97767f4f5288:current_account-current_region
CdkSampleStack:  success: Published f2d00789720ead1d47bde1e0ff45537a408daaa12eafa568fa7e97767f4f5288:current_account-current_region
CdkSampleStack: deploying... [1/1]
CdkSampleStack: updating stack...

 ❌  CdkSampleStack failed: Error [ValidationError]: Stack:arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXXX:stack/CdkSampleStack/64865330-32dd-11ee-966b-0ad98d96b631 is in UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS state and can not be updated.
    at Request.extractError (/usr/local/lib/node_modules/aws-cdk/lib/index.js:366:46430)
    at Request.callListeners (/usr/local/lib/node_modules/aws-cdk/lib/index.js:366:90226)
    at Request.emit (/usr/local/lib/node_modules/aws-cdk/lib/index.js:366:89674)
    at Request.emit (/usr/local/lib/node_modules/aws-cdk/lib/index.js:366:196432)
    at Request.transition (/usr/local/lib/node_modules/aws-cdk/lib/index.js:366:189984)
    at AcceptorStateMachine.runTo (/usr/local/lib/node_modules/aws-cdk/lib/index.js:366:154856)
    at /usr/local/lib/node_modules/aws-cdk/lib/index.js:366:155186
    at Request.<anonymous> (/usr/local/lib/node_modules/aws-cdk/lib/index.js:366:190276)
    at Request.<anonymous> (/usr/local/lib/node_modules/aws-cdk/lib/index.js:366:196507)
    at Request.callListeners (/usr/local/lib/node_modules/aws-cdk/lib/index.js:366:90394) {
  code: 'ValidationError',
  time: 2023-11-27T21:50:09.538Z,
  requestId: '683c9d2c-9326-4b8c-84db-b229e66acce1',
  statusCode: 400,
  retryable: false,
  retryDelay: 343.6182234181282
}

Infrequent Access のロググループでサブスクリプションフィルターは設定不可

Infrequent Access のロググループでは、サブスクリプションフィルターなどの一部機能が利用できなくなります。

以下のように、Infrequent Access のロググループのサブスクリプションフィルターを設定してみます。

lib/cdk-sample-stack.ts

import {
  aws_logs,
  aws_logs_destinations,
  aws_lambda,
  Stack,
  StackProps,
} from 'aws-cdk-lib';
import { Construct } from 'constructs';

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

    const logGroup = new aws_logs.LogGroup(this, 'LogGroup', {
      logGroupClass: aws_logs.LogGroupClass.INFREQUENT_ACCESS,
    });

    const subscriptionFunction = new aws_lambda.Function(
      this,
      'SubscriptionFunction',
      {
        code: aws_lambda.Code.fromInline(
          'exports.handler = function(event, ctx, cb) { return cb(null, "hi"); }'
        ),
        handler: 'index.handler',
        runtime: aws_lambda.Runtime.NODEJS_LATEST,
      }
    );

    logGroup.addSubscriptionFilter('Subscription', {
      destination: new aws_logs_destinations.LambdaDestination(
        subscriptionFunction
      ),
      filterPattern: aws_logs.FilterPattern.anyTerm('[ERROR] default'),
    });
  }
}

CDK デプロイをすると、This operation is only supported on the Standard log class. というエラーが発生し、サブスクリプションフィルターの設定ができないことが確認できます。

CdkSampleStack: deploying... [1/1]
CdkSampleStack: updating stack...
1:45:31 PM | CREATE_FAILED        | AWS::Logs::SubscriptionFilter | LogGroup/Subscription
Resource handler returned message: "This operation is only supported on the Standard log class. (Service: CloudWatchLo
gs, Status Code: 400, Request ID: e7071a9b-f1f2-4600-931e-c751f32c2e18)" (RequestToken: c7937a43-ba44-7b86-9fc0-900aff
f024bf, HandlerErrorCode: GeneralServiceException)
1:45:31 PM | UPDATE_ROLLBACK_IN_P | AWS::CloudFormation::Stack    | CdkSampleStack
The following resource(s) failed to create: [LogGroupSubscriptionE3573E29].
1:45:36 PM | UPDATE_ROLLBACK_COMP | AWS::CloudFormation::Stack    | CdkSampleStack
1:45:37 PM | DELETE_IN_PROGRESS   | AWS::Logs::SubscriptionFilter | LogGroup/Subscription
1:45:38 PM | DELETE_FAILED        | AWS::Logs::SubscriptionFilter | LogGroup/Subscription
Resource handler returned message: "This operation is only supported on the Standard log class. (Service: CloudWatchLo
gs, Status Code: 400, Request ID: 1eaf2e9a-e00d-480b-b3f2-b6d693eb7025)" (RequestToken: 7ef6d282-852e-dd99-aca9-2b68c6
18b3a3, HandlerErrorCode: GeneralServiceException)

おわりに

AWS CDK v2.111.0 で Amazon CloudWatch Logs 低頻度アクセスを L2 Construct で設定可能になったので試してみました。

Amazon CloudWatch Logs 低頻度アクセスは、アラート通知やデバッグに活用することなくただ貯めっぱなししたいログを貯めたい場合に役立つ機能です。また、AWS re:Invent 期間中のアップデートが AWS CDK でも早速使えるようになるのは素晴らしいですね。コントリビューターの方々にも感謝。

以上