Azure Functions 为在 Azure 容器应用上开发、部署和管理容器化函数应用提供集成支持。与在 Azure Kubernetes 服务 (AKS) 等容器环境中独立运行 Azure Functions 相比,使用集成的 Azure 管理门户可以更轻松地运行和管理 Azure Functions。此外,通过利用 Azure 容器应用程序提供的功能,您可以轻松利用 Azure Functions 的 KEDA、Dapr、Envoy、缩放、监控、安全性和访问控制等功能。
[参考]
Azure 容器应用托管 Azure Functions
在 Azure 容器应用上创建第一个容器化函数
以下是与创建 Azure 容器应用程序资源相关的环境变量。在这里,您为将创建的资源指定各种名称和安装位置,以及容器映像名称和标签。
# Azure Container Apps resource names export LOCATION=eastus export RESOURCE_GROUP_NAME=yoshio-rg export CONTAINER_REGISTRY_NAME=cajava2411 export CONTAINER_ENVIRONMENT=YoshioContainerEnvironment export STORAGE_NAME=yoshiojavastorage export AZURE_FUNCTION_NAME=yoshiojavafunc # Container image name and tag export C_IMAGE_NAME=tyoshio2002/java-function-on-aca export C_IMAGE_TAG=1.0
首先,为 Azure Functions for Java 创建一个 Maven 项目。此 Maven 项目旨在使用 Java 21 创建 Azure Functions。使用 mvn archetype:generate 命令创建项目,根据需要修改参数。
mvn archetype:generate \ -DinteractiveMode=false \ -DarchetypeGroupId=com.microsoft.azure \ -DarchetypeArtifactId=azure-functions-archetype \ -DgroupId=com.yoshio3 \ -Dpackage=com.yoshio3 \ -DartifactId=yoshiojavafunc \ -DappName=Java-Azure-Functions \ -DappRegion=$LOCATION \ -DjavaVersion=21 \ -Dversion=1.0-SNAPSHOT \ -Ddocker
执行上述命令将自动创建一个目录结构,Function.java 将包含带有 HTTP 触发器的 Azure Function 的示例代码。还将创建一个 Dockerfile,其中包含在 Docker 容器环境中运行 Azure Functions 的配置。
├── Dockerfile ├── host.json ├── local.settings.json ├── pom.xml └── src ├── main │ └── java │ └── com │ └── yoshio3 │ └── Function.java └── test └── java └── com └── yoshio3 ├── FunctionTest.java └── HttpResponseMessageMock.java
构建 Maven 项目并在本地运行 Azure Functions。执行以下命令以使用 HTTP 触发器启动 Azure Functions。
mvn clean package mvn azure-functions:run
Azure Functions 运行后,打开另一个终端并执行以下命令以向 HTTP 触发器发送请求。您应该收到一条回复“Hello, World”。
curl "http://localhost:7071/api/HttpExample?name=World" # Output: Hello, World
使用自动生成的 Dockerfile 构建 Azure Functions 容器映像。执行以下命令构建镜像。
docker build -t $C_IMAGE_NAME:$C_IMAGE_TAG -f ./Dockerfile .
构建完成后,执行以下命令检查镜像是否已创建。
docker images | grep $C_IMAGE_NAME # Output: tyoshio2002/java-function-on-aca 1.0 bcf471e6f774 9 hours ago 1.46GB
创建映像后,运行以下命令在本地测试 Azure Functions 容器映像。 Azure Functions 容器内部使用 HTTP 端口 80,因此您将其映射到端口 8080 以进行本地访问。容器启动后,执行curl命令向Azure Functions HTTP触发器发送请求。如果一切正常,您应该收到“Hello, World”。
docker run -p 8080:80 -it $C_IMAGE_NAME:$C_IMAGE_TAG curl "http://localhost:8080/api/HttpExample?name=World" # Output: Hello, World
首先,使用 Azure CLI 登录 Azure。执行以下命令登录。
az login
在 Azure 中创建资源组。此资源组将用于对与 Azure 容器注册表和 Azure 容器应用相关的资源进行分组。
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
创建Azure容器注册表并登录。Azure容器注册表是用于推送容器镜像的私有容器注册表。
az acr create --resource-group $RESOURCE_GROUP_NAME --name $CONTAINER_REGISTRY_NAME --sku Basic az acr login --name $CONTAINER_REGISTRY_NAME
检索创建的 Azure 容器注册表的服务器名称。服务器名称的格式为 $CONTAINER_REGISTRY_NAME.azurecr.io.
CONTAINER_REGISTRY_SERVER=$(az acr show --name $CONTAINER_REGISTRY_NAME --query loginServer --output tsv)
要将本地创建的容器映像推送到 Azure 容器注册表,请使用 tag 命令标记该映像。打标签后,使用push命令推送镜像。
docker tag $C_IMAGE_NAME:$C_IMAGE_TAG $CONTAINER_REGISTRY_SERVER/$C_IMAGE_NAME:$C_IMAGE_TAG docker push $CONTAINER_REGISTRY_SERVER/$C_IMAGE_NAME:$C_IMAGE_TAG
要从 Azure CLI 创建和管理 Azure 容器应用程序,请注册必要的扩展和资源提供程序。
az upgrade az extension add --name containerapp --upgrade -y az provider register --namespace Microsoft.Web az provider register --namespace Microsoft.App az provider register --namespace Microsoft.OperationalInsights
为Azure容器应用程序创建环境。此命令设置托管 Azure 容器应用程序所需的配置。
az containerapp env create --name $CONTAINER_ENVIRONMENT --enable-workload-profiles --resource-group $RESOURCE_GROUP_NAME --location $LOCATION
创建 Function App 实例时,Azure Functions 需要存储帐户。因此,为 Azure Functions 创建一个通用存储帐户。
az storage account create --name $STORAGE_NAME --location $LOCATION --resource-group $RESOURCE_GROUP_NAME --sku Standard_LRS
在 Azure 容器应用程序中创建 Java Azure Function 的实例。执行以下命令创建实例。由于 Azure Function 是使用 Java 21 创建的,因此指定 --runtime java.
az functionapp create --name $AZURE_FUNCTION_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --environment $CONTAINER_ENVIRONMENT \ --storage-account $STORAGE_NAME \ --workload-profile-name "Consumption" \ --max-replicas 15 \ --min-replicas 1 \ --functions-version 4 \ --runtime java \ --image $CONTAINER_REGISTRY_SERVER/$C_IMAGE_NAME:$C_IMAGE_TAG \ --assign-identity
最后,配置 Azure Functions 对 Azure 容器注册表的安全访问。为 Azure Functions 启用系统管理标识并分配 ACRPull 角色进行访问。
FUNCTION_APP_ID=$(az functionapp identity assign --name $AZURE_FUNCTION_NAME --resource-group $RESOURCE_GROUP_NAME --query principalId --output tsv) ACR_ID=$(az acr show --name $CONTAINER_REGISTRY_NAME --query id --output tsv) az role assignment create --assignee $FUNCTION_APP_ID --role AcrPull --scope $ACR_ID
最后,检索已部署的 Azure Function 的 HTTP 触发器函数 URL。使用 az functionapp function show 命令获取 Azure Functions 函数的详细信息。
az functionapp function show --resource-group $RESOURCE_GROUP_NAME --name $AZURE_FUNCTION_NAME --function-name HttpExample --query invokeUrlTemplate # Output: "https://yoshiojavafunc.niceocean-********.eastus.azurecontainerapps.io/api/httpexample"
然后,您可以使用curl 命令向检索到的URL 发送请求,以确认Azure Functions 正常工作。
curl "https://yoshiojavafunc.niceocean-********.eastus.azurecontainerapps.io/api/httpexample?name=World" # Expected Output: Hello, World
如果一切设置正确,您应该会收到一条响应“Hello, World”,确认您的 Azure Function 正在按预期运行。
在本指南中,您学习了如何:
通过执行这些步骤,您可以在 Azure 容器应用程序上成功部署 Java Azure Function,利用容器化和 Azure 集成管理功能的优势。如果您还有任何其他问题或需要具体步骤方面的帮助,请随时提问!
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3