juanjoDiaz / serverless-plugin-warmup

Keep your lambdas warm during winter. ♨
MIT License
1.11k stars 115 forks source link

v8.2.1 requires custom config when used with serverless-esbuild #349

Closed r-token closed 10 months ago

r-token commented 10 months ago

After upgrading from v8.1.0 and attempting a deploy, I get an error saying the following:

Error: Compilation failed for function alias warmUpPluginDefault. Please ensure you have an index file with ext .ts or .js, or have a path listed as main key in package.json

Version 8.1.0 compiles and deploys successfully, but 8.2.1 and 8.3.0 both return this error and fail to deploy.

I need to use one of these newer versions as AWS is end-of-lifeing Node 16 in June.

juanjoDiaz commented 10 months ago

Hi @r-token ,

I need more details about your setup. Specifically, about other plugins that you are using.

The issue that you are getting is because you are using a plugin to compile to your code (I assume that from Typescript) and it's trying to compile the warmup lambda.

The order in which you declare the plugins matters. Have you tried declaring the warmup plugin after the compilation plugin?

r-token commented 10 months ago

Hey @juanjoDiaz, great info - I'm sure you are correct. I am using serverless-esbuild, though declaring the warmup plugin after esbuild did not resolve the issue.

serverless-esbuild allows you to exclude files from its build step. Where is that warmUpPluginDefault declared? Hopefully I can just exclude that file and that will resolve it.

r-token commented 10 months ago

@juanjoDiaz I was able to resolve this with the following steps:

  1. Add a custom esbuild config file that supports mjs file extensions. By default only js and ts are supported.

That fixed the initial error and it could compile that file properly, but I was then getting an error saying .warmup/default/index.mjs:4:44: ERROR: Could not resolve "@aws-sdk/client-lambda".

So step two was:

  1. Install @aws-sdk/client-lambda as a dev dependency.

I was then able to deploy successfully with v8.3.0.

Thank you for the help here! If this is an acceptable resolution then I think we can consider this issue closed.

ElChapitan commented 8 months ago

Hey @r-token , just ran into this problem myself. Any chance you can share some of the config setup you needed to make in order to get it to run?

ElChapitan commented 8 months ago

For those coming to this later and needing some more info:

I added an esbuild.config.js with this:

module.exports = () => ({
  external: [],
  resolveExtensions: ['.ts','.js','.mjs']
});

And modified my serverless.yaml like this:

custom:
  esbuild:
    config: './esbuild.config.js'
Willis0826 commented 7 months ago

Thanks, @ElChapitan and @r-token. Setting the resolveExtensions did solve the problem. I'm using Serverless TypeScript with the following setup.

import type { AWS } from '@serverless/typescript';
const serverlessConfiguration: AWS = {
  custom: {
    esbuild: {
      bundle: true,
      minify: true,
      sourcemap: false,
      exclude: ['aws-sdk'],
      resolveExtensions: ['.ts', '.js', '.mjs'],
      target: 'node20',
      platform: 'node',
      concurrency: 10,
    }
  }
}
ElChapitan commented 5 months ago

As a follow up for those coming after, that worked for me as well.