能否用Terraform为AWS ECS与Lambda应用搭建CI/CD流水线?
使用Terraform + Jenkins 搭建AWS ECS与Lambda的CI/CD流程
当然可以用Terraform搭配Jenkins实现Git推送触发的CI/CD流水线,不用CodePipeline也能搞定ECS和Lambda的部署,下面是实际搭过的架构和具体步骤:
一、核心逻辑
- 用Git仓库(GitHub、GitLab都行)存代码,代码一推送就触发Jenkins流水线
- Jenkins负责拉代码、跑Terraform的初始化/计划/应用,同时搞定ECS镜像构建推送、Lambda代码打包这些前置活
- Terraform专门管定义和部署ECS集群服务、Lambda函数以及配套的AWS资源(比如IAM角色、API网关)
二、具体步骤
1. 配置Jenkins的Git触发
- 在Jenkins项目里填好Git仓库地址,开Webhook触发:去Git仓库的Webhook设置里加Jenkins的触发URL,指定哪些分支推送时触发(比如main、dev分支)
- 确保Jenkins服务器能访问Git仓库,私有仓库的话配好SSH密钥或者访问令牌
2. 流水线里的Terraform操作
- 初始化:Jenkins阶段里跑
terraform init,AWS凭证存在Jenkins的凭证管理里,直接注入环境变量就行 - 生成变更计划:执行
terraform plan -out=tfplan生成计划文件,要是怕出问题,可以加个人工审核步骤确认后再继续 - 应用变更:跑
terraform apply tfplan,直接完成ECS服务更新、Lambda部署
3. ECS部署的细节处理
- 要是ECS用镜像部署,得先在Jenkins里构建Docker镜像,推到ECR仓库,然后Terraform里引用新的镜像标签(用Git commit hash当标签最稳妥,确保版本唯一)
- Terraform的ECS服务配置里加
force_new_deployment = true,保证每次换镜像都会触发滚动部署
4. Lambda部署的细节处理
- Lambda代码要是本地文件,Jenkins里打包成zip上传到S3,Terraform里的lambda资源直接引用S3路径和版本;简单场景也可以直接用Terraform的
archive_file数据源打包 - 一定要把Lambda的
source_code_hash配置对,代码一变就自动触发函数更新
三、踩过的坑和注意事项
- 状态文件管理:Terraform状态文件别存在本地,存S3开版本控制加DynamoDB锁,多人操作也不会冲突,Jenkins里配置
backend "s3"就行 - 权限要够:Jenkins用的AWS角色得有足够权限,比如ECR镜像推送、ECS服务更新、Lambda部署、S3读写、DynamoDB锁操作这些权限都得给
- 环境隔离:用Terraform工作区或者不同变量文件区分dev、test、prod环境,Jenkins流水线根据分支自动选对应环境的变量
- 日志和回滚:Jenkins里留好Terraform的操作日志,要是部署崩了,直接跑
terraform destroy或者用之前的状态文件回滚,也能靠Terraform的版本历史恢复
内容的提问来源于stack exchange,提问作者Jigisha Araniya
相关产品推荐
相关产品推荐

