Lambda挂载AWS EFS正常,但CloudFormation销毁/更新栈时卡顿
解决CloudFormation销毁/修改Lambda+EFS栈时的20分钟卡顿问题
问题根源
当CloudFormation销毁栈或替换Lambda资源(比如修改Lambda ID)时,会等待EFS的挂载连接完全断开后才能删除EFS资源。但Lambda的执行环境不会主动释放EFS挂载,AWS内部会强制等待20分钟的超时时间,导致操作卡顿。
解决方案
通过主动清理Lambda的EFS挂载或终止执行环境,让CloudFormation无需等待超时即可完成资源销毁/更新,以下是具体实现方法:
1. 用自定义资源主动移除Lambda的EFS挂载
在CDK中添加自定义资源(Custom Resource),在栈销毁、Lambda资源更新或删除前,调用Lambda API移除EFS挂载配置,强制断开连接。
修改你的CDK代码,添加以下逻辑:
// 导入自定义资源模块 import * as cr from 'aws-cdk-lib/custom-resources'; // ... 原有的VPC、EFS、Lambda创建代码 ... const createEmbeddingHandler = new lambda.DockerImageFunction(this, 'CreateEmbeddingLambdaFunction', { // ... 原有的Lambda配置 ... }); // 添加清理EFS挂载的自定义资源 const lambdaEfsCleanup = new cr.AwsCustomResource(this, 'LambdaEfsCleanup', { // 创建时初始化挂载配置(可选) onCreate: { service: 'Lambda', action: 'updateFunctionConfiguration', parameters: { FunctionName: createEmbeddingHandler.functionName, FileSystemConfigs: [{ Arn: accessPoint.accessPointArn, LocalMountPath: '/mnt/filesystem' }] }, physicalResourceId: cr.PhysicalResourceId.of(`LambdaEfsCleanup-${createEmbeddingHandler.functionName}`) }, // 删除前清空EFS挂载配置 onDelete: { service: 'Lambda', action: 'updateFunctionConfiguration', parameters: { FunctionName: createEmbeddingHandler.functionName, FileSystemConfigs: [] } }, // 更新时先移除旧挂载(适配Lambda ID修改场景) onUpdate: { service: 'Lambda', action: 'updateFunctionConfiguration', parameters: { FunctionName: createEmbeddingHandler.functionName, FileSystemConfigs: [] } }, // 赋予自定义资源修改Lambda配置的权限 policy: cr.AwsCustomResourcePolicy.fromSdkCalls({ resources: [createEmbeddingHandler.functionArn] }) }); // 确保Lambda资源的删除依赖于清理操作完成 createEmbeddingHandler.node.addDependency(lambdaEfsCleanup);
2. 强制终止Lambda执行环境(可选补充)
如果移除挂载后仍有延迟,可以在自定义资源中添加终止Lambda执行环境的操作,通过设置并发数为0强制停止所有运行中的实例:
// 修改onDelete的配置,替换为以下内容 onDelete: { service: 'Lambda', action: 'putFunctionConcurrency', parameters: { FunctionName: createEmbeddingHandler.functionName, ReservedConcurrentExecutions: 0 } }
执行此操作后,Lambda会立即终止所有运行中的执行环境,彻底断开EFS连接。
注意事项
- 自定义资源需要具备修改Lambda配置和设置并发数的权限,代码中的
AwsCustomResourcePolicy已经自动处理权限范围。 - 若修改Lambda ID(即创建新Lambda资源),旧Lambda的删除流程会触发自定义资源的
onDelete操作,确保旧挂载被清理。
内容的提问来源于stack exchange,提问作者OrderAndChaos
相关产品推荐
相关产品推荐

