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

本文涉及的产品
文件存储 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 模拟目录,以便于更快的验证函数的行为。

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
4小时前
|
存储 Serverless 对象存储
通过FC运行脚本下载文件到OSS
本文介绍了在阿里云中使用函数计算服务(Function Compute)从URL下载文件并存储到OSS(Object Storage Service)的步骤。首先,需开通函数计算服务并创建RAM角色,授权函数计算访问OSS权限。费用详情参考官方计费概述。操作步骤包括:登录OSS控制台,使用公共模板创建执行,配置参数并运行Python脚本,脚本负责从URL下载文件并上传至指定OSS Bucket。执行成功后,文件将出现在目标OSS Bucket中。
26 0
|
4小时前
|
运维 负载均衡 Java
Serverless 应用引擎产品使用之在阿里函数计算中,创建了个关于 stable diffusion 的函数服务,总是很卡如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
165 0
|
4小时前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里云函数计算中,容器运行过程中的最大内存使用量获取如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
35 2
|
4小时前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里函数计算中,“允许函数默认网卡访问公网” 参数配置如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
34 6
|
4小时前
|
运维 JavaScript Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,Php环境,配置取消禁止函数exec如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
38 4
|
4小时前
|
存储 缓存 运维
Serverless 应用引擎产品使用之在阿里函数计算中,我的函数会运行很久,超过函数最大 执行时间如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
30 1
|
4小时前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里云Serverless中将已有的域名绑定到FC函数上如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
30 1
|
4小时前
|
运维 Serverless 开发工具
Serverless 应用引擎产品使用之阿里云函数计算中在哪里可以找到函数入口设置的类如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
21 1
|
4小时前
|
运维 Serverless 应用服务中间件
Serverless 应用引擎产品使用之在阿里云Serverless中函数计算FC nginx 部署上去之后放置静态页面如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
243 0
|
4小时前
|
弹性计算 运维 Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
1018 0
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决