EventBridge 通知を有効化した S3 バケットを CDK で構築すると、自動で Lambda 関数も作成されてしまいます。回避策を教えてください

EventBridge 通知を有効化した S3 バケットを CDK で構築すると、自動で Lambda 関数も作成されてしまいます。回避策を教えてください

Clock Icon2025.01.20

困っていること

EventBridge 通知を有効化した S3 バケットを以下の様な CDK コードで構築しようとしています。

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';

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

    const bucket = new s3.Bucket(this, 'S3TestBucket', {
      bucketName: 'test-bucket-XXXXXXXXXXXXX',
      removalPolicy: cdk.RemovalPolicy.RETAIN,
      versioned: false, 
      encryption: s3.BucketEncryption.S3_MANAGED,
      publicReadAccess: false,
      blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      eventBridgeEnabled: true,
    });
  }
}

デプロイしたところ、自動で以下の様な Lambda 関数も作成されてしまいました。
スクリーンショット 2025-01-20 095535
システムに直接関係のない関数をアカウント上に残したくないため、Lambda 関数を作成せずに EventBridge 通知を有効化した S3 バケットを CDK で構築する方法があれば教えてください。

どう対応すればいいの?

L2 コンストラクタで EventBridge 通知を有効化(eventBridgeEnabled を true に設定)した S3 バケットを構築した際に Lambda 関数および当該関数用の IAM ロールが自動で作成されてしまうことは 2025/1/20 現在において CDK の仕様となっています。
以下の GitHub Issue においても関連するケースが open になっていることが確認できます。
https://github.com/aws/aws-cdk/issues/26772

上記 Issue のコメント欄にも記載がありますが、以下の様に L1 コンストラクタを利用する方式で EventBridge 通知を有効化することで、Lambda 関数および IAM ロールの自動作成を回避できます。

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';

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

    const bucket = new s3.Bucket(this, 'S3TestBucket', {
      bucketName: 'test-bucket-XXXXXXXXXXXXX',
      removalPolicy: cdk.RemovalPolicy.RETAIN,
      versioned: false,
      encryption: s3.BucketEncryption.S3_MANAGED,
      publicReadAccess: false,
      blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      // eventBridgeEnabled: true,
    });

    (bucket.node.defaultChild as s3.CfnBucket).notificationConfiguration = {
      eventBridgeConfiguration: {
        eventBridgeEnabled: true,
      },
    };
  }
}

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.