Azure Functions
The quarkus-azure-functions extension is a simple integration point between Azure Functions
and Quarkus. It interacts with Azure Functions runtime to bootstrap Quarkus and turns any
Azure Functions class you write into a CDI/ArC bean.
This allows you to inject any service or component initialized by Quarkus directly into your function classes. You can also change the lifecycle of your function class from request scoped (the default) to application scoped too if you want your function class to be a singleton.
|
This technology is considered preview. In preview, backward compatibility and presence in the ecosystem is not guaranteed. Specific improvements might require changing configuration or APIs, and plans to become stable are under way. Feedback is welcome on our mailing list or as issues in our GitHub issue tracker. For a full list of possible statuses, check our FAQ entry. |
import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import jakarta.inject.Inject;
import java.util.Optional;
public class Function {
@Inject
GreetingService service;
@FunctionName("HttpExample")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET, HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
// Parse query parameter
final String query = request.getQueryParameters().get("name");
final String name = request.getBody().orElse(query);
if (name == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
} else {
return request.createResponseBuilder(HttpStatus.OK).body(service.greeting(name)).build();
}
}
}
Prerequisites
To complete this guide, you need:
-
Roughly 15 minutes
-
An IDE
-
JDK 17+ installed with
JAVA_HOMEconfigured appropriately -
Apache Maven 3.9.11
-
Optionally the Quarkus CLI if you want to use it
-
Optionally Mandrel or GraalVM installed and configured appropriately if you want to build a native executable (or Docker if you use a native container build)
-
An Azure Account. Free accounts work.
-
Azure Functions Core Tools version 4.x
Solution
This guide walks you through running a Maven project that can deploy an HTTP Trigger Azure Function class. This function class injects a CDI bean service that generates a greeting message that is passed back to the client.
Creating the Maven/Gradle Project
First, we need a new project. Create a new project with the following command:
For Windows users:
-
If using cmd, (don’t use backward slash
\and put everything on the same line) -
If using Powershell, wrap
-Dparameters in double quotes e.g."-DprojectArtifactId=azure-functions-quickstart"
This command generates a project structure importing the Quarkus Azure Functions HTTP extension. It includes an example.
Examining the project
If you open the pom.xml or build.gradle build file of the generated project you’ll see that
the project is similar to any other Quarkus project.
The quarkus-azure-functions extension is the integration point between
Quarkus and Azure Functions. It registers callbacsk with the Azure Functions runtime to bootstrap
Quarkus and to set up Quarkus/ArC as the function factory for your function classes.
The current implementation of the quarkus-azure-functions extension no longer requires the
azure-functions-maven-plugin or Gradle equivalent. Local development and Azure Functions packaging and
deployment is now all done by Quarkus.
Build configuration is now all within application.properties. The only required configuration switch
is quarkus.azure-functions.app-name.
Azure Deployment Descriptors
The Azure Functions host.json deployment descriptor is automatically
generated, but if you need to override it, declare it in the root directory of the project and
rerun the build when you are ready.
Run locally in Azure Functions local environment
If you want to try your app with a local Azure Functions environment, you can use this command:
quarkus run
./mvnw quarkus:run
./gradlew --console=plain --info --no-daemon quarkusRun
|
Gradle is a bit quirky with process management, so you need the |
|
You must have the Azure Functions Core Tools installed for this to work. |
The URL to access the example would be:
Quarkus Integration Testing
You can implement integration tests using @QuarkusIntegrationTest functionality. When these
integration tests run, the local Azure Functions environment will be spun up for the duration of integration testing.
./mvnw verify
./gradlew --info quarkusIntTest
|
Make sure any integration tests you execute with Maven use the |
|
Make sure any integration tests you execute with Gradle are located within |
Deploy to Azure
The quarkus-azure-functions extension handles all the work to deploy to Azure. By default,
Quarkus will use the Azure CLI in the background to authenticate and deploy to Azure. If you have
multiple subscriptions associated with your account, you must set the quarkus.azure-functions.subscription-id
property in your application.properties file to the subscription you want to use.
For other authentication mechanisms and deployment options see our config properties Azure Functions Configuration Reference.
To deploy your application, after you built your project, execute:
./mvnw quarkus:deploy
./gradlew --info deploy
|
For Gradle, you must use the |
If deployment is a success, Quarkus will output the endpoint URL of the example function to the console:
[INFO] HTTP Trigger Urls:
[INFO] HttpExample : https://{appName}.azurewebsites.net/api/httpexample
The URL to access the service would be: https://{appName}.azurewebsites.net/api/HttpExample
Azure Functions Configuration Reference
Configuration property fixed at build time - All other configuration properties are overridable at runtime
Configuration property |
Type |
Default |
|---|---|---|
App name for azure function project. This is required setting. Defaults to the base artifact name Environment variable: Show more |
string |
|
Azure Resource Group for your Azure Functions Environment variable: Show more |
string |
|
Specifies the region where your Azure Functions will be hosted; default value is westus. Valid values Environment variable: Show more |
string |
|
Specifies whether to disable application insights for your function app Environment variable: Show more |
boolean |
|
Specifies the instrumentation key of application insights which will bind to your function app Environment variable: Show more |
string |
|
Valid values are linux, windows, and docker Environment variable: Show more |
string |
|
Should be set to at least the minimum Quarkus compatible version Environment variable: Show more |
string |
|
URL of docker image if deploying via docker Environment variable: Show more |
string |
|
If using docker, url of registry Environment variable: Show more |
string |
|
Description of each type can be found here Valid values are
Defaults to "azure_cli" for authentication Environment variable: Show more |
string |
|
Filesystem path to properties file if using file type Environment variable: Show more |
string |
|
Client or App Id required if using managed_identity type Environment variable: Show more |
string |
|
Tenant ID required if using oauth2 or device_code type Environment variable: Show more |
string |
|
Specifies the name of the existing App Service Plan when you do not want to create a new one. Environment variable: Show more |
string |
|
The app service plan resource group. Environment variable: Show more |
string |
|
Azure subscription id. Required only if there are more than one subscription in your account Environment variable: Show more |
string |
|
The pricing tier. Environment variable: Show more |
string |
|
Port to run azure function in local runtime. Will default to quarkus.http.test-port or 8081 Environment variable: Show more |
int |
|
Config String for local debug Environment variable: Show more |
string |
|