实验室 07:以更安全地方式跨服务访问资源机密

Microsoft Azure 用户接口

鉴于 Microsoft 云工具的动态特性,Azure UI 在此培训内容开发后可能会发生更改。 因此,实验说明和实验步骤可能无法正确对应。

我们发现社区进行了必要更改时,Microsoft 将会更新此培训课程。 但由于云更新频繁,在此培训内容更新前 UI 可能已更改。 如果发生这种情况,请适应这些更改,并根据需要在实验室中熟悉这些更改。

Instructions

开始之前

登录到实验室环境

使用以下凭据登录到 Windows 11 虚拟机 (VM):

  • 用户名:Admin
  • 密码:Pa55w.rd

注意:你的讲师将提供连接到虚拟实验室环境的说明。

查看已安装的应用程序

在 Windows 11 桌面上找到任务栏。 任务栏里有本实验室中你将使用的应用程序的图标,包括:

  • Microsoft Edge
  • 文件资源浏览器
  • 终端
  • Visual Studio Code

实验室场景

在本实验室中,你将创建一个存储帐户和一个用于访问存储帐户的 Azure 函数应用。 为了演示连接字符串信息的安全存储,你将预配一个 Key Vault 资源并管理适当的机密来存储连接字符串信息。 你还将管理服务标识,以获取对存储帐户的连接字符串信息的安全访问。

体系结构关系图

描绘用户跨服务更安全地访问资源机密的体系结构图。

练习 1:创建 Azure 资源

任务 1:打开 Azure 门户

  1. 在任务栏上,选择 Microsoft Edge 图标。

  2. 在打开的浏览器窗口中,浏览到 Azure 门户 (https://portal.azure.com),然后使用你将用于此实验室的帐户登录。

    注意:第一次登录 Azure 门户时,你会看到一个门户教程。 选择“开始使用”,以跳过导览并开始使用门户。

任务 2:创建存储帐户

  1. 在 Azure 门户中,使用“搜索资源、服务和文档”文本框搜索“存储帐户”,然后在结果列表中选择“存储帐户” 。

  2. 在“存储帐户”边栏选项卡上,选择“+ 创建”。 **  

  3. 在“创建存储帐户”边栏选项卡的“基本信息”选项卡上,执行以下操作,然后选择“查看” :

    设置 操作
    “订阅”下拉列表 保留默认值
    “资源组”部分 选择“新建”,输入“ConfidentialStack”,然后选择“确定”
    “存储帐户名称”文本框  输入“securestor[yourname]”
    “区域”下拉列表 选择“(US)美国东部”
    主服务** 无更改
    “性能”部分 选择“标准”选项
    “冗余”下拉列表 选择“本地冗余存储(LRS)”

    以下屏幕截图显示了“创建存储帐户”边栏选项卡上配置的设置。

    显示“创建存储帐户”窗格中配置的设置的屏幕截图

  4. 在“查看”选项卡中,查看在上述步骤中选择的选项。

  5. 选择“创建”,使用指定的配置创建存储帐户。

    注意:等待创建任务完成,再继续本实验室。

  6. 在“部署概述”边栏选项卡上,选择“转到资源” 。

  7. 在“存储帐户”边栏选项卡上的“安全 + 网络”部分中,选择“访问密钥”链接。 **   **   **  

  8. 在“访问密钥”部分中,选择“显示密钥”。 **  

  9. 在“访问密钥” 边栏选项卡上,查看任一“连接字符串”(使用“显示”按钮),然后在记事本中记录任一“连接字符串” 框的值 ******。 **密钥 是平台管理的加密密钥, 用于此实验室。

    注意:你选择哪个连接字符串无关紧要。 它们是可互换的。

任务 3:创建 Azure 密钥保管库

  1. 在 Azure 门户中,使用“搜索资源、服务和文档”文本框搜索“密钥保管库”,然后在结果列表中选择“密钥保管库” 。

  2. 在“密钥保管库”边栏选项卡上,选择“创建” 。

  3. 在“创建密钥保管库”边栏选项卡的“基本信息”选项卡上,执行以下操作,然后选择“下一步”以转到“访问配置”选项卡******

    设置 操作
    “订阅”下拉列表 保留默认值
    “资源组”下拉列表 在列表中选择“ConfidentialStack”
    “密钥保管库名称”文本框  输入“securevault[yourname]”
    “区域”下拉列表 选择“美国东部”
    “定价层”下拉列表 选择“标准”

    以下屏幕截图显示了“创建密钥保管库”边栏选项卡上配置的设置。

    显示“创建密钥保管库”边栏选项卡上配置的设置的屏幕截图

  4. 在“访问配置”选项卡上,将权限模型更改为“保管库访问策略”,然后选择“查看 + 创建”****

  5. 在“查看 + 创建”选项卡中,查看在上述步骤中选择的选项。

  6. 选择“创建”,使用指定的配置创建密钥保管库。

    注意:等待创建任务完成,再继续本实验室。

任务 4:创建函数应用

  1. 在 Azure 门户中,使用“搜索资源、服务和文档”文本框搜索“函数应用”,然后在结果列表中选择“函数应用” 。

  2. 在“函数应用”边栏选项卡中,选择“创建” 。

  3. 在“选择托管选项”页面,确保选择“消耗”,然后单击“选择”。

  4. 在“创建函数应用(消耗)”边栏选项卡的“基本信息”选项卡上,执行以下操作,然后选择“下一步:存储”:

    设置 操作
    “订阅”下拉列表 保留默认值
    “资源组”下拉列表 选择“ConfidentialStack”
    “函数应用名称”文本框  输入“securefunc[yourname]”
    “运行时堆栈”下拉列表 选择“.NET”
    “版本”下拉列表 选择“8(LTS),独立辅助角色模型”**
    “区域”下拉列表 选择“美国东部”区域
    “操作系统”部分 选择“Linux”

    以下屏幕截图显示了“创建函数应用”边栏选项卡上配置的设置。

    显示“创建函数应用”边栏选项卡上配置的设置的屏幕截图

  5. 在“存储”选项卡上,执行以下操作,然后选择“查看 + 创建”:

    设置 操作
    “存储帐户”下拉列表 选择“securestor[yourname]”存储帐户
  6. 在“查看 + 创建”选项卡中,查看在上述步骤中选择的选项。

  7. 选择“创建”,使用指定的配置创建函数应用。

    注意:等待创建任务完成,再继续本实验室。

审阅

在本练习中,你创建了本实验室所需的全部资源。

练习 2:配置机密和标识

任务 1:配置系统分配的托管服务标识

  1. 在 Azure 门户的导航窗格中,选择“资源组”链接。

  2. 在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。

  3. 在“ConfidentialStack”边栏选项卡上,选择“securefunc[yourname]”函数应用 。

    注意:将有两项资源,即函数应用资源和应用程序见解资源,两者的名称相同。 确保选择函数应用资源。

  4. 在“函数应用”边栏选项卡上,从“设置”部分选择“标识”选项 。

  5. 在“标识”窗格的“系统分配”选项卡上,将“状态”设置为“开启”,然后选择“保存” 。

  6. 选择“是”确认设置。

    注意:等待系统分配的托管标识创建完成后再继续本实验。

任务 2:创建密钥保管库机密

  1. 在 Azure 门户的“导航”窗格中,选择“资源组”链接。

  2. 在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。

  3. 在“ConfidentialStack”边栏选项卡上,选择“securevault[yourname]”密钥保管库 。

  4. 在“密钥保管库”边栏选项卡上,选择“对象”部分中的“机密”链接 。

  5. 在“机密”窗格中,选择“+ 生成/导入” 。

  6. 在“创建机密”边栏选项卡上,执行以下操作,然后选择“创建” :

    设置 操作
    “上传选项”下拉列表 选择“手动”
    “名称”文本框 输入“storagecredentials”
    “机密值”** 文本框 输入之前在此实验室中记录的存储帐户连接字符串
    “内容类型”文本框 留空
    “设置激活日期”复选框 未选定
    “设置到期日期”复选框 未选定
    “启用”选项 选择“是”

    以下屏幕截图显示了“创建机密”边栏选项卡上配置的设置。

    显示“创建机密”边栏选项卡上配置的设置的屏幕截图

    注意:等待机密创建完成后再继续本实验。

  7. 返回“机密”窗格,选择列表中的“storagecredentials”项 。

  8. 在“版本”窗格中,选择“storagecredentials”机密的最新版本 。

  9. 在“机密版本”窗格中,执行以下操作:

    1. 选择“显示机密值”,可以找到机密的值。

    2. 记录“机密标识符”文本框的值,因为你稍后将在本实验室中使用该值。

    注意:你将记录“机密标识符”文本框中的值,而不是“机密值”文本框中的值 。

任务 3:配置密钥保管库访问策略

  1. 在 Azure 门户的导航窗格中,选择“资源组”链接。

  2. 在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。

  3. 在“ConfidentialStack”边栏选项卡上,选择“securevault[yourname]”密钥保管库 。

  4. 在“密钥保管库”边栏选项卡中,选择“概览”部分中的“访问策略”链接 。

  5. 在“访问策略”窗格中,选择“+ 创建” 。

  6. 在“创建访问策略”边栏选项卡上的“权限”部分,进行以下选择****:

    设置 操作
    “从模板配置”下拉列表 留空
    “密钥权限”复选框 已选择 0
    “机密权限”复选框 选择“GET”权限
    “证书权限”复选框 已选择 0
  7. 选择“主体”** 部分并做出以下选择:

    设置 操作
    “选择主体”链接 找到并选择名为“securefunc[yourname]”的服务主体。 之前在本实验室中创建的系统分配的托管标识将与 Azure 函数资源同名
  8. 选择“查看 + 创建”**,然后选择“创建”**。

    注意:等待访问策略更改保存后再继续本实验室。

任务 4:创建密钥保管库派生的应用程序设置

  1. 在 Azure 门户的导航窗格中,选择“资源组”链接。

  2. 在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。

  3. 在“ConfidentialStack”边栏选项卡上,选择“securefunc[yourname]”函数应用 。

  4. 在“函数应用”边栏选项卡上的“设置”部分,选择“环境变量”链接****

  5. 在“应用设置”选项卡中,选择“+ 添加”**。 在“添加/编辑应用程序设置”弹出对话框中输入以下信息**:

    设置 操作
    “名称”文本框 输入 StorageConnectionString**
    “值”文本框 使用以下语法构造值:@Microsoft.KeyVault(SecretUri=<Secret Identifier>),其中 <Secret Identifier> 占位符表示在本练习前面记录的机密标识符。
    “部署槽设置”复选框 保留默认值

    注意:例如,如果机密标识符为 https://securevaultstudent.vault.azure.net/secrets/storagecredentials/17b41386df3e4191b92f089f5efb4cbf,则产生的值为 @Microsoft.KeyVault(SecretUri=https://securevaultstudent.vault.azure.net/secrets/storagecredentials/17b41386df3e4191b92f089f5efb4cbf)

  6. 选择“应用”关闭弹出对话框并返回“应用设置”部分****。

  7. 在“应用设置”部分底部,选择“应用”****。

    注意: 更新应用设置时,你可能会收到一条警告,指出应用可能会重启。 选择“确认”。 等待应用程序设置保存后再继续本实验室。

审阅

在本练习中,你为函数应用创建了系统分配的托管服务标识,然后为该标识提供了相应的权限,以获取密钥保管库中的机密值。 最后,你创建了函数应用的配置设置中所引用的机密。

练习 3:生成 Azure Functions 应用

任务 1:初始化函数项目

  1. 在任务栏上,选择“终端”图标**

  2. 运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:

    cd F:\Allfiles\Labs\07\Starter\func
    

    注意:在 Windows 资源管理器中,从 F:\Allfiles\Labs\07\Starter\func.gitignore 文件中删除只读属性。

  3. 运行以下命令以使用 Azure Functions Core Tools 通过 dotnet 运行时在当前目录中新建本地 Functions 项目 :

    func init --worker-runtime dotnet-isolated --target-framework net8.0 --force
    

    注意:可以查看文档以使用 Azure Functions Core Tools [创建新项目][azure-functions-core-tools-new-project]。

  4. 运行以下命令以生成 .NET 8 项目**

    dotnet build
    

任务 2:创建 HTTP 触发的函数

  1. 运行以下命令以使用 Azure Functions Core Tools 通过 HTTP 触发器模板新建一个名为 FileParser 的函数 :

    func new --template "HTTP trigger" --name "FileParser"
    

    注意:可以查看文档以使用 Azure Functions Core Tools [创建新函数][azure-functions-core-tools-new-function]。

  2. 关闭当前正在运行的“终端”应用程序。**

任务 3:配置和读取应用程序设置

  1. 在“启动”屏幕上,选择“Visual Studio Code”磁贴 。

  2. 在“文件”** 菜单中,选择“打开文件夹”**。

  3. 在打开的“文件资源管理器”窗口中,浏览到 Allfiles (F):\Allfiles\Labs\07\Starter\func,然后选择“选择文件夹” 。

  4. 在 Visual Studio Code 窗口的“资源管理器”窗格中,打开 local.settings.json 文件 。

  5. 请注意 Values 对象的当前值:

    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
    }
    
  6. 通过添加名为“StorageConnectionString”的新设置并将其设置为“[TEST VALUE]”的字符串值来更新“Values”对象的值 :

    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
        "StorageConnectionString": "[TEST VALUE]"
    }
    
  7. Local.settings.json 文件现应包括:

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
        "StorageConnectionString": "[TEST VALUE]"
      }
    }
    
  8. 选择“保存”,将所做的更改保存到 local.settings.json 文件中 。

  9. 在“Visual Studio Code”窗口的“资源管理器”窗格中,打开 FileParser.cs 文件 。

  10. 在代码编辑器中,将自动生成的 FileParser 函数代码内容(从第 18 行开始)替换为以下代码**

            [Function("FileParser")]
             public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
             {
                 _logger.LogInformation("C# HTTP trigger function processed a request.");
    
                 var response = req.CreateResponse(HttpStatusCode.OK);
                 response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    
                 string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
                 response.WriteString(connectionString);
    
                 return response;
             }
    
  11. 忽略有关 null 值的警告。

  12. 查看生成的代码,该代码应包含以下内容(此代码返回 StorageConnectionString 环境变量的值):

    using System.Net;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Azure.Functions.Worker.Http;
    using Microsoft.Extensions.Logging;
    
    namespace func
    {
        public class FileParser
        {
            private readonly ILogger _logger;
    
            public FileParser(ILoggerFactory loggerFactory)
            {
                _logger = loggerFactory.CreateLogger<FileParser>();
            }
    
            [Function("FileParser")]
            public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
            {
                _logger.LogInformation("C# HTTP trigger function processed a request.");
    
                var response = req.CreateResponse(HttpStatusCode.OK);
                response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    
                string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
                response.WriteString(connectionString);
    
                return response;
            }
        }
    }
    
  13. 选择“保存”以保存对 FileParser.cs 文件的更改 。

任务 4:验证本地函数

  1. 在任务栏上,选择“终端”图标**

  2. 运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:

    cd F:\Allfiles\Labs\07\Starter\func
    
  3. 运行以下命令以运行函数应用项目:

    func start --build
    

    注意:可以查看文档以使用 Azure Functions Core Tools [在本地启动函数应用项目][azure-functions-core-tools-start-function]。

  4. 在实验室计算机上,启动“命令提示符”。

  5. 运行以下命令,针对 http://localhost:7071/api/FileParser 运行测试 ** GET **REST API 调用:

    curl -X GET -i http://localhost:7071/api/FileParser
    
  6. 查看作为 HTTP 请求结果返回的 StorageConnectionString 的 [TEST VALUE] 值 :

    HTTP/1.1 200 OK
    Content-Type: text/plain; charset=utf-8
    Date: Tue, 01 Sep 2020 23:35:39 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [TEST VALUE]
    
  7. 关闭“终端”应用程序所有当前正在运行的实例和“命令提示符”应用程序****。

任务 5:使用 Azure Functions Core Tools 部署函数

  1. 在任务栏上,选择“终端”图标**

  2. 运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:

    cd F:\Allfiles\Labs\07\Starter\func
    
  3. 运行以下命令以登录到 Azure 命令行接口 (CLI):

    az login
    
  4. 在 Microsoft Edge 浏览器窗口中,输入用于访问 Azure 订阅的帐户凭据,然后选择“登录”****。

  5. 返回到当前打开的“终端”窗口。** 请等待登录过程完成。

  6. 运行以下命令以发布函数应用项目(将 <function-app-name> 占位符替换为在本实验室前面创建的函数应用的名称):

    func azure functionapp publish <function-app-name> --dotnet-version 8.0
    

    注意:例如,如果函数应用名称为 securefuncstudent,那么命令将为 func azure functionapp publish securefuncstudent --force 。 可以查看文档以使用 Azure Functions Core Tools [发布本地函数应用项目][azure-functions-core-tools-publish-azure]。

  7. 等待部署完成后,再继续本实验室。

  8. 关闭当前正在运行的“终端”应用程序。**

任务 6:测试密钥保管库派生的应用程序设置

  1. 在任务栏上,选择 Microsoft Edge 图标,然后选择包含 Azure 门户的选项卡。

  2. 在 Azure 门户的导航窗格中,选择“资源组”链接。

  3. 在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。

  4. 在“ConfidentialStack”边栏选项卡上,选择“securefunc[yourname]”函数应用 。

  5. 在“函数应用”** 边栏选项卡上,选择“概述”** 选项。

  6. 在“概述”页底部的“函数”** 选项卡上,选择现有的 FileParser ** 函数。

  7. 在“函数”边栏选项卡中的“开发人员”部分,选择“代码 + 测试”选项 。

  8. 在函数编辑器中,选择“测试/运行”。

  9. 在自动显示的窗格中的“HTTP 方法”列表中,选择“GET”。

  10. 选择“运行”以测试函数。

  11. 查看运行测试的结果。 结果应为 Azure 存储连接字符串。

审阅

在本练习中,你使用了服务标识来读取存储在 Key Vault 中的机密值,并返回该值作为函数应用的结果。

练习 4:访问 Azure Blob 存储数据

任务 1:上传示例存储 blob

  1. 在 Azure 门户的导航窗格中,选择“资源组”链接。

  2. 在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。

  3. 在“ConfidentialStack”边栏选项卡中,选择“securestor[yourname]”存储帐户 。

  4. 在“存储帐户”边栏选项卡中,选择“数据存储”部分的“容器”链接。

  5. 在“容器”部分,选择“+ 容器” 。

  6. 在“新建容器”弹出窗口中,执行以下操作,然后选择“创建”:

    设置 操作
    “名称”文本框 输入“drop”
  7. 返回到“容器”部分,然后导航到新创建的“放置”容器中****。

  8. 在“容器”边栏选项卡中,选择“上传” 。

  9. 在“上传 blob”窗口中,执行以下操作,然后选择“上传” :

    设置 操作
    “文件”部分 选择“浏览文件”或使用拖放功能
    “文件资源管理器”窗口 浏览到 Allfiles (F):\Allfiles\Labs\07\Starter,选择 records.json 文件,然后选择“打开”
    “如果文件已存在,请覆盖”复选框 确保选中此复选框

    注意:等待 Blob 上传完成,然后再继续本实验室。

  10. 返回“容器”边栏选项卡,选择 Blob 列表中的“records.json”Blob 。

  11. 在“Blob”边栏选项卡上,找到 Blob 元数据,然后复制该 Blob 的 URL。

  12. 在任务栏上,激活“Microsoft Edge”的快捷菜单,然后选择“新建窗口”。

  13. 在新的浏览器窗口中,引用你为 Blob 复制的 URL。

  14. 现在应显示错误信息,指示不允许公众访问。

    注意:这是预期行为,因为还未启用 blob 的匿名访问。

任务 2:请求并配置用于 .NET 的 Azure SDK

  1. 在任务栏上,选择“终端”图标**

  2. 运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:

    cd F:\Allfiles\Labs\07\Starter\func
    
  3. 运行以下命令以添加来自 NuGet 的 Azure.Storage.Blobs 包 12.18.0 版本****:

    dotnet add package Azure.Storage.Blobs --version 12.18.0
    

    注意Azure.Storage.Blobs NuGet 包引用为 Azure Blob 存储编写代码所需的用于 .NET 的 Azure SDK 的子集。

  4. 关闭当前正在运行的“终端”应用程序。**

  5. 在“启动”屏幕上,选择“Visual Studio Code”磁贴 。

  6. 在“文件”** 菜单中,选择“打开文件夹”**。

  7. 在打开的“文件资源管理器”窗口中,浏览到 Allfiles (F):\Allfiles\Labs\07\Starter\func,然后选择“选择文件夹” 。

  8. 在“Visual Studio Code”窗口的“资源管理器”窗格中,打开 FileParser.cs 文件 。

  9. 为 Azure.Storage.Blobs 和 Azure.Storage.Blobs.Models 命名空间添加 using 指令****

    using Azure.Storage.Blobs;
    using Azure.Storage.Blobs.Models;
    
  10. 将以第 19 行开头的当前 FileParser 方法的内容替换为以下代码:

             [Function("FileParser")]
             public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
             {
                 _logger.LogInformation("C# HTTP trigger function processed a request.");
    
                 var response = req.CreateResponse(HttpStatusCode.OK);
    
                 string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
    
                 /* Create a new instance of the BlobClient class by passing in your
                    connectionString variable, a  "drop" string value, and a
                    "records.json" string value to the constructor */
                 BlobClient blob = new BlobClient(connectionString, "drop", "records.json");
    
                 // Download the content of the referenced blob 
                 BlobDownloadResult downloadResult = blob.DownloadContent();
    
                  // Retrieve the value of the downloaded blob and convert it to string
                 response.WriteString(downloadResult.Content.ToString());
                
                 //return the response
                 return response;
             }
    
  11. 忽略有关 null 值的警告。

  12. 查看生成的代码,该代码应包含以下内容(此代码返回从 StorageConnectionString 环境变量指定的存储帐户下载的 blob 的内容):

    namespace func
    {
        public class FileParser
        {
            private readonly ILogger _logger;
    
            public FileParser(ILoggerFactory loggerFactory)
            {
                _logger = loggerFactory.CreateLogger<FileParser>();
            }
    
            [Function("FileParser")]
            public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req)
            {
                _logger.LogInformation("C# HTTP trigger function processed a request.");
    
                var response = req.CreateResponse(HttpStatusCode.OK);
    
                string connectionString = Environment.GetEnvironmentVariable("StorageConnectionString");
    
                /* Create a new instance of the BlobClient class by passing in your
                   connectionString variable, a  "drop" string value, and a
                   "records.json" string value to the constructor */
                BlobClient blob = new BlobClient(connectionString, "drop", "records.json");
    
                // Download the content of the referenced blob 
                BlobDownloadResult downloadResult = blob.DownloadContent();
    
                 // Retrieve the value of the downloaded blob and convert it to string
                response.WriteString(downloadResult.Content.ToString());
                
                //return the response
                return response;
            }
        }
    }
    
  13. 选择“保存”以保存对 FileParser.cs 文件的更改 。

任务 3:部署和验证 Azure Functions 应用

  1. 在任务栏上,选择“终端”图标**

  2. 运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:

    cd F:\Allfiles\Labs\07\Starter\func
    
  3. 运行以下命令以登录到 Azure CLI:

    az login
    
  4. 在 Microsoft Edge 浏览器窗口中,输入 Microsoft 帐户的电子邮件地址和密码,然后选择“登录” 。

  5. 返回到当前打开的“终端”窗口。** 请等待登录过程完成。

  6. 再次运行以下命令以发布函数应用项目(将 <function-app-name> 占位符替换为在本实验室前面使用的函数应用的名称):

    func azure functionapp publish <function-app-name> --dotnet-version 8.0
    

    注意:例如,如果函数应用名称为 securefuncstudent,那么命令将为 func azure functionapp publish securefuncstudent 。 可以查看文档以使用 Azure Functions Core Tools [发布本地函数应用项目][azure-functions-core-tools-publish-azure]。

  7. 等待部署完成后,再继续本实验室。

  8. 关闭当前正在运行的“终端”应用程序。**

  9. 在任务栏上,选择 Microsoft Edge 图标,然后查看 Azure 门户。

  10. 在 Azure 门户的导航窗格中,选择“资源组”链接。

  11. 在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。

  12. 在“ConfidentialStack”边栏选项卡上,选择“securefunc[yourname]”函数应用 。

  13. 在“函数应用”** 边栏选项卡上,选择“概述”** 选项。

  14. 在“概述”页面的“函数”** 选项卡上,选择现有的 FileParser ** 函数。

  15. 在“函数”边栏选项卡中的“开发人员”部分,选择“代码 + 测试”选项 。

  16. 在函数编辑器中,选择“测试/运行”。

  17. 在自动显示的窗格中的“HTTP 方法”列表中,选择“GET”。

  18. 选择“运行”以测试函数。

  19. 查看运行测试的结果。 输出将包含存储在 Azure 存储帐户中的 $/drop/records.json Blob 的内容。

审阅

在本练习中,你使用了 C# 代码来访问存储帐户,然后下载了 Blob 的内容。