如何为@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
相关产品推荐
相关产品推荐

