我正试图通过运行CloudFormation堆栈模板的CodePipeline/CodeBuildbuildspec.yml
在AWS Lambda上部署Nuxt3应用程序。以下是template/staging.yml
的一部分,用于设置AWS Lambda
FrontendLambdaFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ../.output
Handler: server/index.handler
我使用NITRO_PRESET=aws-lambda npm run build
创建了与AWS Lambda兼容的构建,该构建导出了server/index.mjs
文件中的主处理程序。
当构建成功时,当我试图打开连接到Lambda的API网关端点时,我看到没有任何CSS的HTML内容,并看到类似的错误
https://my-api-endpoint-url.amazonaws.com/_nuxt/entry-5a589e33.mjs net::ERR_ABORTED 403
上面写着禁止,但不确定我应该更改什么才能访问它。显然,.output/public
文件夹下的所有文件都发生了这种情况。
当我在本地执行NITRO_PRESET=node-server npm run build
,然后运行npx nuxt preview
时,它在http://localhost
上的加载完全可以使用适当的CSS。
我能够根据GitHub的评论修复它:https://github.com/nuxt/framework/issues/3586#issuecomment-1095695526
如上所述,aws-lambda
硝基预设不支持提供静态文件。这可能是设计的,因为AWS API网关默认情况下不支持提供二进制文件。
我选择了(第二个(选项,通过将.output/public
目录中的文件放在S3存储桶中并将该存储桶公开来分别提供这些文件。
buildspec.yml中的一个简单的aws s3 sync
命令可以在每次有新的构建时将新编译的资产推送到S3存储桶。
工作完成后,我切换到CloudFront分发版来为这些静态资产提供服务,并阻止了S3 bucket上的公共访问。