Add Cloud Resources to Fastify Apps
In this guide we'll be scaffolding a new Fastify application and including the Nitric framework to allow for the addition of other cloud resources like topics, queues and buckets.
Prerequisites
To complete this guide you'll need the following:
- Node.js installed locally
- Nitric CLI installed
- (optional) Your choice of an AWS, GCP or Azure account
Getting Started
Let's start by setting up a Nitric project and adding Fastify:
nitric new fastify-example js-starter
Then install dependencies and add fastify:
cd fastify-exampleyarn installyarn add fastify
You can go ahead and open this new project in your editor of choice. You should see a project structure similar to:
├── services│ ├── api.js├── node_modules│ ├── ...├── .gitignore├── nitric.yaml├── node.dockerfile├── node.dockerfile.dockerignore├── package.json├── README.md└── yarn.lock
In this structure you'll notice the services
folder. By default, this is where Nitric expects the entrypoint code for your application. However, that's just a convention, we can change that to anything else that suits our needs.
Now, let's add some Fastify code to get things started.
import Fastify from 'fastify'import { http } from '@nitric/sdk'const fastify = Fastify({logger: true,})fastify.get('/', (request, reply) => {reply.send('Hello World!')})async function bootstrap(port: number) {const address = await fastify.listen({ port })console.log(`Server listening on ${address}`)return fastify.server}http(bootstrap)
The http
function is a Nitric helper that allows you to bootstrap your
Fastify application with Nitric. Here we're passing the port number as an
argument to the fastify.listen
function and returning the server instance.
At this point we're ready to start testing locally.
nitric start
Your Fastify application will now be running with Nitric acting as a proxy. We can test this in another terminal or web browser.
curl http://localhost:4001Hello World!
Enhancing Fastify with Nitric
With everything working so far, now is a good time to see how we can add new resources to the Fastify app using Nitric. In this example, let's add a pub/sub topic which allows us to perform work in the background, but still respond quickly via the HTTP API.
You can update the api.js
file like so:
import Fastify from 'fastify'import { http, topic } from '@nitric/sdk'const workRequests = topic('work-requests').allow('publish')const fastify = Fastify({logger: true,})fastify.get('/', async (request, reply) => {await workRequests.publish()reply.send('Hello World!')})async function bootstrap(port: number) {const address = await fastify.listen({ port })console.log(`Server listening on ${address}`)return fastify.server}http(bootstrap)
We'll also add a new function to do the background work:
touch services/worker.js
Add this code to that file:
import { topic } from '@nitric/sdk'const sleep = (ms) => new Promise((res) => setTimeout(res, ms))topic('work-requests').subscribe(async (ctx) => {console.log('Starting new request')// wait for 2 seconds to simulate a long running taskawait sleep(2000)console.log('Request processed')})
Now, when you browse to localhost:4001
you'll notice that the console outputs these lines with a 2 second delay between each line:
Starting new requestRequest processed
You should notice that while the background worker takes 2 seconds to finish,
the HTTP request GET: /
still returns instantly.
At this point, we can stop the running application and try to deploy it to a cloud provider.
Deploy to the cloud
This is where the true value of Nitric shines. You don't need to perform any manual cloud deployment activities or add solutions like Terraform to get this project into your cloud environment, Nitric takes care of that for you.
To perform the deployment we'll create a stack
, stacks give Nitric the configuration needed for a specific cloud instance of this project, such as the provider and region.
The stack new
command below will create a stack named dev
that uses the aws
provider.
nitric stack new dev aws
Edit the stack file nitric.dev.yaml
and set your preferred AWS region, for example us-east-1
.
# The nitric provider to useprovider: nitric/aws@latest# The target AWS region to deploy to# See available regions:# https://docs.aws.amazon.com/general/latest/gr/lambda-service.htmlregion: us-east-2
You are responsible for staying within the limits of the free tier or any costs associated with deployment.
Let's try deploying the stack with the up
command:
nitric up
When the deployment is complete, go to the relevant cloud console and you'll be able to see and interact with your application.
To tear down your application from the cloud, use the down
command:
nitric down