你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:从命令行在 Azure 中创建函数

本文使用本地命令行工具创建响应 HTTP 请求的函数。 在本地验证代码后,将其部署到 Azure Functions 中的无服务器 Flex Consumption 托管计划。

完成本快速入门时会从你的 Azure 帐户中扣取小额费用,大约几美分或者更少。

先决条件

安装 Azure Functions Core Tools

建议的 Core Tools 安装方法取决于本地开发计算机的操作系统。

以下步骤使用 Windows 安装程序 (MSI) 安装 Core Tools v4.x。 若要详细了解其他基于包的安装程序,请参阅 Core Tools 自述文件

基于Windows 版本下载并运行 Core Tools 安装程序:

如果之前使用 Windows 安装程序 (MSI) 在 Windows 上安装 Core Tools,则应在安装最新版本之前从“添加/移除程序”中卸载旧版本。

创建并激活虚拟环境

在适当的文件夹中,运行以下命令以创建并激活一个名为 .venv 的虚拟环境。 确保使用 Azure Functions 支持的 Python 版本之一。

python -m venv .venv
source .venv/bin/activate

如果 Python 未在 Linux 分发版中安装 venv 包,请运行以下命令:

sudo apt-get install python3-venv

所有后续命令将在这个已激活的虚拟环境中运行。

创建本地代码项目和函数

在 Azure Functions 中,代码项目是一个应用,其中包含一个或多个每个函数响应特定触发器。 项目中的所有函数共享相同的配置,并将其部署为单元到 Azure。 在本部分中,将创建一个包含单个函数的代码项目。

  1. 在终端或命令提示符下,运行以下命令 func init 以在当前文件夹中创建函数应用项目:

    func init --worker-runtime dotnet-isolated 
    
  1. 在终端或命令提示符下,运行以下命令 func init 以在当前文件夹中创建函数应用项目:

    func init --worker-runtime node --language javascript 
    
  1. 在终端或命令提示符下,运行以下命令 func init 以在当前文件夹中创建函数应用项目:

    func init --worker-runtime powershell 
    
  1. 在终端或命令提示符下,运行以下命令 func init 以在当前文件夹中创建函数应用项目:

    func init --worker-runtime python 
    
  1. 在终端或命令提示符下,运行以下命令 func init 以在当前文件夹中创建函数应用项目:

    func init --worker-runtime node --language typescript 
    
  1. 在空文件夹中,运行以下命令 mvn ,从 Azure Functions Maven 原型生成代码项目:

    mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=17
    

    重要

    • 如果希望函数在 Java 11 上运行,请使用 -DjavaVersion=11。 若要了解详细信息,请参阅 Java 版本
    • 要完成本文中的步骤,JAVA_HOME 环境变量必须设置为正确版本的 JDK 的安装位置。
  2. Maven 会请求你提供所需的值,以在部署上完成项目的生成。
    系统提示时提供以下值:

    Prompt 价值 DESCRIPTION
    groupId com.fabrikam 一个值,用于按照 Java 的包命名规则在所有项目中标识你的项目。
    artifactId fabrikam-functions 一个值,该值是 jar 的名称,没有版本号。
    版本 1.0-SNAPSHOT 选择默认值。
    package com.fabrikam 一个值,该值是所生成函数代码的 Java 包。 使用默认值。
  3. 键入 Y 或按 Enter 进行确认。

    Maven 在名为 artifactId 的新文件夹(在此示例中为 fabrikam-functions)中创建项目文件。

  4. 导航到项目文件夹:

    cd fabrikam-functions
    

    可以在 \src\main\java\com\fabrikam 项目目录中的 Function.java中查看新 HTTP 触发器函数的模板生成代码。

  1. func new使用此命令将函数添加到项目:

    func new --name HttpExample --template "HTTP trigger" --authlevel "anonymous"
    

    新代码文件将添加到项目中。 在这种情况下,该 --name 参数是函数的唯一名称(HttpExample),参数 --template 指定 HTTP 触发器。

项目根文件夹包含项目的各种文件,包括名为 local.settings.jsonhost.json的配置文件。 由于 local.settings.json 可以包含从 Azure 下载的机密,因此,默认情况下,该文件会从 .gitignore 文件的源代码管理中排除

在本地运行函数

在本地运行项目并调用函数终结点来验证新函数。

  1. 使用此命令启动项目文件夹根目录中的本地 Azure Functions 运行时主机:

    func start  
    
    func start  
    
    npm install
    npm start
    
    mvn clean package  
    mvn azure-functions:run
    

    在输出的末尾,应显示以下行:

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     

    注释

    如果 HttpExample 终结点未按预期显示,则可能是从项目的根文件夹外部启动主机。 在这种情况下,请按 Ctrl+C 停止主机,导航到项目的根文件夹,然后重新运行上一命令。

  2. 将此输出中的HttpExample函数 URL复制到浏览器中,并访问该URL,你应收到一条包含“hello world”消息的成功响应。

  3. 完成后,请按 Ctrl+C 并选择 y 以停止函数主机

创建函数的支持性 Azure 资源

在将函数代码部署到 Azure 之前,需要创建以下资源:

  • 一个资源组:相关资源的逻辑容器。
  • 函数宿主使用的默认 存储帐户,用于维护有关函数的状态和其他信息。
  • 用户分配的托管标识,Functions 主机使用该标识连接到默认存储帐户。
  • 一个函数应用:提供用于执行函数代码的环境。 函数应用映射到本地函数项目,可让你将函数分组为一个逻辑单元,以便更轻松地管理、部署和共享资源。

使用这些步骤中的 Azure CLI 命令创建所需的资源。

  1. 请登录到 Azure(如果尚未这样做):

    az login
    

    使用 az login 命令登录到 Azure 帐户。 在 Azure Cloud Shell 中运行时跳过此步骤。

  2. 如果尚未这样做,请使用 az extension add 此命令安装 Application Insights 扩展:

    az extension add --name application-insights
    
  3. 使用此 az group create 命令创建在所选区域中命名 AzureFunctionsQuickstart-rg 的资源组:

    az group create --name "AzureFunctionsQuickstart-rg" --location "<REGION>"
    

    在此示例中,将 <REGION> 替换为支持 Flex 消耗计划的附近区域。 使用 az functionapp list-flexconsumption-locations 命令查看当前支持的区域的列表。

  4. 使用此 az storage account create 命令在资源组和区域中创建常规用途存储帐户:

    az storage account create --name <STORAGE_NAME> --location "<REGION>" --resource-group "AzureFunctionsQuickstart-rg" \
    --sku "Standard_LRS" --allow-blob-public-access false --allow-shared-key-access false
    

    在此示例中,请将 <STORAGE_NAME> 替换为适合你且在 Azure 存储中唯一的名称。 名称只能包含 3 到 24 个数字和小写字母字符。 Standard_LRS 指定 Functions 支持的常规用途帐户。 只能通过使用已向特定资源授予权限的Microsoft Entra 身份验证标识来访问此新帐户。

  5. 使用此脚本创建一个用户分配的托管标识,解析jq对象返回的JSON属性,并在默认存储帐户中授予Storage Blob Data Owner权限:

    output=$(az identity create --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" --location <REGION> \
    --query "{userId:id, principalId: principalId, clientId: clientId}" -o json)
    
    userId=$(echo $output | jq -r '.userId')
    principalId=$(echo $output | jq -r '.principalId')
    clientId=$(echo $output | jq -r '.clientId')
    
    storageId=$(az storage account show --resource-group "AzureFunctionsQuickstart-rg" --name <STORAGE_NAME> --query 'id' -o tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal \
    --role "Storage Blob Data Owner" --scope $storageId
    

    如果本地 Bash shell 中没有该 jq 实用工具,则它在 Azure Cloud Shell 中可用。 在此示例中,将 <STORAGE_NAME> 替换为您的默认存储帐户名称,将 <REGION> 替换为您的默认区域。

    az identity create 命令创建一个名为 func-host-storage-user 的标识。 返回的权限 principalId 用于使用 az role assignment create 命令将权限分配给默认存储帐户中的此新标识。 该 az storage account show 命令用于获取存储帐户 ID。

  6. 使用此 az functionapp create 命令在 Azure 中创建函数应用:

    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime dotnet-isolated --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime java --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime node --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    

    在此示例中,将这些占位符替换为相应的值:

    • <APP_NAME>:适合你的全球唯一名称。 <APP_NAME> 也是函数应用的默认 DNS 域。
    • <STORAGE_NAME>:上一步中使用的帐户的名称。
    • <REGION>:当前区域。
    • <LANGUAGE_VERSION>:使用你在本地验证的同一支持的语言堆栈版本

    此命令创建一个函数应用,该应用在 Linux 上的 Flex 消耗计划中指定的语言运行时中运行,根据本教程产生的用量,此操作是免费的。 该命令还会在同一资源组中创建关联的 Azure Application Insights 实例,可用于监视函数应用执行和查看日志。 有关详细信息,请参阅监视 Azure Functions。 该实例在激活之前不会产生费用。

  7. 使用此脚本将用户分配的托管标识添加到 Application Insights 实例中的 “监视指标发布者 ”角色:

    appInsights=$(az monitor app-insights component show --resource-group "AzureFunctionsQuickstart-rg" \
        --app <APP_NAME> --query "id" --output tsv)
    principalId=$(az identity show --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" \
        --query principalId -o tsv)
    az role assignment create --role "Monitoring Metrics Publisher" --assignee $principalId --scope $appInsights
    

    在本例中,将 <APP_NAME> 替换为函数应用名称。 az role assignment create 命令将用户添加到该角色。 Application Insights 实例的资源 ID 和用户的主体 ID 分别通过 az monitor app-insights component showaz identity show 命令获取。

更新应用程序设置

若要使 Functions 主机能够使用共享机密连接到默认存储帐户,必须将连接字符串设置替换为 AzureWebJobsStorage 带前缀 AzureWebJobsStorage__的多个设置。 这些设置定义了一个复杂的设置,你的应用使用该设置通过用户分配的托管标识连接到存储和 Application Insights。

  1. 使用此脚本获取用户分配的托管标识的客户端 ID,并使用它定义与存储和 Application Insights 的托管标识连接:

    clientId=$(az identity show --name func-host-storage-user \
        --resource-group AzureFunctionsQuickstart-rg --query 'clientId' -o tsv)
    az functionapp config appsettings set --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" \
        --settings AzureWebJobsStorage__accountName=<STORAGE_NAME> \
        AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientId \
        APPLICATIONINSIGHTS_AUTHENTICATION_STRING="ClientId=$clientId;Authorization=AAD"
    

    在此脚本中,将<APP_NAME><STORAGE_NAME>分别替换为您的函数应用和存储帐户的名称。

  2. 运行 az functionapp config appsettings delete 命令以删除包含共享密钥的现有 AzureWebJobsStorage 连接字符串设置:

    az functionapp config appsettings delete --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" --setting-names AzureWebJobsStorage
    

    在此示例中,将<APP_NAME>替换为函数应用的名称。

此时,Functions 主机能够使用托管标识而不是共享机密安全地连接到存储帐户。 现在可以将项目代码部署到 Azure 资源。

将函数项目部署到 Azure

在 Azure 中成功创建函数应用后,便可以使用 func azure functionapp publish 命令部署本地函数项目。

在根项目文件夹中,运行此 func azure functionapp publish 命令:

func azure functionapp publish <APP_NAME>

在此示例中,使用应用名称替代 <APP_NAME>。 成功的部署显示类似于以下输出的结果(为简洁起见,示例中的结果已截断):

...

Getting site publishing info...
Creating archive for current directory...
Performing remote build for functions project.

...

Deployment successful.
Remote build succeeded!
Syncing triggers...
Functions in msdocs-azurefunctions-qs:
    HttpExample - [httpTrigger]
        Invoke url: https://msdocs-azurefunctions-qs.azurewebsites.net/api/httpexample

更新 pom.xml 文件

在 Azure 中成功创建函数应用后,必须更新 pom.xml 文件,以便 Maven 可以部署到新应用。 否则,它会在部署期间创建新的 Azure 资源集。

  1. 在 Azure Cloud Shell 中,使用 az functionapp show 此命令获取新用户分配的托管标识的部署容器 URL 和 ID:

    az functionapp show --name <APP_NAME> --resource-group AzureFunctionsQuickstart-rg  \
        --query "{userAssignedIdentityResourceId: properties.functionAppConfig.deployment.storage.authentication.userAssignedIdentityResourceId, \
        containerUrl: properties.functionAppConfig.deployment.storage.value}"
    

    在此示例中,将 <APP_NAME> 替换为您的函数应用的名称。

  2. 在项目根目录中,在文本编辑器中打开 pom.xml 文件,找到 properties 元素,并更新这些特定的属性值:

    属性名称 价值
    java.version 使用本地验证的相同 支持的语言堆栈版本 ,例如 17
    azure.functions.maven.plugin.version 1.37.1
    azure.functions.java.library.version 3.1.0
    functionAppName Azure 中函数应用的名称。
  3. 请找到configuration部分中的azure-functions-maven-plugin,并将其替换为以下 XML 片段:

    <configuration>
        <appName>${functionAppName}</appName>
        <resourceGroup>AzureFunctionsQuickstart-rg</resourceGroup>
        <pricingTier>Flex Consumption</pricingTier>
        <region>....</region>
        <runtime>
            <os>linux</os>
            <javaVersion>${java.version}</javaVersion>
        </runtime>
        <deploymentStorageAccount>...</deploymentStorageAccount>
        <deploymentStorageResourceGroup>AzureFunctionsQuickstart-rg</deploymentStorageResourceGroup>
        <deploymentStorageContainer>...</deploymentStorageContainer>
        <storageAuthenticationMethod>UserAssignedIdentity</storageAuthenticationMethod>
        <userAssignedIdentityResourceId>...</userAssignedIdentityResourceId>
        <appSettings>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~4</value>
            </property>
        </appSettings>
    </configuration>
    
  4. 在新的 configuration 元素中,将这些省略号 (...) 值进行以下特定替换:

    配置 价值
    region 现有函数应用的区域代码,例如 eastus
    deploymentStorageAccount 存储帐户的名称。
    deploymentStorageContainer 部署共享的名称,该共享位于你获得的 containerUrl 值中的 \ 之后。
    userAssignedIdentityResourceId 你获取的托管标识的完全限定的资源 ID。
  5. 保存对 pom.xml 文件的更改。

现在可以使用 Maven 将代码项目部署到现有应用。

将函数项目部署到 Azure

  1. 从命令提示符中,运行此命令:

    mvn clean package azure-functions:deploy
    
  2. 部署成功后,使用此 az functionapp function show URL 获取远程 HttpExample 函数终结点的 URL:

    az functionapp function show --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" \
        --function-name HttpExample --query invokeUrlTemplate -o tsv
    

    在此示例中,用您的函数应用的名称替换 <APP_NAME>

  3. 复制返回的终结点 URL,接下来将使用该 URL 调用函数终结点。

在 Azure 上调用函数

由于函数使用 HTTP 触发器并且支持 GET 请求,因此可以通过向此函数的 URL 发出 HTTP 请求来调用它。 最简单的方法是在浏览器中执行 GET 请求。

将发布命令的输出中显示的完整调用 URL 复制到浏览器的地址栏

将复制的 URL 粘贴到浏览器地址栏中。

终结点 URL 应类似于以下示例:

https://contoso-app.azurewebsites.net/api/httpexample

导航到此 URL 时,浏览器显示的输出应与在本地运行函数时显示的输出类似。

清理资源

若要继续执行下一步并添加 Azure 存储队列输出绑定,请保留所有资源,以备将来使用。

否则,请使用以下命令删除资源组及其包含的所有资源,以免产生额外的费用。

az group delete --name AzureFunctionsQuickstart-rg

后续步骤