You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 17独立应用部署至AWS Serverless失败求助

问题概述

创建了Angular 17独立应用(含两个带路由的组件),安装了以下依赖:

npm i -S aws-serverless-express
npm i -D serverless serverless-api-compression serverless-apigw-binary serverless-associate-waf serverless-offline

使用指定的serverless.yml和lambda.js部署至AWS Lambda时,返回{"message": "Internal server error"},控制台同时出现403、502资源加载错误。

排查与解决方案

1. 修复Serverless打包配置逻辑错误

原package.patterns中,!node_modules/**会先排除所有node_modules目录,后续的依赖包含规则因优先级问题无法生效,导致Lambda缺少必要运行依赖。调整规则顺序,先包含所需生产依赖,再排除剩余内容:

package:
  excludeDevDependencies: true
  patterns:
    # 先保留运行必需的生产依赖
    - "node_modules/aws-serverless-express/**"
    - "node_modules/binary-case/**"
    - "node_modules/type-is/**"
    - "node_modules/media-typer/**"
    - "node_modules/mime-types/**"
    - "node_modules/mime-db/**"
    # 再排除不需要的文件
    - "!node_modules/**"
    - "!**/*.ts"
    - "!**/*.html"
    - "!**/*.json"
    - "!**/*.scss"
    - "dist/**"
    - "!src/**"
    - "!e2e/**"
    - "!angular.json"
    - "!package.json"
    - "!tsconfig.json"
    - "!tsconfig.app.json"
    - "!tsconfig.spec.json"
    - "!tslint.json"
    - "!README.md"
    - "!firebug-lite/**"
    - "!coverage/**"
    - "!.angular/**"
    - "!.vscode/**"

2. 修复Lambda异步初始化导致的冷启动错误

原lambda.js中,异步加载Angular服务端产物的逻辑会导致第一次冷启动时,handler被调用但服务器未初始化完成,直接返回空导致502错误。改用顶层await确保初始化完成后再处理请求:

const awsServerlessExpress = require('aws-serverless-express');

const binaryMimeTypes = [
    'application/javascript',
    'application/json',
    'application/octet-stream',
    'application/xml',
    'font/eot',
    'font/opentype',
    'font/otf',
    'image/jpeg',
    'image/png',
    'image/svg+xml',
    'text/comma-separated-values',
    'text/css',
    'text/html',
    'text/javascript',
    'text/plain',
    'text/text',
    'text/xml'
];

// 顶层await确保冷启动时完成服务器初始化
const appModule = await import('./dist/seventeentest/server/server.mjs');
const server = awsServerlessExpress.createServer(appModule.default, null, binaryMimeTypes);

exports.universal = (event, context) => {
    console.log(`EVENT: ${JSON.stringify(event)}`);
    return awsServerlessExpress.proxy(server, event, context, 'PROMISE').promise;
};

注:Node.js 20.x原生支持顶层await,符合当前runtime配置。

3. 移除或正确配置WAF插件

serverless-associate-waf插件未指定WAF ARN时,会导致API Gateway关联无效的WAF规则,触发403错误:

  • 若无需WAF,直接移除插件:
plugins:
  - serverless-apigw-binary
  - serverless-api-compression
  - serverless-offline
  • 若需要WAF,添加自定义配置指定目标WAF的ARN:
custom:
  # 保留原有配置...
  associateWaf:
    wafArn: 'arn:aws:wafv2:ap-south-1:你的AWS账号ID:regional/webacl/你的WAF名称/你的WAFID'

4. 验证Angular构建产物路径

执行ng build --ssr构建后,检查dist/seventeentest/server/server.mjs是否存在,若路径不符,调整lambda.js中的import路径。

5. 确认API Gateway二进制支持

部署后通过AWS控制台检查API Gateway的「二进制媒体类型」设置,确保包含*/*或所需的具体MIME类型,避免静态资源加载异常。

测试流程
  1. 重新构建Angular应用:ng build --ssr
  2. 重新部署:serverless deploy
  3. 本地预验证:serverless offline start,确认本地可正常访问后再排查云端问题。

内容的提问来源于stack exchange,提问作者angela philstine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:55:36