如何通过AWS Lambda脚本配合Terraform无服务器部署AWS基础设施
基于AWS Lambda的Terraform无服务器部署实现方案
实现可行性验证
你提出的思路完全可落地:Linux版Terraform二进制体积通常在100MB以内,符合Lambda部署包解压后不超过250MB的限制,配合S3存储源码、状态文件即可实现全链路无服务器部署。
具体落地步骤
- 准备Lambda部署包
下载对应Lambda架构(AMD64/ARM64)的Amazon Linux适配版Terraform二进制文件,和你编写的触发执行脚本(Python/Go/Node.js均可)一起打包为Lambda部署包,打包前必须给Terraform二进制文件授予可执行权限,且打包时保留文件权限属性,避免Lambda运行时出现权限不足报错。 - 配置Lambda基础配置与权限
- 资源配置:内存最低配1GB,超时时间根据你的资源部署规模设置,最大可设为Lambda支持的15分钟上限;如果部署时长超过15分钟,可拆分Terraform模块为小单元,配合Step Functions做串行分批次部署。
- IAM权限:至少包含三类权限,一是你要部署的所有AWS资源的操作权限;二是Terraform源码存储桶、状态文件存储桶的读写权限;三是状态锁用的DynamoDB表的读写权限。
- 编写Lambda核心执行逻辑
函数触发后按以下流程执行:- 将S3中存储的Terraform源码压缩包下载到Lambda本地临时目录
/tmp,完成解压 - 切换到源码目录,执行
terraform init,提前在Terraform代码中配置S3作为状态后端,开启版本控制、服务端加密,搭配DynamoDB做状态锁,避免多实例并发部署导致状态冲突 - 执行
terraform plan -out=tfplan,可根据需求传入自定义变量、指定资源等参数 - 如需人工审批,可将plan结果推送到SNS/内部通知渠道,等待审批回调后再执行后续步骤,无需审批可直接跳过该步
- 执行
terraform apply tfplan完成部署,执行日志默认会同步到CloudWatch Logs,也可自行将部署结果持久化存储到S3留痕
- 将S3中存储的Terraform源码压缩包下载到Lambda本地临时目录
- 配置触发规则
可根据使用场景选择触发方式:比如S3对象创建触发,每次上传新的Terraform源码包自动启动部署;或者通过API Gateway触发,实现手动触发部署;也可对接代码仓库的Webhook,代码提交后自动触发部署流程。
优化建议
- 可以将Terraform常用Provider插件提前打包到Lambda部署包,或者缓存到专属S3目录,避免每次
terraform init都重新下载插件,缩短部署耗时,也规避网络波动导致的初始化失败 - 敏感变量(访问密钥、数据库密码等)不要明文写在Terraform代码中,推荐存储到AWS Secrets Manager或Systems Manager Parameter Store,Lambda执行时动态拉取作为变量传入Terraform
- 建立版本归档机制,每次部署的源码包、plan结果、执行日志都归档到独立的S3目录,方便故障时回溯回滚
内容的提问来源于stack exchange,提问作者Thanatos-Delta
相关产品推荐
相关产品推荐

