Serverless Cloudflare

As a developer constantly on the lookout for ways to streamline application deployment and management, I’ve found the marriage between the Serverless framework and Cloudflare’s capabilities to be a match made in the cloud. Below, I walk through the process of deploying a serverless function on Cloudflare with tangible code examples, demonstrating how this powerful duo can make your development process more efficient.

The Challenge: Overcoming Infrastructure Overhead

Running web applications traditionally means dealing with servers - a lot of them. It’s a demanding job that often requires dedicated DevOps teams, ensuring they’re up and scaling as needed. The overhead is not just in terms of cost but also in terms of time - time that could be better spent on development.

Enter Cloudflare Workers: A Paradigm Shift

Cloudflare’s serverless platform, Cloudflare Workers, offers a way out. By deploying code directly on their global network, developers can run their applications closer to their users without worrying about the underlying infrastructure.
This architecture is not suitable for all cases, but for microservices-type usage, it could be a great solution.

Crafting the Serverless Experience

Adopting the Serverless framework allows for the seamless deployment of cloud functions. Below is a step-by-step guide with code snippets to get you started with Cloudflare Workers.

Step 1: Setup with serverless.yml

First, ensure you have the Serverless framework installed, then set up your serverless.yml configuration file. Here’s a basic configuration for deploying a JavaScript function:

service: cloudflare-workers-example

provider:
  name: cloudflare
  config:
    accountId: yourAccountId
    zoneId: yourZoneId

plugins:
  - serverless-cloudflare-workers

functions:
  myFunction:
    name: my-worker
    script: index
    events:
      - http:
          url: example.com/my-worker
          method: GET

Step 2: Write Your Worker

Create an index.js file with your function’s logic. Here’s a simple worker that returns a JSON response:

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  return new Response(JSON.stringify({ message: "Hello World!" }), {
    headers: { 'content-type': 'application/json' },
  })
}

Step 3: Deploy with Serverless

Run the serverless deploy command in your terminal. This command pushes your function to Cloudflare’s edge network.

$ serverless deploy

Step 4: Verify Deployment

Once deployed, you can check the response from the provided URL. If all goes well, you’ll receive the “Hello World!” JSON message.

Benefits Realized

After deploying my functions, here’s what I observed:

  • Streamlined Process: Deploying functions was as simple as configuring serverless.yml and running a deploy command.
  • Scalability: Cloudflare automatically scaled my function across its network based on demand.
  • Cost Savings: Cloudflare has a free tier of 100K requests per day (up to 10ms cpu time per call). Beyond those limits the cost is very minimal: For a subscription of $5 / month users get 10M requests (+$0.3 for each additional Million) + 30M CPU milliseconds (+$0.02 for each additional Million) per month.

Practical Example: A Serverless API Endpoint

I applied this setup in creating a serverless API endpoint for an e-commerce platform. Below is the serverless.yml for the API:

service: ecommerce-api

provider:
  name: cloudflare
  config:
    accountId: yourAccountId
    zoneId: yourZoneId

plugins:
  - serverless-cloudflare-workers

functions:
  getProduct:
    name: get-product
    script: product
    events:
      - http:
          url: yourdomain.com/api/product
          method: GET

The product.js script fetches product details and can handle high traffic with zero downtime.

Conclusion

My exploration into deploying serverless functions with Cloudflare has not only been successful but also eye-opening.
It has simplified my deployment process, ensured global scalability, and optimized costs. Serverless and Cloudflare together give another potential provider as an alternative to my usual AWS Lambda setup. In addition, the substantial traffic savings due to Cloudflare’s free egress pricing is especially significant for working with large files.