title | description | ms.date | ms.topic | ms.custom | zone_pivot_groups | |
---|---|---|---|---|---|---|
Create functions in Azure using the Azure Developer CLI |
Learn how to use the Azure Developer CLI (azd) to create resources and deploy the local project to a Flex Consumption plan on Azure. |
10/19/2024 |
quickstart |
|
programming-languages-set-functions |
In this Quickstart, you use Azure Developer command-line tools to create functions that respond to HTTP requests. After testing the code locally, you deploy it to a new serverless function app you create running in a Flex Consumption plan in Azure Functions.
The project source uses the Azure Developer CLI (azd) to simplify deploying your code to Azure. This deployment follows current best practices for secure and scalable Azure Functions deployments.
By default, the Flex Consumption plan follows a pay-for-what-you-use billing model, which means to complete this quickstart incurs a small cost of a few USD cents or less in your Azure account.
-
An Azure account with an active subscription. Create an account for free.
::: zone pivot="programming-language-csharp"
-
Azurite storage emulator ::: zone-end
::: zone pivot="programming-language-java" -
- If you use another supported version of Java, you must update the project's pom.xml file.
- The
JAVA_HOME
environment variable must be set to the install location of the correct version of the JDK.
-
Apache Maven 3.8.x
::: zone-end
::: zone pivot="programming-language-javascript,programming-language-typescript" -
Node.js 20
::: zone-end
::: zone pivot="programming-language-powershell" -
.NET 6.0 SDK
::: zone-end ::: zone pivot="programming-language-python" -
Python 3.11. ::: zone-end
-
A secure HTTP test tool for sending requests with JSON payloads to your function endpoints. This article uses
curl
.
You can use the azd init
command to create a local Azure Functions code project from a template.
::: zone pivot="programming-language-csharp"
-
In your local terminal or command prompt, run this
azd init
command in an empty folder:azd init --template functions-quickstart-dotnet-azd -e flexquickstart-dotnet
This command pulls the project files from the template repository and initializes the project in the current folder. The
-e
flag sets a name for the current environment. Inazd
, the environment is used to maintain a unique deployment context for your app, and you can define more than one. It's also used in the name of the resource group you create in Azure. -
Run this command to navigate to the
http
app folder:cd http
-
Create a file named local.settings.json in the
http
folder that contains this JSON data:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" } }
This file is required when running locally. ::: zone-end
::: zone pivot="programming-language-java" -
In your local terminal or command prompt, run this
azd init
command in an empty folder:azd init --template azure-functions-java-flex-consumption-azd -e flexquickstart-java
This command pulls the project files from the template repository and initializes the project in the current folder. The
-e
flag sets a name for the current environment. Inazd
, the environment is used to maintain a unique deployment context for your app, and you can define more than one. It's also used in the name of the resource group you create in Azure. -
Run this command to navigate to the
http
app folder:cd http
-
Create a file named local.settings.json in the
http
folder that contains this JSON data:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "java" } }
This file is required when running locally. ::: zone-end
::: zone pivot="programming-language-javascript" -
In your local terminal or command prompt, run this
azd init
command in an empty folder:azd init --template functions-quickstart-javascript-azd -e flexquickstart-js
This command pulls the project files from the template repository and initializes the project in the root folder. The
-e
flag sets a name for the current environment. Inazd
, the environment is used to maintain a unique deployment context for your app, and you can define more than one. It's also used in the name of the resource group you create in Azure. -
Create a file named local.settings.json in the root folder that contains this JSON data:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node" } }
This file is required when running locally. ::: zone-end
::: zone pivot="programming-language-powershell" -
In your local terminal or command prompt, run this
azd init
command in an empty folder:azd init --template functions-quickstart-powershell-azd -e flexquickstart-ps
This command pulls the project files from the template repository and initializes the project in the root folder. The
-e
flag sets a name for the current environment. Inazd
, the environment is used to maintain a unique deployment context for your app, and you can define more than one. It's also used in the name of the resource group you create in Azure. -
Run this command to navigate to the
src
app folder:cd src
-
Create a file named local.settings.json in the
src
folder that contains this JSON data:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "powershell", "FUNCTIONS_WORKER_RUNTIME_VERSION": "7.2" } }
This file is required when running locally. ::: zone-end
::: zone pivot="programming-language-typescript" -
In your local terminal or command prompt, run this
azd init
command in an empty folder:azd init --template functions-quickstart-typescript-azd -e flexquickstart-ts
This command pulls the project files from the template repository and initializes the project in the root folder. The
-e
flag sets a name for the current environment. Inazd
, the environment is used to maintain a unique deployment context for your app, and you can define more than one. It's also used in the name of the resource group you create in Azure. -
Create a file named local.settings.json in the root folder that contains this JSON data:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node" } }
This file is required when running locally. ::: zone-end
::: zone pivot="programming-language-python" -
In your local terminal or command prompt, run this
azd init
command in an empty folder:azd init --template functions-quickstart-python-http-azd -e flexquickstart-py
This command pulls the project files from the template repository and initializes the project in the root folder. The
-e
flag sets a name for the current environment. Inazd
, the environment is used to maintain a unique deployment context for your app, and you can define more than one. It's also used in the name of the resource group you create in Azure. -
Create a file named local.settings.json in the root folder that contains this JSON data:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "python" } }
This file is required when running locally.
In the root folder, run these commands to create and activate a virtual environment named .venv
:
python3 -m venv .venv
source .venv/bin/activate
If Python didn't install the venv package on your Linux distribution, run the following command:
sudo apt-get install python3-venv
py -m venv .venv
source .venv/scripts/activate
py -m venv .venv
.venv\scripts\activate
::: zone-end
-
Run this command from your app folder in a terminal or command prompt:
::: zone pivot="programming-language-csharp, programming-language-powershell,programming-language-python"
func start
::: zone-end
::: zone pivot="programming-language-java"mvn clean package mvn azure-functions:run
::: zone-end
::: zone pivot="programming-language-javascript"npm install func start
::: zone-end
::: zone pivot="programming-language-typescript"npm install npm start
::: zone-end
When the Functions host starts in your local project folder, it writes the URL endpoints of your HTTP triggered functions to the terminal output.
-
In your browser, navigate to the
httpget
endpoint, which should look like this URL: -
From a new terminal or command prompt window, run this
curl
command to send a POST request with a JSON payload to thehttppost
endpoint: ::: zone pivot="programming-language-csharp, programming-language-powershell,programming-language-python"curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d @testdata.json
::: zone-end
::: zone pivot="programming-language-javascript,programming-language-typescript"curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d "@src/functions/testdata.json"
::: zone-end
This command reads JSON payload data from thetestdata.json
project file. You can find examples of both HTTP requests in thetest.http
project file. -
When you're done, press Ctrl+C in the terminal window to stop the
func.exe
host process. ::: zone pivot="programming-language-python" -
Run
deactivate
to shut down the virtual environment. ::: zone-end
You can review the code that defines the two HTTP trigger function endpoints:
::: zone pivot="programming-language-csharp"
:::code language="csharp" source="/functions-quickstart-dotnet-azd/http/httpGetFunction.cs" range="17-29" :::
::: zone-end/functions-quickstart-java-azd/http/src/main/java/com/contoso/Function.java" range="24-38" :::
::: zone-end
::: zone pivot="programming-language-java"
:::code language="java" source="
::: zone pivot="programming-language-javascript"
:::code language="javascript" source="/functions-quickstart-javascript-azd/src/functions/httpGetFunction.js" :::
::: zone-end/functions-quickstart-typescript-azd/src/functions/httpGetFunction.ts" :::
::: zone-end
::: zone pivot="programming-language-typescript"
:::code language="typescript" source="
::: zone pivot="programming-language-powershell"
This function.json
file defines the httpget
function:
:::code language="json" source="/functions-quickstart-powershell-azd/src/httpGetFunction/function.json" :::
This /functions-quickstart-powershell-azd/src/httpGetFunction/run.ps1" :::
::: zone-endrun.ps1
file implements the function code:
:::code language="powershell" source="
::: zone pivot="programming-language-python"
:::code language="python" source="~/functions-quickstart-python-azd/function_app.py" range="6-12" :::
::: zone-end
::: zone pivot="programming-language-csharp"
:::code language="csharp" source="/functions-quickstart-dotnet-azd/http/httpPostBodyFunction.cs" range="19-35":::/functions-quickstart-java-azd/http/src/main/java/com/contoso/Function.java" range="44-71" :::
::: zone-end
::: zone-end
::: zone pivot="programming-language-java"
:::code language="java" source="
::: zone pivot="programming-language-javascript"
:::code language="javascript" source="/functions-quickstart-javascript-azd/src/functions/httpPostBodyFunction.js" :::
::: zone-end/functions-quickstart-typescript-azd/src/functions/httpPostBodyFunction.ts" :::
::: zone-end
::: zone pivot="programming-language-typescript"
:::code language="typescript" source="
::: zone pivot="programming-language-powershell"
This function.json
file defines the httppost
function:
:::code language="json" source="/functions-quickstart-powershell-azd/src/httpPostBodyFunction/function.json" :::
This /functions-quickstart-powershell-azd/src/httpPostBodyFunction/run.ps1" :::
::: zone-endrun.ps1
file implements the function code:
:::code language="powershell" source="
::: zone pivot="programming-language-python"
:::code language="python" source="~/functions-quickstart-python-azd/function_app.py" range="14-34" :::
::: zone-end
::: zone pivot="programming-language-csharp"
You can review the complete template project here.
::: zone-end
::: zone pivot="programming-language-java"
You can review the complete template project here.
::: zone-end
::: zone pivot="programming-language-javascript"
You can review the complete template project here.
::: zone-end
::: zone pivot="programming-language-typescript"
You can review the complete template project here.
::: zone-end
::: zone pivot="programming-language-powershell"
You can review the complete template project here.
::: zone-end
::: zone pivot="programming-language-python"
You can review the complete template project here.
::: zone-end
After you verify your functions locally, it's time to publish them to Azure.
::: zone pivot="programming-language-java"
This project is configured to use the azd provision
command to create a function app in a Flex Consumption plan, along with other required Azure resources.
Note
This project includes a set of Bicep files that azd
uses to create a secure deployment to a Flex consumption plan that follows best practices.
The azd up
and azd deploy
commands aren't currently supported for Java apps.
-
In the root folder of the project, run this command to create the required Azure resources:
azd provision
The root folder contains the
azure.yaml
definition file required byazd
.If you aren't already signed-in, you're asked to authenticate with your Azure account.
-
When prompted, provide these required deployment parameters:
Parameter Description Azure subscription Subscription in which your resources are created. Azure location Azure region in which to create the resource group that contains the new Azure resources. Only regions that currently support the Flex Consumption plan are shown. The
azd provision
command uses your response to these prompts with the Bicep configuration files to create and configure these required Azure resources:- Flex Consumption plan and function app
- Azure Storage (required) and Application Insights (recommended)
- Access policies and roles for your account
- Service-to-service connections using managed identities (instead of stored connection strings)
- Virtual network to securely run both the function app and the other Azure resources
After the command completes successfully, you can deploy your project code to this new function app in Azure.
You can use Core Tools to package your code and deploy it to Azure from the target
output folder.
-
Navigate to the app folder equivalent in the
target
output folder:cd http/target/azure-functions/contoso-functions
This folder should have a host.json file, which indicates that it's the root of your compiled Java function app.
-
Run these commands to deploy your compiled Java code project to the new function app resource in Azure using Core Tools:
APP_NAME=$(azd env get-value AZURE_FUNCTION_NAME) func azure functionapp publish $APP_NAME
for /f "tokens=*" %i in ('azd env get-value AZURE_FUNCTION_NAME') do set APP_NAME=%i func azure functionapp publish %APP_NAME%
The
azd env get-value
command gets your function app name from the local environment, which is required for deployment usingfunc azure functionapp publish
. After publishing completes successfully, you see links to the HTTP trigger endpoints in Azure. ::: zone-end
::: zone pivot="programming-language-csharp,programming-language-javascript,programming-language-typescript,programming-language-powershell,programming-language-python"
This project is configured to use the azd up
command to deploy this project to a new function app in a Flex Consumption plan in Azure.
Tip
This project includes a set of Bicep files that azd
uses to create a secure deployment to a Flex consumption plan that follows best practices.
-
Run this command to have
azd
create the required Azure resources in Azure and deploy your code project to the new function app:azd up
The root folder contains the
azure.yaml
definition file required byazd
.If you aren't already signed-in, you're asked to authenticate with your Azure account.
-
When prompted, provide these required deployment parameters:
Parameter Description Azure subscription Subscription in which your resources are created. Azure location Azure region in which to create the resource group that contains the new Azure resources. Only regions that currently support the Flex Consumption plan are shown. The
azd up
command uses your response to these prompts with the Bicep configuration files to complete these deployment tasks:-
Create and configure these required Azure resources (equivalent to
azd provision
):- Flex Consumption plan and function app
- Azure Storage (required) and Application Insights (recommended)
- Access policies and roles for your account
- Service-to-service connections using managed identities (instead of stored connection strings)
- Virtual network to securely run both the function app and the other Azure resources
-
Package and deploy your code to the deployment container (equivalent to
azd deploy
). The app is then started and runs in the deployed package.
After the command completes successfully, you see links to the resources you created. ::: zone-end
-
You can now invoke your function endpoints in Azure by making HTTP requests to their URLs using your HTTP test tool or from the browser (for GET requests). When your functions run in Azure, access key authorization is enforced, and you must provide a function access key with your request.
You can use the Core Tools to obtain the URL endpoints of your functions running in Azure.
-
In your local terminal or command prompt, run these commands to get the URL endpoint values: ::: zone pivot="programming-language-csharp,programming-language-javascript,programming-language-typescript,programming-language-java,programming-language-python"
SET APP_NAME=(azd env get-value AZURE_FUNCTION_NAME) func azure functionapp list-functions $APP_NAME --show-keys
for /f "tokens=*" %i in ('azd env get-value AZURE_FUNCTION_NAME') do set APP_NAME=%i func azure functionapp list-functions %APP_NAME% --show-keys
::: zone-end
::: zone pivot="programming-language-powershell"$APP_NAME = azd env get-value AZURE_FUNCTION_NAME func azure functionapp list-functions $APP_NAME --show-keys
for /f "tokens=*" %i in ('azd env get-value AZURE_FUNCTION_NAME') do set APP_NAME=%i func azure functionapp list-functions %APP_NAME% --show-keys
::: zone-end
Theazd env get-value
command gets your function app name from the local environment. Using the--show-keys
option withfunc azure functionapp list-functions
means that the returned Invoke URL: value for each endpoint includes a function-level access key. -
As before, use your HTTP test tool to validate these URLs in your function app running in Azure. ::: zone pivot="programming-language-csharp,programming-language-javascript,programming-language-typescript,programming-language-powershell,programming-language-python"
You can run the azd up
command as many times as you need to both provision your Azure resources and deploy code updates to your function app.
Note
Deployed code files are always overwritten by the latest deployment package.
Your initial responses to azd
prompts and any environment variables generated by azd
are stored locally in your named environment. Use the azd env get-values
command to review all of the variables in your environment that were used when creating Azure resources.
::: zone-end
When you're done working with your function app and related resources, you can use this command to delete the function app and its related resources from Azure and avoid incurring any further costs:
azd down --no-prompt
Note
The --no-prompt
option instructs azd
to delete your resource group without a confirmation from you.
This command doesn't affect your local code project.