如何通过Terraform基于参数创建多个独立AWS Lambda函数?
解决Terraform部署Lambda时旧函数被销毁的问题
问题核心在于:你当前用单个Terraform状态文件管理资源,当var.RUNNER_NAME变化时,Terraform会判定需要替换现有的aws_lambda_function.executable资源(Lambda的function_name属于不可变更属性),因此会销毁旧函数再创建新的。要保留多个独立函数,需要让每次部署的状态彼此隔离,以下是两种可行方案:
方案一:使用Terraform工作区(Workspaces)
每个Lambda函数对应一个独立工作区,工作区名称与RUNNER_NAME一致,每个工作区拥有独立的状态文件,互相不干扰。
流水线脚本修改示例
在GitLab流水线的Terraform执行步骤中,先切换/创建对应工作区:
# 切换到指定工作区,不存在则创建 terraform workspace select ${RUNNER_NAME} || terraform workspace new ${RUNNER_NAME} # 初始化并部署 terraform init terraform apply -var "RUNNER_NAME=${RUNNER_NAME}" -var "DOCKER_PATH=${DOCKER_PATH}" -auto-approve
你的原有aws_lambda_function配置无需修改,每个工作区会独立管理自己的Lambda资源。
方案二:使用带动态路径的远程状态存储
如果用S3存储Terraform状态,可以将状态文件的路径包含RUNNER_NAME,让每个函数对应独立的状态文件。
修改Terraform后端配置
terraform { backend "s3" { bucket = "你的状态存储S3桶名称" key = "lambda-functions/${var.RUNNER_NAME}/terraform.tfstate" region = "你的AWS区域" } }
每次部署不同的RUNNER_NAME时,Terraform会加载对应路径的状态文件,管理独立的Lambda资源,不会影响之前部署的函数。
补充说明
Lambda的function_name是不可修改属性,这也是Terraform会销毁旧资源的直接原因。通过隔离状态的方式,让每个部署操作都针对全新的资源实例,就能实现多次触发后保留多个独立Lambda函数的需求。
内容的提问来源于stack exchange,提问作者Pinaki
相关产品推荐
相关产品推荐

