This article is part of #ServerlessSeptember. You'll find other helpful articles, detailed tutorials, and videos in this all-things-Serverless content collection. New articles are published every day — that's right, every day — from community members and cloud advocates in the month of September.
Find out more about how Microsoft Azure enables your Serverless functions at https://docs.microsoft.com/azure/azure-functions/.
Overview
Previously, the most common way to create Azure Functions is through the portal or using azure-cli.
When using either of these tools to create and deploy Azure Functions, you have to first manually deploy the dependent resources
- Resource group
- Storage account
- App service plan
You also have to write your own bindings and put them in a specific location for functions to work 1. For example, if you have a hello
http-trigger function, you will need a hello/function.json
file with the following content
# hello/function.json
{
"disabled": false,
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"name": "req",
"authLevel": "anonymous"
},
{
"type": "http",
"direction": "out",
"name": "res"
}
],
"entryPoint": "sayHello",
"scriptFile": "../src/handlers/hello.js"
}
Fortunately, there's a much simpler way to do this. The serverless-azure-functions plugin allows you to quickly create and deploy function without all the overhead work.
Currently, the plugin only supports node, support for other languages are coming.
Pre-requisites
Node.js
Serverless is a Node.js CLI tool so you'll need to install Node.js on your machine.
Serverless
Make sure Serverless is installed and you're on at least 1.53
npm i -g serverless
➜ sls -v
Framework Core: 1.53.0
Plugin: 3.1.0
SDK: 2.1.1
Components Core: 1.0.0
Components CLI: 1.2.3
Once installed, the Serverless CLI can be call with serverless
or
the shorthand sls
command.
$ sls -h
Commands
* You can run commands with "serverless" or the shortcut "sls"
* Pass "--verbose" to this command to get in-depth plugin info
* Pass "--no-color" to disable CLI colors
* Pass "--help" after any <command> for contextual help
Create function
Command
Using the create
command we can specify one of the available templates. For this example we use azure-nodejs
with the --template
or shorthand -t
flag.
The --path
or shorthand -p
is the location to be created with the template service files.
sls create --template azure-nodejs --path $(whoami)-sample-app
Output
The command above created a new directory, in my case myho-sample-app
, with the following contents.
├── src
| ├── handlers
| ├── goodbye.js
| ├── hello.js
| ├── .gitignore
| ├── host.json
| ├── package.json
| ├── README.md
| ├── serverless.yml
Note
Azure plugin uses a combination of:
- prefix, if provided
- service name
- region
- stage
to generate resource names on deployment. Since resource name have to be unique in Azure, adding $(whoami)
will append your username to
the service name, thus creating a unique name.
Install Azure Plugin
The previous step created a new directory <YOUR-USER-NAME>-sample-app
where all the function related code are stored. cd
into that directory
Run
npm install
Testing locally
You can skip this section if you do not want to test your functions locally before deploy.
The sample app created from template contains 2 functions: hello and goodbye. You can test them locally before deploying to Azure.
You'll need to use 2 terminal windows for the following.
Terminal 1
sls offline
While this process is running, you'll notice that some new files have been added. These files are necessary for Azure function to operate but will be clean up when the process exit.
Terminal 2
sls invoke local -f hello -d '{"name": "Azure"}'
In your terminal window you should see the following response
$ Serverless: URL for invocation: http://localhost:7071/api/hello?name%3DAzure
$ Serverless: Invoking function hello with GET request
$ Serverless: "Hello Azure"
Deploy to Azure
Once you're happy with your code, the next step is to deploy to Azure.
Azure subscription
If you don't have an Azure account, get started by signing up for a free account, which includes $200 of free credit
Set up credentials
Before you can deploy, you'll have to set up a service principal
.
Azure-cli
Make sure you have azure-cli installed
Log in
az login
az account list # list all subscriptions
az account set --subscription <SUBSCRIPTION_ID> # choose the one you want
Generate service principals
Download this script, run it, and follow the printed instruction.
The script will generate, extract, and write the required credentials to a file that you can then export as environment variables.
# Download the file and name it `sp.sh`
curl https://raw.githubusercontent.com/serverless/serverless-azure-functions/master/scripts/generate-service-principal.sh -o sp.sh
# skip this if you're on windows
chmod +x sp.sh
# run the script
./sp.sh
Deploy
Deploying to Azure is as simple as running the following command
# if you want more logging info, uncomment the next line
# export SLS_DEBUG=*
sls deploy
Behind the scene
-
The plugin created an arm template that is used to deploy all the dependent resources
- Resource group
- App service plan
- Storage account
Once the infrastructure is up and running, the zipped source code is deployed to the function app
➜ sls deploy
Serverless: Parsing Azure Functions Bindings.json...
Serverless: Building binding for function: hello event: httpTrigger
Serverless: Parsing Azure Functions Bindings.json...
Serverless: Building binding for function: goodbye event: httpTrigger
Serverless: Packaging service...
...
Serverless: -> Deploying ARM template...
...
Serverless: -> ARM deployment complete
Serverless: Deploying serverless functions...
Serverless: Deploying zip file to function app: sls-wus-dev-myho-sample-app
Serverless: -> Deploying service package @ /Users/myho/dev/work/github.com/mydiemho/azure-utils/myho-sample-app/.serverless/myho-sample-app.zip
...
Serverless: Deployed serverless functions:
Serverless: -> goodbye: [GET] sls-wus-dev-myho-sample-app.azurewebsites.net/api/goodbye
Serverless: -> hello: [GET] sls-wus-dev-myho-sample-app.azurewebsites.net/api/hello
Test deployed functions
You can test the deployed functions by going directly to the url, or using the invoke
command.
sls invoke -f hello -d '{"name": "Azure"}'
Wrap up
Congratulation! You have created and deployed your first Azure function with Serverless.
Next step
There are a lot more you can do with Serverless than just Http-trigger functions.
API Management
You can add APIM to your functions by configure the apim
section in serverless.yml
. The generated file already included this, just uncommented the section (line 33-59) and redeploy to give it a try.
- APIM Configuration
# serverless.yml
apim:
apis:
- name: v1
subscriptionRequired: false # if true must provide an api key
displayName: v1
description: V1 sample app APIs
protocols:
- https
path: v1
tags:
- tag1
- tag2
authorization: none
cors:
allowCredentials: false
allowedOrigins:
- "*"
allowedMethods:
- GET
- POST
- PUT
- DELETE
- PATCH
allowedHeaders:
- "*"
exposeHeaders:
- "*"
1 . Deploy Output
➜ sls deploy
...
Serverless: Starting APIM service deployment
Serverless: -> Deploying API keys
Serverless: -> Deploying API: v1
Serverless: -> Deploying API Backend: myho-sample-app-backend => https://sls-wus-dev-myho-sample-app.azurewebsites.net/api
Serverless: -> Deploying CORS policy: v1
Serverless: -> Deploying API Operations: sls-wus-dev-797b03-apim
Serverless: --> GET-hello: [GET] https://sls-wus-dev-797b03-apim.azure-api.net/v1/hello
Serverless: --> GET-goodbye: [GET] https://sls-wus-dev-797b03-apim.azure-api.net/v1/goodbye
Serverless: Finished APIM service deployment
You will not be able to use the
invoke
command to test the APIM set up
Additional Triggers
In addition to http-trigger functions, the following triggers are also supported
- Storage Blob
- Storage Queue
- Timer
- Service Bus Queue
- Service Bus Topic
- EventHubs
For more information, see the official doc
More hands-on training
If you get this far and want to learn more about serverless on Azure, Microsoft is hosting a free workshop in NYC before ServerlessConf on Monday, Oct 7, 2019. Registration is @ http://aka.ms/nycworkshop
There may or may not be 🍦🍦🍦🍦🍦