You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为@aws-cdk/aws-s3-deployment的Lambda函数设置名称?

为aws-cdk/aws-s3-deployment的Lambda函数指定名称并解决日志组问题

可以通过自定义部署Lambda函数的方式指定名称,同时解决日志组的保留期、删除策略和标签问题,具体方案如下:

方案一:自定义SingletonFunction并指定名称

S3Deployment构造允许通过deployer参数传入自定义的SingletonFunction,你可以在这个自定义函数里直接指定名称,同时配置日志相关属性:

import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as s3deploy from 'aws-cdk-lib/aws-s3-deployment';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as logs from 'aws-cdk-lib/aws-logs';

const app = new cdk.App();
const stack = new cdk.Stack(app, 'MyStack');

// 目标存储桶
const targetBucket = new s3.Bucket(stack, 'TargetBucket');

// 自定义部署用的SingletonFunction,指定函数名和日志保留期
const customDeployer = new lambda.SingletonFunction(stack, 'S3DeployerLambda', {
  uuid: 'f7d4f730-4ee1-11e8-9c2d-fa7ae01bbebc', // 固定UUID保证单例特性
  code: lambda.Code.fromAsset('node_modules/aws-cdk-lib/aws-s3-deployment/lib/lambda'),
  handler: 'index.handler',
  runtime: lambda.Runtime.NODEJS_18_X,
  functionName: 'MyCustomS3DeployerLambda', // 这里设置你想要的Lambda名称
  logRetention: logs.RetentionDays.ONE_WEEK, // 直接配置日志保留期
});

// 使用自定义deployer执行S3部署
new s3deploy.BucketDeployment(stack, 'DeployStaticFiles', {
  sources: [s3deploy.Source.asset('./dist')],
  destinationBucket: targetBucket,
  deployer: customDeployer,
});

// 给日志组添加合规标签并设置随堆栈删除
const deployerLogGroup = logs.LogGroup.fromLogGroupName(stack, 'DeployerLogGroup', `/aws/lambda/${customDeployer.functionName}`);
deployerLogGroup.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
cdk.Tags.of(deployerLogGroup).add({
  Compliance: 'GDPR',
  Environment: 'Production',
  'aws:cdk:remove-on-destroy': 'true'
});

方案二:使用Aspect自动修复日志组(无需提前知道Lambda名称)

如果不想自定义deployer,也可以通过CDK的Aspect机制遍历堆栈资源,找到S3Deployment对应的Lambda函数,再修改其日志组属性:

import * as cdk from 'aws-cdk-lib';
import { Aspects, IAspect } from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as logs from 'aws-cdk-lib/aws-logs';

// 定义Aspect类,处理Lambda日志组
class LambdaLogGroupComplianceFixer implements IAspect {
  visit(node: cdk.IConstruct): void {
    // 匹配S3Deployment相关的Lambda函数(函数路径通常包含BucketDeployment关键字)
    if (node instanceof lambda.Function && node.node.path.includes('BucketDeployment')) {
      const logGroup = logs.LogGroup.fromLogGroupName(node, 'AutoFixLogGroup', `/aws/lambda/${node.functionName}`);
      // 设置日志保留期
      logGroup.logRetention = logs.RetentionDays.ONE_MONTH;
      // 设置日志组随堆栈删除
      logGroup.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
      // 添加合规标签
      cdk.Tags.of(logGroup).add({
        Compliance: 'GDPR',
        Environment: 'Production'
      });
    }
  }
}

// 给堆栈添加Aspect
Aspects.of(stack).add(new LambdaLogGroupComplianceFixer());

关键说明

  • 方案一通过自定义deployer完全掌控Lambda的配置,包括名称、日志保留期等,是最直接的解决方式。
  • 方案二适合不想修改原有部署逻辑的场景,通过自动匹配资源来修复日志组问题,无需提前知晓Lambda名称。

内容的提问来源于stack exchange,提问作者Nathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:22:55