实验室 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 门户
-
在任务栏上,选择 Microsoft Edge 图标。
-
在打开的浏览器窗口中,浏览到 Azure 门户 (
https://portal.azure.com
),然后使用你将用于此实验室的帐户登录。注意:第一次登录 Azure 门户时,你会看到一个门户教程。 选择“开始使用”,以跳过导览并开始使用门户。
任务 2:创建存储帐户
-
在 Azure 门户中,使用“搜索资源、服务和文档”文本框搜索“存储帐户”,然后在结果列表中选择“存储帐户” 。
-
在“存储帐户”边栏选项卡上,选择“+ 创建”。 **
-
在“创建存储帐户”边栏选项卡的“基本信息”选项卡上,执行以下操作,然后选择“查看” :
设置 操作 “订阅”下拉列表 保留默认值 “资源组”部分 选择“新建”,输入“ConfidentialStack”,然后选择“确定” “存储帐户名称”文本框 输入“securestor[yourname]” “区域”下拉列表 选择“(US)美国东部” 主服务** 无更改 “性能”部分 选择“标准”选项 “冗余”下拉列表 选择“本地冗余存储(LRS)” 以下屏幕截图显示了“创建存储帐户”边栏选项卡上配置的设置。
-
在“查看”选项卡中,查看在上述步骤中选择的选项。
-
选择“创建”,使用指定的配置创建存储帐户。
注意:等待创建任务完成,再继续本实验室。
-
在“部署概述”边栏选项卡上,选择“转到资源” 。
-
在“存储帐户”边栏选项卡上的“安全 + 网络”部分中,选择“访问密钥”链接。 ** ** **
-
在“访问密钥”部分中,选择“显示密钥”。 **
-
在“访问密钥” 边栏选项卡上,查看任一“连接字符串”(使用“显示”按钮),然后在记事本中记录任一“连接字符串” 框的值 ******。 **密钥 是平台管理的加密密钥,不 用于此实验室。
注意:你选择哪个连接字符串无关紧要。 它们是可互换的。
任务 3:创建 Azure 密钥保管库
-
在 Azure 门户中,使用“搜索资源、服务和文档”文本框搜索“密钥保管库”,然后在结果列表中选择“密钥保管库” 。
-
在“密钥保管库”边栏选项卡上,选择“创建” 。
-
在“创建密钥保管库”边栏选项卡的“基本信息”选项卡上,执行以下操作,然后选择“下一步”以转到“访问配置”选项卡******:
设置 操作 “订阅”下拉列表 保留默认值 “资源组”下拉列表 在列表中选择“ConfidentialStack” “密钥保管库名称”文本框 输入“securevault[yourname]” “区域”下拉列表 选择“美国东部” “定价层”下拉列表 选择“标准” 以下屏幕截图显示了“创建密钥保管库”边栏选项卡上配置的设置。
-
在“访问配置”选项卡上,将权限模型更改为“保管库访问策略”,然后选择“查看 + 创建”****。
-
在“查看 + 创建”选项卡中,查看在上述步骤中选择的选项。
-
选择“创建”,使用指定的配置创建密钥保管库。
注意:等待创建任务完成,再继续本实验室。
任务 4:创建函数应用
-
在 Azure 门户中,使用“搜索资源、服务和文档”文本框搜索“函数应用”,然后在结果列表中选择“函数应用” 。
-
在“函数应用”边栏选项卡中,选择“创建” 。
-
在“选择托管选项”页面,确保选择“消耗”,然后单击“选择”。
-
在“创建函数应用(消耗)”边栏选项卡的“基本信息”选项卡上,执行以下操作,然后选择“下一步:存储”:
设置 操作 “订阅”下拉列表 保留默认值 “资源组”下拉列表 选择“ConfidentialStack” “函数应用名称”文本框 输入“securefunc[yourname]” “运行时堆栈”下拉列表 选择“.NET” “版本”下拉列表 选择“8(LTS),独立辅助角色模型”** “区域”下拉列表 选择“美国东部”区域 “操作系统”部分 选择“Linux” 以下屏幕截图显示了“创建函数应用”边栏选项卡上配置的设置。
-
在“存储”选项卡上,执行以下操作,然后选择“查看 + 创建”:
设置 操作 “存储帐户”下拉列表 选择“securestor[yourname]”存储帐户 -
在“查看 + 创建”选项卡中,查看在上述步骤中选择的选项。
-
选择“创建”,使用指定的配置创建函数应用。
注意:等待创建任务完成,再继续本实验室。
审阅
在本练习中,你创建了本实验室所需的全部资源。
练习 2:配置机密和标识
任务 1:配置系统分配的托管服务标识
-
在 Azure 门户的导航窗格中,选择“资源组”链接。
-
在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。
-
在“ConfidentialStack”边栏选项卡上,选择“securefunc[yourname]”函数应用 。
注意:将有两项资源,即函数应用资源和应用程序见解资源,两者的名称相同。 确保选择函数应用资源。
-
在“函数应用”边栏选项卡上,从“设置”部分选择“标识”选项 。
-
在“标识”窗格的“系统分配”选项卡上,将“状态”设置为“开启”,然后选择“保存” 。
-
选择“是”确认设置。
注意:等待系统分配的托管标识创建完成后再继续本实验。
任务 2:创建密钥保管库机密
-
在 Azure 门户的“导航”窗格中,选择“资源组”链接。
-
在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。
-
在“ConfidentialStack”边栏选项卡上,选择“securevault[yourname]”密钥保管库 。
-
在“密钥保管库”边栏选项卡上,选择“对象”部分中的“机密”链接 。
-
在“机密”窗格中,选择“+ 生成/导入” 。
-
在“创建机密”边栏选项卡上,执行以下操作,然后选择“创建” :
设置 操作 “上传选项”下拉列表 选择“手动” “名称”文本框 输入“storagecredentials” “机密值”** 文本框 输入之前在此实验室中记录的存储帐户连接字符串 “内容类型”文本框 留空 “设置激活日期”复选框 未选定 “设置到期日期”复选框 未选定 “启用”选项 选择“是” 以下屏幕截图显示了“创建机密”边栏选项卡上配置的设置。
注意:等待机密创建完成后再继续本实验。
-
返回“机密”窗格,选择列表中的“storagecredentials”项 。
-
在“版本”窗格中,选择“storagecredentials”机密的最新版本 。
-
在“机密版本”窗格中,执行以下操作:
-
选择“显示机密值”,可以找到机密的值。
-
记录“机密标识符”文本框的值,因为你稍后将在本实验室中使用该值。
注意:你将记录“机密标识符”文本框中的值,而不是“机密值”文本框中的值 。
-
任务 3:配置密钥保管库访问策略
-
在 Azure 门户的导航窗格中,选择“资源组”链接。
-
在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。
-
在“ConfidentialStack”边栏选项卡上,选择“securevault[yourname]”密钥保管库 。
-
在“密钥保管库”边栏选项卡中,选择“概览”部分中的“访问策略”链接 。
-
在“访问策略”窗格中,选择“+ 创建” 。
-
在“创建访问策略”边栏选项卡上的“权限”部分,进行以下选择****:
设置 操作 “从模板配置”下拉列表 留空 “密钥权限”复选框 已选择 0 “机密权限”复选框 选择“GET”权限 “证书权限”复选框 已选择 0 -
选择“主体”** 部分并做出以下选择:
设置 操作 “选择主体”链接 找到并选择名为“securefunc[yourname]”的服务主体。 之前在本实验室中创建的系统分配的托管标识将与 Azure 函数资源同名 -
选择“查看 + 创建”**,然后选择“创建”**。
注意:等待访问策略更改保存后再继续本实验室。
任务 4:创建密钥保管库派生的应用程序设置
-
在 Azure 门户的导航窗格中,选择“资源组”链接。
-
在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。
-
在“ConfidentialStack”边栏选项卡上,选择“securefunc[yourname]”函数应用 。
-
在“函数应用”边栏选项卡上的“设置”部分,选择“环境变量”链接****。
-
在“应用设置”选项卡中,选择“+ 添加”**。 在“添加/编辑应用程序设置”弹出对话框中输入以下信息**:
设置 操作 “名称”文本框 输入 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)
。 -
选择“应用”关闭弹出对话框并返回“应用设置”部分****。
-
在“应用设置”部分底部,选择“应用”****。
注意: 更新应用设置时,你可能会收到一条警告,指出应用可能会重启。 选择“确认”。 等待应用程序设置保存后再继续本实验室。
审阅
在本练习中,你为函数应用创建了系统分配的托管服务标识,然后为该标识提供了相应的权限,以获取密钥保管库中的机密值。 最后,你创建了函数应用的配置设置中所引用的机密。
练习 3:生成 Azure Functions 应用
任务 1:初始化函数项目
-
在任务栏上,选择“终端”图标**。
-
运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:
cd F:\Allfiles\Labs\07\Starter\func
注意:在 Windows 资源管理器中,从 F:\Allfiles\Labs\07\Starter\func.gitignore 文件中删除只读属性。
-
运行以下命令以使用 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]。
-
运行以下命令以生成 .NET 8 项目**:
dotnet build
任务 2:创建 HTTP 触发的函数
-
运行以下命令以使用 Azure Functions Core Tools 通过 HTTP 触发器模板新建一个名为 FileParser 的函数 :
func new --template "HTTP trigger" --name "FileParser"
注意:可以查看文档以使用 Azure Functions Core Tools [创建新函数][azure-functions-core-tools-new-function]。
-
关闭当前正在运行的“终端”应用程序。**
任务 3:配置和读取应用程序设置
-
在“启动”屏幕上,选择“Visual Studio Code”磁贴 。
-
在“文件”** 菜单中,选择“打开文件夹”**。
-
在打开的“文件资源管理器”窗口中,浏览到 Allfiles (F):\Allfiles\Labs\07\Starter\func,然后选择“选择文件夹” 。
-
在 Visual Studio Code 窗口的“资源管理器”窗格中,打开 local.settings.json 文件 。
-
请注意 Values 对象的当前值:
"Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" }
-
通过添加名为“StorageConnectionString”的新设置并将其设置为“[TEST VALUE]”的字符串值来更新“Values”对象的值 :
"Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "StorageConnectionString": "[TEST VALUE]" }
-
Local.settings.json 文件现应包括:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "StorageConnectionString": "[TEST VALUE]" } }
-
选择“保存”,将所做的更改保存到 local.settings.json 文件中 。
-
在“Visual Studio Code”窗口的“资源管理器”窗格中,打开 FileParser.cs 文件 。
-
在代码编辑器中,将自动生成的 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; }
-
忽略有关 null 值的警告。
-
查看生成的代码,该代码应包含以下内容(此代码返回 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; } } }
-
选择“保存”以保存对 FileParser.cs 文件的更改 。
任务 4:验证本地函数
-
在任务栏上,选择“终端”图标**。
-
运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:
cd F:\Allfiles\Labs\07\Starter\func
-
运行以下命令以运行函数应用项目:
func start --build
注意:可以查看文档以使用 Azure Functions Core Tools [在本地启动函数应用项目][azure-functions-core-tools-start-function]。
-
在实验室计算机上,启动“命令提示符”。
-
运行以下命令,针对
http://localhost:7071/api/FileParser
运行测试 ** GET **REST API 调用:curl -X GET -i http://localhost:7071/api/FileParser
-
查看作为 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]
-
关闭“终端”应用程序所有当前正在运行的实例和“命令提示符”应用程序****。
任务 5:使用 Azure Functions Core Tools 部署函数
-
在任务栏上,选择“终端”图标**。
-
运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:
cd F:\Allfiles\Labs\07\Starter\func
-
运行以下命令以登录到 Azure 命令行接口 (CLI):
az login
-
在 Microsoft Edge 浏览器窗口中,输入用于访问 Azure 订阅的帐户凭据,然后选择“登录”****。
-
返回到当前打开的“终端”窗口。** 请等待登录过程完成。
-
运行以下命令以发布函数应用项目(将
<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]。 -
等待部署完成后,再继续本实验室。
-
关闭当前正在运行的“终端”应用程序。**
任务 6:测试密钥保管库派生的应用程序设置
-
在任务栏上,选择 Microsoft Edge 图标,然后选择包含 Azure 门户的选项卡。
-
在 Azure 门户的导航窗格中,选择“资源组”链接。
-
在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。
-
在“ConfidentialStack”边栏选项卡上,选择“securefunc[yourname]”函数应用 。
-
在“函数应用”** 边栏选项卡上,选择“概述”** 选项。
-
在“概述”页底部的“函数”** 选项卡上,选择现有的 FileParser ** 函数。
-
在“函数”边栏选项卡中的“开发人员”部分,选择“代码 + 测试”选项 。
-
在函数编辑器中,选择“测试/运行”。
-
在自动显示的窗格中的“HTTP 方法”列表中,选择“GET”。
-
选择“运行”以测试函数。
-
查看运行测试的结果。 结果应为 Azure 存储连接字符串。
审阅
在本练习中,你使用了服务标识来读取存储在 Key Vault 中的机密值,并返回该值作为函数应用的结果。
练习 4:访问 Azure Blob 存储数据
任务 1:上传示例存储 blob
-
在 Azure 门户的导航窗格中,选择“资源组”链接。
-
在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。
-
在“ConfidentialStack”边栏选项卡中,选择“securestor[yourname]”存储帐户 。
-
在“存储帐户”边栏选项卡中,选择“数据存储”部分的“容器”链接。
-
在“容器”部分,选择“+ 容器” 。
-
在“新建容器”弹出窗口中,执行以下操作,然后选择“创建”:
设置 操作 “名称”文本框 输入“drop” -
返回到“容器”部分,然后导航到新创建的“放置”容器中****。
-
在“容器”边栏选项卡中,选择“上传” 。
-
在“上传 blob”窗口中,执行以下操作,然后选择“上传” :
设置 操作 “文件”部分 选择“浏览文件”或使用拖放功能 “文件资源管理器”窗口 浏览到 Allfiles (F):\Allfiles\Labs\07\Starter,选择 records.json 文件,然后选择“打开” “如果文件已存在,请覆盖”复选框 确保选中此复选框 注意:等待 Blob 上传完成,然后再继续本实验室。
-
返回“容器”边栏选项卡,选择 Blob 列表中的“records.json”Blob 。
-
在“Blob”边栏选项卡上,找到 Blob 元数据,然后复制该 Blob 的 URL。
-
在任务栏上,激活“Microsoft Edge”的快捷菜单,然后选择“新建窗口”。
-
在新的浏览器窗口中,引用你为 Blob 复制的 URL。
-
现在应显示错误信息,指示不允许公众访问。
注意:这是预期行为,因为还未启用 blob 的匿名访问。
任务 2:请求并配置用于 .NET 的 Azure SDK
-
在任务栏上,选择“终端”图标**。
-
运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:
cd F:\Allfiles\Labs\07\Starter\func
-
运行以下命令以添加来自 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 的子集。
-
关闭当前正在运行的“终端”应用程序。**
-
在“启动”屏幕上,选择“Visual Studio Code”磁贴 。
-
在“文件”** 菜单中,选择“打开文件夹”**。
-
在打开的“文件资源管理器”窗口中,浏览到 Allfiles (F):\Allfiles\Labs\07\Starter\func,然后选择“选择文件夹” 。
-
在“Visual Studio Code”窗口的“资源管理器”窗格中,打开 FileParser.cs 文件 。
-
为 Azure.Storage.Blobs 和 Azure.Storage.Blobs.Models 命名空间添加 using 指令****:
using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models;
-
将以第 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; }
-
忽略有关 null 值的警告。
-
查看生成的代码,该代码应包含以下内容(此代码返回从 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; } } }
-
选择“保存”以保存对 FileParser.cs 文件的更改 。
任务 3:部署和验证 Azure Functions 应用
-
在任务栏上,选择“终端”图标**。
-
运行以下命令,将当前目录更改为 Allfiles (F):\Allfiles\Labs\07\Starter\func 空目录:
cd F:\Allfiles\Labs\07\Starter\func
-
运行以下命令以登录到 Azure CLI:
az login
-
在 Microsoft Edge 浏览器窗口中,输入 Microsoft 帐户的电子邮件地址和密码,然后选择“登录” 。
-
返回到当前打开的“终端”窗口。** 请等待登录过程完成。
-
再次运行以下命令以发布函数应用项目(将
<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]。 -
等待部署完成后,再继续本实验室。
-
关闭当前正在运行的“终端”应用程序。**
-
在任务栏上,选择 Microsoft Edge 图标,然后查看 Azure 门户。
-
在 Azure 门户的导航窗格中,选择“资源组”链接。
-
在“资源组”边栏选项卡上,选择“ConfidentialStack”资源组 。
-
在“ConfidentialStack”边栏选项卡上,选择“securefunc[yourname]”函数应用 。
-
在“函数应用”** 边栏选项卡上,选择“概述”** 选项。
-
在“概述”页面的“函数”** 选项卡上,选择现有的 FileParser ** 函数。
-
在“函数”边栏选项卡中的“开发人员”部分,选择“代码 + 测试”选项 。
-
在函数编辑器中,选择“测试/运行”。
-
在自动显示的窗格中的“HTTP 方法”列表中,选择“GET”。
-
选择“运行”以测试函数。
-
查看运行测试的结果。 输出将包含存储在 Azure 存储帐户中的 $/drop/records.json Blob 的内容。
审阅
在本练习中,你使用了 C# 代码来访问存储帐户,然后下载了 Blob 的内容。