Бессистемная лямбда-функция работает при превышении времени ожидания при запуске Nuxt - PullRequest
0 голосов
/ 13 марта 2020

Мне только что удалось развернуть приложение 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, но эти тайм-ауты не вызваны холодным стартом.

Я очень ценю вашу помощь!

1 Ответ

0 голосов
/ 17 марта 2020

В настоящее время я решил эту проблему, увеличив предел памяти сначала с 512 МБ до 1024 МБ, а затем на втором шаге с 1024 МБ до 2048 МБ.

См. Диаграмму CloudFront здесь (синяя линия)

Я полагаю, что мое приложение слишком большое с большим количеством зависимостей и модулей, которые необходимо загрузить при запуске Lambda. Тем не менее, я все еще не уверен, что утечка памяти или что-то еще вызывает проблему, а увеличение лимита памяти просто скрывает проблему. Но если у кого-то есть такая же проблема, увеличение памяти, по-видимому, является хорошим временным решением, по крайней мере, чтобы ваше приложение было доступно.

...