开发函数计算的正确姿势 —— 本地运行、调试、发布 NAS 函数

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
函数计算FC,每月15万CU 3个月
文件存储 NAS,50GB 3个月
简介: ## 前言 首先介绍下在本文出现的几个比较重要的概念: > __函数计算(Function Compute)__: 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 [参考](https://help.aliyun.com/

前言

首先介绍下在本文出现的几个比较重要的概念:

__函数计算(Function Compute)__: 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 参考

__Fun__: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考

__Fun Local__: Fun Local 作为 Fun 的一个子命令存在,可以直接通过 fun local 命令使用。Fun Local 工具可以将函数计算中的函数在本地完全模拟运行,并提供单步调试的功能,旨在弥补函数计算相对于传统应用开发体验上的短板,并为用户提供一种解决函数计算问题排查的新途径。

在本文,我们会介绍本地调试运行配置了 NAS 的函数。更多文章请参考:《开发函数计算的正确姿势》 系列。

备注: 本文介绍的技巧需要 Fun 版本大于等于 2.8.0。

NAS 规范的定义可以参考

为函数计算配置 Nas 服务

首先,我们假定您首先按照官方教程描述的,已经开通并创建好了 Nas 服务。

然后在 template.yml 中添加如下配置即可( nas 的规范定义请参考):

NasConfig: 
  UserId: -1
  GroupId: -1
  MountPoints: 
    - ServerAddr: '012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com:/'
      MountDir: '/mnt/test'

上面配置表示将 nas 远程目录挂载到函数计算的 /mnt/test 下。UserId、GroupId 为 -1 表示的是由系统随机分配 uid 以及 gid。

本地运行

事件触发的方式运行

事件触发运行 nas 函数的示例代码可以参考

其中 template 描述内容为:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  nasDemo:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: 'fc nas test'
      Policies: 
        - AliyunECSNetworkInterfaceManagementAccess
      VpcConfig:
        VpcId: 'vpc-bp12hm92gdpcjtai7ua82'
        VSwitchIds: [ 'vsw-bp1gitru7oicyyb4uiylj' ]
        SecurityGroupId: 'sg-bp1243pi65bw4cjj4bks'
      NasConfig: 
        UserId: -1
        GroupId: -1
        MountPoints: 
          - ServerAddr: '012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com:/'
            MountDir: '/mnt/test'

    readNas:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: read.handler
        Runtime: nodejs8
        CodeUri: './read.js'
        Timeout: 100
        EnvironmentVariables:
          ROOT_DIR: /mnt/test

    writeNas:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: write.handler
        Runtime: python2.7
        CodeUri: './write.py'
        Timeout: 100
        EnvironmentVariables:
          ROOT_DIR: /mnt/test

可以看到,在 template.yml 中描述了一个服务,以及两个函数,并且服务配置了 VPC、NAS。

事件触发运行配置了 nas 的函数的方法很简单,可以直接使用 fun local invoke 运行。

以下是一个本地事件触发运行该 nas demo 的动态演示:

Http Trigger 的方式运行

Http Trigger 触发运行 nas 函数的示例代码可以参考

其中 template 描述内容为:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  nasHttpDemo:
    Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: 'fc nas test'
      Policies: 
        - AliyunECSNetworkInterfaceManagementAccess
      VpcConfig:
        VpcId: 'vpc-bp12hm92gdpcjtai7ua82'
        VSwitchIds: [ 'vsw-bp1gitru7oicyyb4uiylj' ]
        SecurityGroupId: 'sg-bp1243pi65bw4cjj4bks'
      NasConfig: 
        UserId: -1
        GroupId: -1
        MountPoints: 
          - ServerAddr: '012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com:/'
            MountDir: '/mnt/test'

    readNas:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: read.handler
        Runtime: nodejs8
        CodeUri: './read.js'
        Timeout: 100
        EnvironmentVariables:
          ROOT_DIR: /mnt/test
      Events:
        http-test: # trigger name
          Type: HTTP # http trigger
          Properties:
              AuthType: ANONYMOUS
              Methods: ['GET', 'POST', 'PUT']

    writeNas:
      Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: write.handler
        Runtime: python3
        CodeUri: './write.py'
        Timeout: 100
        EnvironmentVariables:
          ROOT_DIR: /mnt/test
      Events:
        http-test: # trigger name
          Type: HTTP # http trigger
          Properties:
              AuthType: ANONYMOUS
              Methods: ['GET', 'POST', 'PUT']

可以看到,在 template.yml 中描述了一个名为 nasHttpDemo 的服务,以及两个分别叫做 readNas、writeNas 的函数,并且服务配置了 VPC、NAS。这两个函数的 runtime 分别为 nodejs8、python2.7,并且都配置了 Http Trigger 触发器。

Http Trigger 的方式触发运行函数也很简单,可以直接在项目下使用 fun local start 运行,fun local 会自动识别到这两个函数配置了 Http Trigger,以及配置了 nas 服务,并会根据配置挂载相应的目录给函数使用。

以下是一个 Http Trigger 触发运行该 nas http demo 的动态演示:

Api 的方式运行

Api 触发配置了 Nas 的函数运行的方法与 Http Trigger 类似,只需要使用 fun local start,当函数没有配置 Http Trigger 时,会被自动注册为 api。将提示的 url 配置到 sdk 中并编写相关代码即可完成调用。

本地调试

本地调试的方法与事件触发函数、Http Trigger 触发函数、Api 触发函数的方法一致,更多信息参考

发布

无论是什么类型的 nas 函数,发布只需要通过 fun deploy 即可。

对于事件触发的函数,发布日志如下:

事件触发的函数发布成功,即可通过函数计算控制台、fcli、api 等方式进行调用。

对于 Http Trigger 触发的函数,发布日志如下:

打开日志中的 url,即可完成相应函数的调用。

本地模拟 Nas 原理介绍

fun local 本地模拟函数运行前,会首先扫描 template 中的配置,如果检测到包含 nas 配置,则会首先在本地创建一个目录,用来模拟 nas 服务的挂载点,并挂载到函数所在的容器,当函数运行时,就可以访问到该目录。

fun local 创建的 nas 模拟目录位置为:.fun/nas/{ServerAddr}

比如,对于我们上面的例子,nas 模拟目录为 .fun/nas/012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com

知道该规则后,就可以为函数运行做一些准备工作。比如当函数运行依赖一些资源时,比如机器学习模型、数据文件、php 代码等,可以提前将资源复制到 nas 模拟目录,以便于更快的验证函数的行为。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
3月前
|
消息中间件 缓存 监控
在FaaS中,如何设计无状态的函数来确保数据处理的一致性?
在FaaS中,如何设计无状态的函数来确保数据处理的一致性?
|
2月前
|
监控 Serverless 云计算
探索Serverless架构:开发实践与优化策略
本文深入探讨了Serverless架构的核心概念、开发实践及优化策略。Serverless让开发者无需管理服务器即可运行代码,具有成本效益、高可扩展性和提升开发效率等优势。文章还详细介绍了函数设计、安全性、监控及性能和成本优化的最佳实践。
|
3月前
|
机器学习/深度学习 监控 物联网
函数即服务(FaaS)
函数即服务(FaaS)
132 6
|
2月前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
99 1
|
3月前
|
监控 Serverless 云计算
探索Serverless架构:开发的未来趋势
【10月更文挑战第5天】Serverless架构,即无服务器架构,正逐渐成为云计算领域的热点。它允许开发者构建和运行应用程序而无需管理底层服务器。本文介绍了Serverless架构的基本概念、核心优势及挑战,并展示了其在事件驱动编程、微服务架构和数据流处理等场景中的应用。通过优化冷启动、使用外部存储等实战技巧,开发者可以更好地利用Serverless架构提升开发效率和应用性能。随着技术的成熟,Serverless将在未来软件开发中扮演重要角色。
|
5月前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
81 0
|
存储 运维 监控
阿里云的文件存储NAS使用心得
阿里云的文件存储NAS使用心得
407 0
|
运维 文件存储 对象存储
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(三)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(三)
341 0
|
存储 机器学习/深度学习 弹性计算
阿里云文件存储NAS简介和购买流程
阿里云文件存储NAS是一个可共享访问,弹性扩展,高可靠,高性能的分布式文件系统。兼容POSIX文件接口,可支持上千台弹性计算ECS、容器服务ACK等计算节点共享访问,您无需修改应用程序,即可无缝迁移业务系统上云。 支持智能冷热数据分层,有效降低数据存储成本。广泛应用于企业级应用数据共享、容器、AI机器学习、Web 服务和内容管理、应用程序开发和测试、媒体和娱乐工作流、数据库备份等场景。
|
存储 运维 数据安全/隐私保护
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(四)
【运维知识进阶篇】用阿里云部署kod可道云网盘(配置Redis+MySQL+NAS+OSS)(四)
333 0

热门文章

最新文章