如何指定S3 autoDeleteObjects自动创建的Lambda的Node.js运行时版本?
问题解答
为什么自动创建的Lambda仍用Node.js 12.x?
CDK v1.152.0中,@aws-cdk/aws-s3模块的autoDeleteObjects功能,其内置的清理Lambda函数运行时是硬编码为Node.js 12.x的。虽然此时@aws-cdk/aws-lambda模块已经支持Node.js 14,但S3模块的这个内置功能还没同步更新默认运行时,所以即使全局支持高版本,自动生成的Lambda还是会沿用旧版本。
代码修改方法
你可以通过CDK的「逃生舱(Escape Hatch)」机制,定位到自动创建的Lambda函数,手动修改其运行时版本,具体操作如下:
1. 定位自动生成的Lambda资源
当你给S3 Bucket设置autoDeleteObjects: true后,CDK会自动创建一个命名类似BucketAutoDeleteObjectsXXX的Lambda函数。通过Bucket节点的node.findChild方法就能找到它:
import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; import * as lambda from '@aws-cdk/aws-lambda'; const app = new cdk.App(); const stack = new cdk.Stack(app, 'MyStack'); const bucket = new s3.Bucket(stack, 'MyBucket', { autoDeleteObjects: true, removalPolicy: cdk.RemovalPolicy.DESTROY, }); // 找到自动创建的清理Lambda const autoDeleteLambda = bucket.node.findChild('AutoDeleteObjects') as lambda.Function;
2. 修改运行时版本
找到Lambda后,直接修改其runtime属性为Node.js 14即可:
autoDeleteLambda.runtime = lambda.Runtime.NODEJS_14_X;
完整示例代码
import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; import * as lambda from '@aws-cdk/aws-lambda'; export class MyStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const bucket = new s3.Bucket(this, 'MyBucket', { autoDeleteObjects: true, removalPolicy: cdk.RemovalPolicy.DESTROY, }); // 定位并修改自动删除Lambda的运行时 const autoDeleteLambda = bucket.node.findChild('AutoDeleteObjects') as lambda.Function; autoDeleteLambda.runtime = lambda.Runtime.NODEJS_14_X; } } const app = new cdk.App(); new MyStack(app, 'MyStack');
验证修改
部署前可以执行cdk synth命令查看生成的CloudFormation模板,确认Lambda的Runtime字段已变为nodejs14.x。
内容的提问来源于stack exchange,提问作者TechQuestion
相关产品推荐
相关产品推荐

