Мне только что удалось развернуть приложение Nuxt через Serverless на AWS. В основном все работает, как ожидалось, но в некоторых случаях функция Lambda просто работает в тайм-аут и не может обслуживать мое приложение Nuxt. Поскольку мое приложение представляет собой SPA, тайм-аут происходит только при обновлении sh окна браузера или при посещении моей страницы в новой вкладке, но только иногда. Я уже увеличил время ожидания лямбды до 30 с (соответствует времени ожидания шлюза API), которого должно быть достаточно, но время ожидания все еще происходит.
Вот мой serverless.yml
:
service:
name: test-app
plugins:
- serverless-nuxt-plugin
- serverless-dotenv-plugin
- serverless-domain-manager
resources:
Resources:
AssetsBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: ${self:custom.nuxt.bucketName}
CorsConfiguration:
CorsRules:
- AllowedMethods:
- GET
- HEAD
AllowedOrigins:
- "*"
provider:
name: aws
region: eu-central-1 # this field is used for the assets files s3 path.
stage: ${env:APP_ENV}
runtime: nodejs12.x
environment:
NODE_ENV: ${env:APP_ENV}
tags: # Optional service wide function tags
usecase: test-app
environment: ${self:provider.stage}
domain: ${env:DEPLOY_DOMAIN}
custom:
nuxt:
version: app-${self:provider.stage}-v1
bucketName: test-app-static-${self:provider.stage}
cdnPath: https://cdn.XXX.com
customDomain:
domainName: ${env:DEPLOY_DOMAIN}
certificateName: ${'*.'}${env:DEPLOY_DOMAIN}
createRoute53Record: true
endpointType: 'regional'
functions:
nuxt:
handler: lambda-handler.render
memorySize: 512 # in MB with steps of 64
timeout: 30 # in seconds
events:
- http: ANY /
- http: ANY /{proxy+}
И мой Лямбда-обработчик:
const awsServerlessExpress = require('aws-serverless-express');
const express = require('express');
const { Nuxt } = require('nuxt-start'); // eslint-disable-line
const nuxtConfig = require("./nuxt.config.js");
const app = express();
const nuxt = new Nuxt({
...nuxtConfig,
dev: false,
_start: true,
});
app.use(async (req, res) => {
if (nuxt.ready) {
await nuxt.ready()
}
nuxt.render(req, res)
});
const server = awsServerlessExpress.createServer(app, void 0, [
'application/javascript',
'application/json',
'application/manifest+json',
'application/octet-stream',
'application/xml',
'font/eot',
'font/opentype',
'font/otf',
'image/gif',
'image/jpeg',
'image/png',
'image/svg+xml',
'image/x-icon', // for favicon
'text/comma-separated-values',
'text/css',
'text/html',
'text/javascript',
'text/plain',
'text/text',
'text/xml',
'application/rss+xml',
'application/atom+xml',
]);
module.exports.render = (event, context) => {
awsServerlessExpress.proxy(server, event, context);
};
Кроме того, я установил дистрибутив CloudFront перед моим API-шлюзом, чтобы перенаправлять http traffi c на https. Так что на самом деле ничего особенного, я думаю.
Вот пример моих журналов CloudWatch, которые показывают примерное время ожидания :
Таким образом, длительность лямбды довольно распределена, и я не могу понять почему. Я даже нашел продолжительность 100 мс, но они могут вставать до истечения 30 с. Что-то не так в моей настройке или я что-то пропустил? Я знаю о «узком месте» холодного старта для Lambdas, но эти тайм-ауты не вызваны холодным стартом.
Я очень ценю вашу помощь!