
Security News
Deno 2.2 Improves Dependency Management and Expands Node.js Compatibility
Deno 2.2 enhances Node.js compatibility, improves dependency management, adds OpenTelemetry support, and expands linting and task automation for developers.
serverless-next.js
Advanced tools
A zero configuration Nextjs 9.0 serverless component with full feature parity.
Since Nextjs 8.0, serverless mode was introduced which provides a new low level API which projects like this can use to deploy onto different cloud providers. This project is a better version of the serverless plugin which focuses on addressing core issues like next 9 support, better development experience, the 200 CloudFormation resource limit and performance.
There is no configuration needed. You can extend defaults based on your application needs.
Users of this component should be able to use nextjs development tooling, aka next dev
. It is the component's job to deploy your application ensuring parity with all of next's features we know and love.
With a simplified architecture and no use of CloudFormation, there are no limits to how many pages you can have in your application, plus deployment times are very fast! with the exception of CloudFront propagation times of course.
/_next/*
served from CloudFront.Install the next.js component:
npm install serverless-next.js --save-dev
Add your next application to the serverless.yml:
# serverless.yml
myNextApplication:
component: serverless-next.js
Set your aws credentials in a .env
file:
AWS_ACCESS_KEY_ID=accesskey
AWS_SECRET_ACCESS_KEY=sshhh
Set next.js build target to serverless
:
// next.config.js
module.exports = {
target: "serverless"
};
And simply deploy:
$ serverless
In most cases you wouldn't want to use CloudFront's distribution domain to access your application. Instead, you can specify a custom domain name.
Make sure you've purchased your domain
within Route53:
# serverless.yml
myNextApplication:
component: serverless-next.js
inputs:
domain: "example.com" # sub-domain defaults to www
You can also configure a subdomain
:
# serverless.yml
myNextApplication:
component: serverless-next.js
inputs:
domain: ["sub", "example.com"] # [ sub-domain, domain ]
By default the Lambda@Edge functions run using AWSLambdaBasicExecutionRole which only allows uploading logs to CloudWatch. If you need permissions beyond this, like for example access to DynamoDB or any other AWS resource you will need your own custom policy arn:
# serverless.yml
myNextApplication:
component: serverless-next.js
inputs:
policy: "arn:aws:iam::123456789012:policy/MyCustomPolicy"
Make sure you add CloudWatch log permissions to your custom policy.
Both default and api edge lambdas will be assigned 512mb of memory by default. This value can be altered by assigning a number to the memory
input
# serverless.yml
myNextApplication:
component: serverless-next.js
inputs:
memory: 1024
Values for default and api lambdas can be separately defined by assigning memory
to an object like so:
# serverless.yml
myNextApplication:
component: serverless-next.js
inputs:
memory:
defaultLambda: 1024
apiLambda: 2048
Similarly, the timeout by default is 10 seconds. To customise you can:
# serverless.yml
myNextApplication:
component: serverless-next.js
inputs:
timeout:
defaultLambda: 20
apiLambda: 15
Note the maximum timeout allowed for Lambda@Edge is 30 seconds. See https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-requirements-limits.html
Four Cache Behaviours are created in CloudFront.
The first two _next/*
and static/*
forward the requests to S3.
The third is associated to a lambda function which is responsible for handling three types of requests.
Server side rendered page. Any page that defines getInitialProps
method will be rendered at this level and the response is returned immediately to the user.
Statically optimised page. Requests to pages that were pre-compiled by next to HTML are forwarded to S3.
Public resources. Requests to root level resources like /robots.txt
, /favicon.ico
, /manifest.json
, etc. These are forwarded to S3.
The reason why 2. and 3. have to go through Lambda@Edge first is because the routes don't conform to a pattern like _next/*
or static/*
. Also, one cache behaviour per route is a bad idea because CloudFront only allows 25 per distribution.
The fourth cache behaviour handles next API requests api/*
.
Name | Type | Default Value | Description |
---|---|---|---|
domain | Array | null | For example ['admin', 'portal.com'] |
bucketName | string | null | Custom bucket name where static assets are stored. By default is autogenerated. |
nextConfigDir | string | ./ | Directory where your application next.config.js file is. This input is useful when the serverless.yml is not in the same directory as the next app. Note: nextConfigDir should be set if next.config.js distDir is used |
nextStaticDir | string | ./ | If your static or public directory is not a direct child of nextConfigDir this is needed |
memory | number|object | 512 | When assigned a number, both the default and api lambdas will assigned memory of that value. When assigned to an object, values for the default and api lambdas can be separately defined |
timeout | number|object | 10 | Same as above |
build | boolean|object | true | When true builds and deploys app, when false assume the app has been built and uses the .next .serverless_nextjs directories in nextConfigDir to deploy. If an object is passed build allows for overriding what script gets called and with what arguments. |
build.cmd | string | node_modules/.bin/next | Build command |
build.args | Array|string | ['build'] | Arguments to pass to the build |
build.cwd | string | ./ | Override the current working directory |
build.enabled | boolean | true | Same as passing build:false but from within the config |
build.env | object | {} | Add additional environment variables to the script |
Custom inputs can be configured like this:
myNextApp:
component: serverless-next.js
inputs:
bucketName: my-bucket
Make sure your serverless.yml
uses the serverless-components
format. serverless components differ from the original serverless framework, even though they are both accessible via the same CLI.
✅ Do
# serverless.yml
myNextApp:
component: serverless-next.js
myTable:
component: serverless/aws-dynamodb
inputs:
name: Customers
# other components
❌ Don't
# serverless.yml
provider:
name: aws
runtime: nodejs10.x
region: eu-west-1
myNextApp:
component: serverless-next.js
Resources: ...
Note how the correct yaml doesn't declare a provider
, Resources
, etc.
For deploying, don't run serverless deploy
. Simply run serverless
and that deploys your components declared in the serverless.yml
file.
For more information about serverless components go here.
Users are encouraged to use this component instead of the serverless-nextjs-plugin
. This component was built and designed using lessons learned from the serverless plugin.
See examples/dynamodb-crud
for an example Todo application that interacts with DynamoDB.
You need to commit your application state in source control. That is the files under the .serverless
directory.
The serverless team is currently working on remote state storage so this won't be necessary in the future.
us-east-1
. How can I deploy it to another region?Serverless next.js is regionless. By design, serverless-next.js
applications will be deployed across the globe to every CloudFront edge location. The lambda might look like is only deployed to us-east-1
but behind the scenes, it is replicated to every other region.
See the sample below for an advanced build
setup that includes passing additional arguments and environment variables to the build.
# serverless.yml
myDatabase:
component: MY_DATABASE_COMPNENT
myNextApp:
component: serverless-next.js
build:
args: ["build", "custom/path/to/pages"]
env:
DATABASE_URL: ${myDatabase.databaseUrl}
Please see the contributing guide.
This project exists thanks to all the people who contribute. [Contribute].
Become a financial contributor and help us sustain our community. [Contribute]
Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]
FAQs
Serverless nextjs powered by Serverless Components
We found that serverless-next.js demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Deno 2.2 enhances Node.js compatibility, improves dependency management, adds OpenTelemetry support, and expands linting and task automation for developers.
Security News
React's CRA deprecation announcement sparked community criticism over framework recommendations, leading to quick updates acknowledging build tools like Vite as valid alternatives.
Security News
Ransomware payment rates hit an all-time low in 2024 as law enforcement crackdowns, stronger defenses, and shifting policies make attacks riskier and less profitable.