> For the complete documentation index, see [llms.txt](https://tutorial.specian.co.uk/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tutorial.specian.co.uk/devops/aws/serverless.md).

# Serverless

We are going to deploy the API using the [Serverless Framework](https://serverless.com). The [documentation](https://serverless.com/framework/docs/) is excellent and covers everything we need. If you are not familiar with Serverless, try the [hello work](https://serverless.com/framework/docs/providers/aws/examples/hello-world/node/) example and the [user guide](https://serverless.com/framework/docs/providers/aws/guide/quick-start/).

In our setup, we will use 3 serverless plugins:

* [Typescript](https://github.com/prisma-labs/serverless-plugin-typescript) to transpile our code Javascript.
* [Offline](https://github.com/dherault/serverless-offline) to run the app locally. (Note: add `.build` to `.gitignore`)
* [SSM](https://github.com/janders223/serverless-offline-ssm#readme) to read variables from our `.env`
* [Finch](https://github.com/fernando-mc/serverless-finch) to deploy the static files to S3.

### Using Express with Serverless

We also need to change our `index.ts` file to use [aws-serverless-express](https://github.com/awslabs/aws-serverless-express).

```typescript
exports.handler = (event: any, context: any) => {
  bootstrap().then(() => {
    const { app } = createApp();
    const server = awsServerlessExpress.createServer(app);
    awsServerlessExpress.proxy(server, event, context);
  });
}
```

### Common problems

`Error: Cannot find module './migrations'`

Add `import './migration.ts'` to `src/inddex.ts` and create `` `migrations/index.ts` ``importing all migration files.

`handler 'server' returned a promise and also uses a callback!`

You can't use `async` with the main Serverless file. Use `.then` for the promises instead.
