<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kyle</title>
    <description>The latest articles on Forem by Kyle (@kylemit).</description>
    <link>https://forem.com/kylemit</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F154966%2F0eb474cd-eccf-4f15-8278-f6db7bd51480.jpeg</url>
      <title>Forem: Kyle</title>
      <link>https://forem.com/kylemit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kylemit"/>
    <language>en</language>
    <item>
      <title>Build your Backend with Netlify Functions in 20 Minutes</title>
      <dc:creator>Kyle</dc:creator>
      <pubDate>Tue, 08 Dec 2020 16:38:16 +0000</pubDate>
      <link>https://forem.com/thisdotmedia/build-your-backend-with-netlify-functions-in-20-minutes-2gc4</link>
      <guid>https://forem.com/thisdotmedia/build-your-backend-with-netlify-functions-in-20-minutes-2gc4</guid>
      <description>&lt;p&gt;Netlify makes deploying your front end quick and easy, and Netlify functions makes running a serverless backend just as easy.&lt;/p&gt;

&lt;p&gt;In this guide, we'll get setup on how to use Netlify functions.  As an indie developer, you should embrace serverless offerings because of their low barrier to entry and generous free tiers.  And as an enterprise shop, you should seriously consider them for an extremely cheap, fast, and scalable way to build out your backend infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases - What can you build?
&lt;/h2&gt;

&lt;p&gt;Modern JavaScript frameworks allow us to build large and complex applications on the client, but they can occasionally run into limitations.  For everything else, there's the "backend" which excels at handling some of these use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protecting Secrets &amp;amp; Credentials&lt;/li&gt;
&lt;li&gt;Server Side Rendering&lt;/li&gt;
&lt;li&gt;Sending Emails&lt;/li&gt;
&lt;li&gt;Handling File IO&lt;/li&gt;
&lt;li&gt;Running centralized logic&lt;/li&gt;
&lt;li&gt;Executing tasks off the main thread&lt;/li&gt;
&lt;li&gt;Bypassing CORS issues for locked down APIs&lt;/li&gt;
&lt;li&gt;Providing Progressive Enhancement / NoScript Fallback&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Composition of a Function
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.netlify.com/products/functions/" rel="noopener noreferrer"&gt;Netlify Functions&lt;/a&gt; provides a wrapper around &lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambdas&lt;/a&gt;.  While the Netlify documentation should be sufficient, it's good to know that there's an escape hatch if you ever want to run on your own AWS subscription.  However, Netlify handles some of the deployment magic for you, so let's start there.&lt;/p&gt;

&lt;p&gt;Here's the bare bones of a Netlify function in JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're familiar with running JavaScript on Node, this should look somewhat familiar.  Each function should live in its own file, and will execute whatever is assigned to &lt;code&gt;exports.handler&lt;/code&gt;. We have access to &lt;code&gt;event&lt;/code&gt; and &lt;code&gt;context&lt;/code&gt;.  We can run whatever code we need on Node, and return whatever response type we'd like.&lt;/p&gt;

&lt;p&gt;To set this up, lets create an empty repository on GitHub.  We need to add functions to a folder.  While we can use any name, a common pattern is to create a folder name &lt;code&gt;functions&lt;/code&gt;. Let's add a file in there called &lt;code&gt;hello.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//functions/hello.js&lt;/span&gt;
&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anonymous&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queryStringParameters&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our function, we can grab information from the query string parameters passed in.  We'll destructure those (&lt;a href="https://wesbos.com/destructuring-default-values" rel="noopener noreferrer"&gt;with a default value&lt;/a&gt;) and look for a &lt;code&gt;name&lt;/code&gt; param.&lt;/p&gt;

&lt;p&gt;To actually wire up our functions folder, we'll need to add a &lt;a href="https://docs.netlify.com/configure-builds/file-based-configuration/#functions" rel="noopener noreferrer"&gt;&lt;code&gt;netlify.toml&lt;/code&gt;&lt;/a&gt; config file at the root of our project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# netlify.toml
&lt;/span&gt;&lt;span class="nn"&gt;[build]&lt;/span&gt;
  &lt;span class="py"&gt;functions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"functions/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Walk Before You Run (Locally)
&lt;/h2&gt;

&lt;p&gt;Our "repo" should look like this at this point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;my-app
├── functions
│   └── hello.js
└── netlify.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The best way to run your Netlify site locally, with all the bells and whistles attached, is to use &lt;a href="https://www.netlify.com/products/dev/" rel="noopener noreferrer"&gt;Netlify Dev&lt;/a&gt; which you can install via npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;netlify-cli &lt;span class="nt"&gt;-g&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then kick off your dev server like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;netlify dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2F3TH4jBOh9rpMHtaMbggESp%2F015afef380a9d9e8bd7f6bf8468eb3ac%2Fnetlify-dev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2F3TH4jBOh9rpMHtaMbggESp%2F015afef380a9d9e8bd7f6bf8468eb3ac%2Fnetlify-dev.png" alt="Netlify Dev"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your "site" should now be live at &lt;code&gt;http://localhost:8888&lt;/code&gt;. By default, Netlify hosts functions under the subpath &lt;code&gt;/.netlify/functions/&amp;lt;fn-name&amp;gt;&lt;/code&gt; so you can invoke your function here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://localhost:8888/.netlify/functions/hello?name=Beth" rel="noopener noreferrer"&gt;http://localhost:8888/.netlify/functions/hello?name=Beth&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's make our function's address a little cleaner by also taking advantage of another free Netlify feature using &lt;a href="https://docs.netlify.com/configure-builds/file-based-configuration/#redirects" rel="noopener noreferrer"&gt;redirects&lt;/a&gt;.  This allows us to expose the same functions at a terser url by replacing &lt;code&gt;/.netlify/functions&lt;/code&gt; with &lt;code&gt;/api&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FROM&lt;/strong&gt;: &lt;code&gt;&amp;lt;site&amp;gt;/.netlify/functions/hello&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;TO&lt;/strong&gt;: &lt;code&gt;&amp;lt;site&amp;gt;/api/hello&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To do so, append the following info to your &lt;code&gt;netlify.toml&lt;/code&gt; config, and restart Netlify dev:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[[redirects]&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;
  &lt;span class="py"&gt;from&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'/api/*'&lt;/span&gt;
  &lt;span class="py"&gt;to&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'/.netlify/functions/:splat'&lt;/span&gt;
  &lt;span class="py"&gt;status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will route all traffic at &lt;code&gt;/api/*&lt;/code&gt; internally to the appropriate functions directory, and the wildcard will capture all additional path info, and move to &lt;code&gt;:splat&lt;/code&gt;.  By setting the &lt;a href="https://docs.netlify.com/routing/redirects/redirect-options/#http-status-codes" rel="noopener noreferrer"&gt;HTTP Status Code = &lt;code&gt;200&lt;/code&gt;&lt;/a&gt;, Netlify will preform a "rewrite" (as opposed to a "redirect") which will change the server response without changing the URL in the browser address bar.&lt;/p&gt;

&lt;p&gt;So let's try again with our new url:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://localhost:8888/api/hello?name=Beth" rel="noopener noreferrer"&gt;http://localhost:8888/api/hello?name=Beth&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2FLgezyZNZ9J2IJ6xqHLiUH%2F6636d093beff3dd4381c2f0f59ad64a6%2Fhello-world.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2FLgezyZNZ9J2IJ6xqHLiUH%2F6636d093beff3dd4381c2f0f59ad64a6%2Fhello-world.png" alt="hello world"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👏 Awesome, you just created a function! (you're following along live, right?)&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting the CRUD Out &amp;amp; Submitting Data
&lt;/h2&gt;

&lt;p&gt;Now that we can build functions, let's create our own API with some basic CRUD functions (Create, Read, Update, &amp;amp; Delete) for a simple todos app.&lt;/p&gt;

&lt;p&gt;One of the central tenants of serverless computing is that it's also stateless.  If you need to store any state across function invocations, it should be persisted to another, layer like a database.  For this article, let's use the free tier of DynamoDb, but feel free to BYODB (Bring Your Own DB), especially if it has a Node SDK.&lt;/p&gt;

&lt;p&gt;In the next steps, we'll:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup a table on DynamoDB in AWS&lt;/li&gt;
&lt;li&gt;Install npm packages into our project&lt;/li&gt;
&lt;li&gt;Setup secret keys in AWS, and add to our environment variables&lt;/li&gt;
&lt;li&gt;Initialize the aws-sdk package for NodeJs&lt;/li&gt;
&lt;li&gt;And then finally add a Netlify function route to create a record on our database&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  AWS - Amazon Web Services
&lt;/h3&gt;

&lt;p&gt;This guide will assume some degree of familiarity with AWS &amp;amp; DynamoDB, but if you're new to DynamoDB, you can start with this guide on &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.html" rel="noopener noreferrer"&gt;Getting Started with Node.js and DynamoDB&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On AWS, &lt;a href="https://console.aws.amazon.com/dynamodb/home?region=us-east-1#create-table" rel="noopener noreferrer"&gt;create a table&lt;/a&gt; with the name &lt;code&gt;NetlifyTodos&lt;/code&gt;, and string partition key called &lt;code&gt;key&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  NPM - Node Package Manager
&lt;/h3&gt;

&lt;p&gt;Now, let's setup npm and install &lt;a href="https://www.npmjs.com/package/aws-sdk" rel="noopener noreferrer"&gt;&lt;code&gt;aws-sdk&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://www.npmjs.com/package/nanoid" rel="noopener noreferrer"&gt;&lt;code&gt;nanoid&lt;/code&gt;&lt;/a&gt;, &amp;amp; &lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;&lt;code&gt;dotenv&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In a terminal at the root of your project, run the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;aws-sdk nanoid dotenv &lt;span class="nt"&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ENV - Environment Variables
&lt;/h3&gt;

&lt;p&gt;You'll  need to provision an &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-services-iam-create-creds.html" rel="noopener noreferrer"&gt;access key / secret for an IAM user&lt;/a&gt; that we'll use to authenticate our API calls.  One of the benefits of running these calls on the server is you're able to protect your application secret through environment variables, instead of having to ship them to the client, which is not recommended.&lt;/p&gt;

&lt;p&gt;There are quite a few ways to log into AWS on your local machine, but just to keep everything inside of our project, let's create a &lt;code&gt;.env&lt;/code&gt; file at the root of our project, and fill in the following keys with your own values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env
&lt;/span&gt;&lt;span class="py"&gt;MY_AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;***&lt;/span&gt;
&lt;span class="py"&gt;MY_AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;***&lt;/span&gt;
&lt;span class="py"&gt;MY_AWS_REGION&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;us-east-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: One little gotcha here is that the more common &lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt; is a reserved environment keyword used by the Netlify process.  So if we want to pass around env variables, we'll have to use our own key, in this case prefixed with &lt;code&gt;MY_&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once they're added to the process, we can destructure them and use in setting up our AWS SDK.  We'll need to setup AWS for every CRUD function, so let's assemble all this logic in a separate file called &lt;code&gt;dyno-client.js&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// dyno-client.js&lt;/span&gt;
&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MY_AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;MY_AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;MY_AWS_REGION&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following is required.&lt;/p&gt;

&lt;h3&gt;
  
  
  SDK - Software Developer Kit
&lt;/h3&gt;

&lt;p&gt;Using the aws-sdk makes our life a lot easier for connecting to DynamoDB from our codebase.  We can create an instance of the Dynamo client that we'll use for the remaining examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// dyno-client.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aws-sdk&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;accessKeyId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MY_AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;secretAccessKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MY_AWS_SECRET_ACCESS_KEY&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MY_AWS_REGION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dynamoDb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AWS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DynamoDB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DocumentClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make this available to all our functions, add the DynamoDB instance to your exports, and we'll grab it when we need it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;dynamoDb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TABLE_NAME&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Todo (Due by EOD 😂)
&lt;/h3&gt;

&lt;p&gt;⚡ We're finally ready to create our API function!&lt;/p&gt;

&lt;p&gt;In the following example, we'll post back form data containing the &lt;code&gt;text&lt;/code&gt; for our todo item.  We can parse the form data into JSON, and transform it into an item to insert into our table.  If it succeeds, we'll return the result with a status code of &lt;code&gt;200&lt;/code&gt;, and if it fails, we'll return the the error message along with the status code from the error itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// functions/create.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;nanoid&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nanoid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;dynamoDb&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../dyno-client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// parse form data&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// create item to insert&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;TableName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TABLE_NAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;nanoid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;createDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dynamoDb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// return success&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;}),&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should give you the gist of how to expose your API routes and logic to perform various operations.  I'll hold off on more examples because most of the code here is actually just specific to DynamoDB, and we'll save that for a separate article.  But the takeaway is that we're able to return something meaningful with very minimal plumbing.  And that's the whole point!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;With Functions, you &lt;em&gt;only&lt;/em&gt; have to write your own business logic!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Debugging - For Frictionless Feedback Loops
&lt;/h2&gt;

&lt;p&gt;There are two critical debugging tools in Visual Studio Code I like to use when working with node and API routes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Script Debugger &amp;amp;&lt;/li&gt;
&lt;li&gt;Rest Client Plugin&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;✨ &lt;strong&gt;Did you know&lt;/strong&gt;, instead of configuring a custom &lt;a href="https://code.visualstudio.com/docs/editor/debugging#_launchjson-attributes" rel="noopener noreferrer"&gt;&lt;code&gt;launch.json&lt;/code&gt;&lt;/a&gt; file, you can run and attach debuggers directly onto npm scripts in the &lt;code&gt;package.json&lt;/code&gt; file:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2F4VpMPC1mLnzbEgmKIXkJSG%2Fd7329a551088f26c647b7bfec9c1b8c0%2Fnpm-debug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2F4VpMPC1mLnzbEgmKIXkJSG%2Fd7329a551088f26c647b7bfec9c1b8c0%2Fnpm-debug.png" alt="npm debug"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And while tools like &lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; are a valuable part of comprehensive test suite, you can add the &lt;a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client" rel="noopener noreferrer"&gt;REST Client Extension&lt;/a&gt; to invoke API commands directly within VS Code.  We can easily use the browser to mock GET endpoints, but this makes it really easy to invoke other HTTP verbs, and post back form data.&lt;/p&gt;

&lt;p&gt;Just add a file like &lt;code&gt;test.http&lt;/code&gt; to your project.  &lt;em&gt;REST Client&lt;/em&gt; supports expansion of variable environment, and custom variables.  If you stub out multiple calls, you can separate multiple different calls by delimiting with &lt;code&gt;###&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Add the following to your sample file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;baseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//localhost:8888&lt;/span&gt;

&lt;span class="c1"&gt;// create todo item&lt;/span&gt;
&lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="sr"&gt;/api/&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;
&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;application&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Feed the cats&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2F5gpNvzYCy2gAEulbefRLyq%2F0f2c65a170ca23ddf7d51a1fca799aeb%2Fsend-request.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2F5gpNvzYCy2gAEulbefRLyq%2F0f2c65a170ca23ddf7d51a1fca799aeb%2Fsend-request.png" alt="send request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can now run the above by clicking "Send Request".  This should hit our Netlify dev server, and allow us to step through our function logic locally!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2FrObvoyuZYuGpmk4FCQTWW%2Fca72b014f162dcc726f40918898295dd%2Fbreakpoint.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2FrObvoyuZYuGpmk4FCQTWW%2Fca72b014f162dcc726f40918898295dd%2Fbreakpoint.png" alt="debugger breakpoint"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Publishing
&lt;/h2&gt;

&lt;p&gt;Publishing to Netlify is easy as well.  Make sure your project is committed, and pushed up to a git repository on GitHub, GitLab or BitBucket.&lt;/p&gt;

&lt;p&gt;Login to &lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt;, and click the option to Create "New Site From Git" and select your repo.&lt;/p&gt;

&lt;p&gt;Netlify will prompt for a &lt;strong&gt;Build command&lt;/strong&gt;, and a &lt;strong&gt;Publish directory&lt;/strong&gt;.  Believe it or not, we don't actually have either of those things yet, and it's probably a project for another day to set up our front end.  Those commands refer to the static site build part of the deployment.  Everything we need to build serverless functions is inside our functions directory and our &lt;code&gt;netlify.toml&lt;/code&gt; config.&lt;/p&gt;

&lt;p&gt;Once we deploy the site, the last thing we'll need to do is add our environment variables to Netlify under Build &amp;gt; Environment&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2F3CDrDHUXxfDZP5fonYdwlj%2F51ac23dc7614b96476c1c959a0454327%2Fnetlify-environment-variables.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.ctfassets.net%2Fzojzzdop0fzx%2F3CDrDHUXxfDZP5fonYdwlj%2F51ac23dc7614b96476c1c959a0454327%2Fnetlify-environment-variables.png" alt="netlify environment variables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps - This is only the beginning
&lt;/h2&gt;

&lt;p&gt;Hopefully some ideas are spinning as to how you can use these technologies on your own sites and projects.  The focus of this article is on building and debugging Netlify functions, but an important exercise left to the reader is to take advantage of that on your front end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: If you want to add Create React App to your current directory (without creating a new folder), add a &lt;code&gt;.&lt;/code&gt; when scaffolding out a new app like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;create-react-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try it out - build a front end, and let me know how it goes at &lt;a href="https://twitter.com/KyleMitBTV" rel="noopener noreferrer"&gt;KyleMitBTV&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;For more context, you can browse the full source code for the article on GitHub at &lt;a href="https://github.com/KyleMit/netlify-functions-demo" rel="noopener noreferrer"&gt;KyleMit/&lt;strong&gt;netlify-functions-demo&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For even more practical examples with actual code, checkout the following resources as well!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/DavidWells/netlify-functions-workshop" rel="noopener noreferrer"&gt;David Wells - Netlify Serverless Functions Workshop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/netlify/functions#community-function-examples" rel="noopener noreferrer"&gt;netlify/functions - Community Functions Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good luck, and go build things!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This Dot Labs is a modern web consultancy focused on helping companies realize their digital transformation efforts. For expert architectural guidance, training, or consulting in React, Angular, Vue, Web Components, GraphQL, Node, Bazel, or Polymer, visit &lt;a href="https://www.thisdotlabs.com" rel="noopener noreferrer"&gt;thisdotlabs.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This Dot Media is focused on creating an inclusive and educational web for all.  We keep you up to date with advancements in the modern web through events, podcasts, and free content. To learn, visit &lt;a href="https://www.thisdot.co" rel="noopener noreferrer"&gt;thisdot.co&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>netlify</category>
    </item>
  </channel>
</rss>
