如何阻止Angular Universal自动创建Lambda并通过Terraform部署Angular应用到AWS Lambda
如何用Terraform替代CloudFormation部署Angular Universal到AWS Lambda
一、阻止Angular Universal自动创建CloudFormation资源
完全可以跳过Angular Universal的自动部署流程,只保留构建环节即可。默认的Angular Universal部署命令(如npm run deploy)会触发CloudFormation,你只需执行构建命令生成部署产物,不执行部署步骤:
- 构建前端静态资源:
ng build --prod - 构建Server-Side Rendering(SSR)服务端代码:
ng run <你的项目名>:server:production
执行完成后,项目根目录会生成dist文件夹,包含browser(前端静态文件)和server(服务端SSR代码)两个子目录。
二、用Terraform创建Lambda资源并手动部署Angular应用
步骤1:编写Terraform配置创建Lambda
创建main.tf文件,示例配置如下:
# 配置AWS Provider provider "aws" { region = "us-east-1" # 替换为你的AWS区域 } # 创建Lambda执行角色 resource "aws_iam_role" "lambda_exec_role" { name = "angular-universal-lambda-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Sid = "" Principal = { Service = "lambda.amazonaws.com" } } ] }) } # 为角色添加基础Lambda执行权限 resource "aws_iam_role_policy_attachment" "lambda_basic_execution" { role = aws_iam_role.lambda_exec_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" } # 创建Lambda函数 resource "aws_lambda_function" "angular_universal" { filename = "angular-lambda-deploy.zip" # 你的部署包文件名 function_name = "angular-universal-ssr" role = aws_iam_role.lambda_exec_role.arn handler = "server/main.handler" # SSR服务端代码入口,对应dist/server/main.js runtime = "nodejs18.x" # 替换为与本地项目匹配的Node.js版本 # 若部署包体积较大,可上传至S3后引用 # s3_bucket = "your-deployment-bucket" # s3_key = "angular-lambda-deploy.zip" environment { variables = { NODE_ENV = "production" } } }
步骤2:打包Angular Universal部署包
进入dist目录,将静态资源和服务端代码打包为zip:
cd dist zip -r ../angular-lambda-deploy.zip browser server
注:若项目依赖额外Node.js包,可将
node_modules一并打包,或使用Lambda层管理依赖以减小包体积。
步骤3:部署Terraform资源并上传部署包
- 初始化Terraform:
terraform init - 预览执行计划:
terraform plan - 应用配置创建Lambda:
terraform apply - 手动更新Lambda代码(若Terraform配置未指定
filename):aws lambda update-function-code --function-name angular-universal-ssr --zip-file fileb://angular-lambda-deploy.zip
额外说明
- 静态资源优化:若
browser目录体积较大,建议将其上传至S3并配置CloudFront分发,Lambda仅负责SSR渲染,可提升性能并降低成本。 - 版本兼容性:确保Lambda的Node.js runtime版本与本地开发环境一致,避免兼容性问题。
- 功能验证:部署完成后,可通过Lambda控制台的测试功能发送模拟API请求,验证SSR渲染是否正常。
内容的提问来源于stack exchange,提问作者Biju
相关产品推荐
相关产品推荐

