技术博客:Azure Functions + Azure Storage 开发

时间:2022-08-19 19:50:49

Azure

GitHub wiki 同步发布 传送门

Azure Functions

通过 Functions(一个事件驱动型无服务器计算平台,还可以解决复杂的业务流程问题)更加高效地进行开发。在本地构建和调试,而无需额外的设置,在云中大规模部署和操作,并使用触发器和绑定集成服务。

——Azure Functions

Azure Storage

Azure 存储平台是适用于新式数据存储方案的 Microsoft 云存储解决方案。 核心存储服务为数据对象、适用于 Azure 虚拟机(Vm)的磁盘存储、适用于云的文件系统服务、用于可靠消息传送的消息存储和 NoSQL 存储提供高度可缩放的对象存储。

——Azure Storage

注:想要使用Azure,必须有visa卡才可以注册成功!

python开发Http服务

Azure Functions提供了Http触发器,在接收到Http请求的时候函数就会被触发执行。

Azure Python开发的好处是不需要自己解析Request的Header、body等等,可以通过Azure Functions现成的接口来获取需要的数据。

目前Azure Functions的开发支持VS Code和VS Studio,笔者愿意使用轻量级的编辑器,所以选择了VS Code开发,不过VS Studio应该差不了太多的。

似乎还有一个CLI版本,但是因为笔者不熟悉,感兴趣的可以自行探索——传送门

接下来用一个例子介绍:

喜欢英文可以直接阅读参考文档

环境配置

  • Azure account: 使用visa卡注册,可以获得一年的免费使用权(一定程度上的,你懂的)以及价值200$的为期一个月的白嫖券
  • Node.js: Windows下npm需要——下载
  • Python 3.8,Python 3.7,Python 3.6均可。但是笔者强烈建议使用Python 3.6,笔者在开发期间遇到了各种无法调试的Bug,原因大概是因为pylint以及python版本导致的谜之BUG,但是换成了3.6后暂时清爽。不过如果你使用较高版本没有问题,那么说明BUG已经被修复了,自然是最好的
  • VS Code
  • VS Code的Python extension插件
  • VS Code的Azure Functions extension插件
  • VS Code的Azure Storage extension插件 (仅限需要使用Azure Storage)
  • Azure Storage Explorer (仅限需要使用Azure Storage)

可以看到需要配置的环境还是很多的,VS Studio可能就省心很多了,下载对应的包就可以

1. 创建项目

在VS Code的左边栏会有Azure的标志,点击即可创建,第一次需要登录Azure account

创建过程有很多选择:

  • 语言——笔者选择 Python
  • 选择Python解释器: 这个解释器用来创建项目的虚环境 **.venv** ,这里需要注意的是,Python解释器的版本决定虚环境Python的版本
  • 选择模板——这里选择 Http trigger
  • 给函数命名
  • 认证级别——选择 Anonymous (匿名)即可
  • 选择怎么打开项目——选择 Add to workspace 添加到工作区

2. 在本地运行

  • F5 运行

  • 运行成功会会出现下面的图片

    技术博客:Azure Functions + Azure Storage 开发
  • 使用浏览器访问链接即可

3. 把代码推送到Azure上

在VS Code的Azure插件处登录,然后点击部署按钮:

技术博客:Azure Functions + Azure Storage 开发

在VS Code出现的提示中选择:

  • 选择推送代码的文件夹
  • 选择Azure Storage的订阅(需要先申请一个订阅)
  • 选择Azure的Functions App,这里点击 + create new Function App
  • 给Functions App起名字
  • 选择运行时版本——云端运行代码版本,应与你开发代码的Python版本一致
  • 选择部署的地区——这里直接选择东亚 East Aisa

等待部署成功后,点击view output即可看到云端部署的代码的链接,使用浏览器就可以访问函数!

技术博客:Azure Functions + Azure Storage 开发

4. Azure portal

代码部署后,可以通过Azure Portal来查看并且监视函数的运行情况,通常也可以用来进行DeBug。

注:代码部署后,如果出现浏览器无法访问,是因为Azure 环境没有对外部链接开放认证,在portal中自己的Functions App下的 CORS 下配置允许访问的来源即可,一个常用的配置是直接置为 *:

技术博客:Azure Functions + Azure Storage 开发

Azure Storage使用

Azure Functions的功能从某种意义上说很强大,但是同时也有一定的不方便性。如果想要在函数中操作文件等必须借助Azure Storage,因此下面简单介绍一下

这里还有一个坑,笔者在后面会详细说明

Azure Storage是一个存储的云服务,通过订阅可以很方便的上传和下载文档。其中存储对象分为四个类别:容器、共享文件、表、队列。

每一个都有较为有趣的用法,大家可以自行探索一下,笔者只尝试过容器和队列,下面介绍一下:

队列

上面我们简单说过Azure Functions的Http trigger是一个触发器,在接收到Http请求的时候会执行函数。这里可以给函数绑定一个 队列 ,每一次函数触发执行时,都可以选择一部分信息传递给 队列 ,可以用来记录一些信息,常常是log信息。

当然,也可以在输入绑定一个 队列 ,在函数每一次被触发时,从Storage给函数一个固定的文件当作函数输入,用来固定读取某些必须的文件信息。

参考文档2

容器

容器可以保存二进制文件,是主要的存储工具。容器的下一层是Blob,分为三种Block Blob、Page Blob、Append Blob,这里主要说明Block Blob。

Azure Storage提供各种接口来上传和下载Blob,可以通过各种组合实现想要的逻辑,从笔者的使用感受来说,基本满足需求,但是有一些别扭倒是真的,可能也是微软独特的设计,笔者体会不太到。

因为最近一两天微软更新了 azure-storage-blob 的Python包的版本,而且禁止了之前旧版本的下载,同时API全部换了一套(导致笔者得重构,真)。

这里面最令笔者不理解的就是新版本对于Blob覆盖竟然没有支持,需要自己手动先删除再上传(还要注意文件不存在的异常),总之就是设计的很迷,不过上传和下载就到大大简化,而且类似Python的文件操作,比较容易上手。

踩坑日记

1. VS Code卡死

4月份使用的时候,Azure Core插件有很严重的Bug,在使用VS Code的调试功能时经常会卡死,往往是调试一次卡一次,体验极差,不过最近更新的版本好像解决了这一问题,笔者目前只遇到过一两次,体验渐佳!

2. VS Code更新导致Azure Functions插件的Json文件丢失而调试失败

Azure Functions在本地运行时需要加载远程的配置信息,所以Json文件的丢失导致找不到然后去更新插件,可能因为笔者网络不好,每一次都失败。

但是即使等待很长时间下载后安装也出现了问题。

这个问题,笔者的解决方案是,手动下载插件,把里面的Json文件备份,每一次VS Code更新都把Json文件复制到对应的位置,比较蠢的办法,但是好用。在Google也没有找到类似的解决办法,所以就凑活着用了。

3. 代码提醒

pylint真是个弟弟,哦,或许是他和VS Code在一起的时候是个弟弟,也或许是Azure Functions的原因

虽然因为Python语言本身的属性原因导致很多错误不会提醒,但是和pycharm的那种体验是不可比拟的。

同时Azure Functions独特的文件结构,在python中导入模块时是这样子的

文件结构

from . import example #(explicit relative)
from ..shared_code import my_first_helper_function #(explicit relative)

以上会被pylint认为是错误的,但是其实在azure环境下可以处理。

所以,强迫症玩家请卸载pylint,虽然不建议就是了,因为忽略掉这些问题,pylint还是有一点点的作用的。也可能是笔者用不来吧。

4. 套接字问题

本地调试的时候下载storage文件,第二次会因为套接字被使用而直接中断,只能够重新调试。而且,每次下载后关闭调试后,得等一会才可以继续调试,否则也会出现套接字重用。

笔者分析这一问题时因为本地调试的时候配置的环境只有一个套接字(但是总感觉不应该)然后导致第二次就错误。

5. 版本更新

猝不及防,以至于突然重构,但是笔者也认识到,开发过程中需要对自己使用的主要模块进行关注,注意其更新动向,这样在一定程度上可以避免这种问题。

吐槽

  • Google上的文档和相关参考较少,而且因为时效性的问题也往往无法解决问题
  • 微软官方的文档也是气人
  • 最新版的 azure-storage-blob 在python中甚至很多函数没有注释,得点进去自己看怎么用参数,属实

总之笔者已经被折磨的能用就行,不求甚解了!

望后来人不要轻易尝试,如果不可避免要入坑,那么希望这篇博客有一些作用吧(只求微软不会再次更新版本!)