开发函数计算的正确姿势 —— Fun validate 语法校验排错指南

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 1. 前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。

1. 前言

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

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

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

template.yml: template.yml 用于定义 serverless 应用的模型。无论是使用 fun local 还是 fun deploy 等功能,都是通过解析 tempalte.yml 的内容,构建出用户定义的云资源模型,进而实现本地云资源的运行调试以及发布等功能。template.yml 支持的规范文档可以参考

template.yml 所描述的 Serverless 模型,是 Fun 所有功能的基石。template.yml 的正确性对后续能够顺利使用 Fun 的各项功能无疑是非常关键的。为了帮助用户更快速的修正 template.yml 中错误的描述,我们在 Fun 2.14.0 优化了语法校验的错误信息,可以达到更精准定位报错并修复的目的。

下面我们就通过一个示例,学习如何根据报错信息纠正 template.yml 中的错误语法描述。

备注:请确保 Fun 工具版本在 2.14.0+

2. 错误的 template.yml 示例


ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  local-http-demo:
    Type: 'Aliyun::Serverless::InvalidService'
    Properties:
      Description: 'local invoke demo'
    nodejs8:
      Type: 'Aliyun::Serverless::InvalidFunction'
      Properties:
        Handler: index.handler
        CodeUri: nodejs8/
        Description: 'http trigger demo with nodejs8!'
      Events:
        http-test:
          Type: HTTP
          Properties:
            AuthType: ANONYMOUS
            Method: ['GET', 'POST', 'PUT']
AI 代码解读

在上面的示例中,我们原意是想要描述一个叫做 local-http-demo 的服务,并在服务下定义了一个名为 nodejs8 的函数,同时为该函数配置一个匿名的 HTTP 触发器,支持 GET、POST、PUT 的 HTTP 请求。

但遗憾的是,上面的示例描述有几处比较隐蔽的问题。下面,我们就动手实践,看如何发现上面示例中包含的错误语法描述并将其修正。

3. 语法错误发现并修复

3.1 修复第一个错误

我们可以执行 fun validate 对 tempalte.yml 进行校验(其他的命令比如 deploy、local 等也会隐式的执行 fun validate,保证在语法描述正确的情况下才执行指定的功能)。

当执行完 fun validate 后,会看到错误信息:

[
  {
    "keyword": "enum",
    "dataPath": "/Resources/local-http-demo/Type",
    "params": {
      "allowedValues": [
        "Aliyun::Serverless::Service",
        "Aliyun::Serverless::TableStore",
        "Aliyun::Serverless::Api",
        "Aliyun::Serverless::Log",
        "Aliyun::Serverless::CustomDomain",
        "Aliyun::Serverless::MNSTopic"
      ]
    },
    "message": "should be equal to one of the allowed values"
  }
]
AI 代码解读

错误信息会以 json 的格式输出,其中的 message 就是我们的本次的错误原因,dataPath 是遇到的错误在 template.yml 中的具体位置,params 中的内容是对 message 的进一步的补充。

按照我们刚才的解释,大概就可以明白,/Resources/local-http-demo/Type 这个资源定义出了问题,原因是这个值应该是 Aliyun::Serverless::ServiceAliyun::Serverless::TableStoreAliyun::Serverless::ApiAliyun::Serverless::LogAliyun::Serverless::CustomDomainAliyun::Serverless::MNSTopic 中的一个。

再看下我们的描述(限于篇幅只列出了 template.yml 的部分内容):

Resources:
  local-http-demo:
    Type: 'Aliyun::Serverless::InvalidService'
AI 代码解读

很明显,我们描述的 Aliyun::Serverless::InvalidService 并不在上面允许的值中。

我们将其修改正确,也就是把 Aliyun::Serverless::InvalidService 修改为 Aliyun::Serverless::Service 即可。

Resources:
  local-http-demo:
-    Type: 'Aliyun::Serverless::InvalidService'
+    Type: 'Aliyun::Serverless::Service'
AI 代码解读

3.2 重新进行语法校验并修复

通常情况下,我们建议的方式是修复完一个问题,就重新使用 fun validate 进行校验。

我们将上面问题修复后,重新执行 fun validate 后,可以发现,依旧有报错:

[
  {
    "keyword": "const",
    "dataPath": "/Resources/local-http-demo/nodejs8/Type",
    "params": {
      "allowedValue": "Aliyun::Serverless::Function"
    },
    "message": "should be equal to constant"
  },
  {
    "keyword": "required",
    "dataPath": "/Resources/local-http-demo/nodejs8/Properties",
    "params": {
      "missingProperty": "Runtime"
    },
    "message": "should have required property 'Runtime'"
  },
  {
    "keyword": "additionalProperties",
    "dataPath": "/Resources/local-http-demo/nodejs8/Events/http-test/Properties",
    "params": {
      "additionalProperty": "Method"
    },
    "message": "should NOT have additional properties"
  },
  {
    "keyword": "required",
    "dataPath": "/Resources/local-http-demo/nodejs8/Events/http-test/Properties",
    "params": {
      "missingProperty": "Methods"
    },
    "message": "should have required property 'Methods'"
  }
]
AI 代码解读

这一次与上一次不同,同时出现了 4 个报错。但具体的修复步骤与上一步是一致的,即先找到第一个问题进行修复就可以了。

第一个报错如下:

{
  "keyword": "const",
  "dataPath": "/Resources/local-http-demo/nodejs8/Type",
  "params": {
    "allowedValue": "Aliyun::Serverless::Function"
  },
  "message": "should be equal to constant"
}
AI 代码解读

这个和我们刚才修过的问题是一样的,意思就是 /Resources/local-http-demo/nodejs8/Type 的定义不对,这个值只被允许设定为 Aliyun::Serverless::Function

我们按照提示的将其修正(限于篇幅只列出了 template.yml 的部分内容):

Resources:
  local-http-demo:
    nodejs8:
-      Type: 'Aliyun::Serverless::InvalidFunction'
+      Type: 'Aliyun::Serverless::Function'
AI 代码解读

这时候,我们可以重新执行下 fun validate,然后再挑选第一个进行修复,我们这里限于篇幅,就继续挑选下一个报错进行修复了。

{
  "keyword": "required", 
  "dataPath": "/Resources/local-http-demo/nodejs8/Properties",
  "params": {
    "missingProperty": "Runtime"
  },
  "message": "should have required property 'Runtime'"
}
AI 代码解读

这里 message 的含义是,缺少了必要的属性 Runtime,检查下我们的规范文档对 Function 资源的描述,可以发现,Runtime 确实是必选的。

我们按照提示的将其修正(限于篇幅只列出了 template.yml 的部分内容):

Resources:
  local-http-demo:
    Type: 'Aliyun::Serverless::Service'
    nodejs8:
      Type: 'Aliyun::Serverless::Function'
      Properties:
+            Runtime: nodejs8
AI 代码解读

最后的两个错误,我们可以一起看:

{
  "keyword": "additionalProperties",
  "dataPath": "/Resources/local-http-demo/nodejs8/Events/http-test/Properties",
  "params": {
    "additionalProperty": "Method"
  },
  "message": "should NOT have additional properties"
},
{
  "keyword": "required",
  "dataPath": "/Resources/local-http-demo/nodejs8/Events/http-test/Properties",
  "params": {
    "missingProperty": "Methods"
  },
  "message": "should have required property 'Methods'"
}
AI 代码解读

这两个的错误含义是,我们在 /Resources/local-http-demo/nodejs8/Events/http-test/Properties 这个路径下,定义了一个不被允许的属性 Method,并且同样是在这个路径下,缺少了一个必选的属性 Methods。结合这两个报错,我们就可以判断出,我们将 Methods 错写成了 Method。

我们按照提示的将其修正(限于篇幅只列出了 template.yml 的部分内容):

Resources:
  local-http-demo:
    nodejs8:
      Events:
        http-test:
          Properties:
            AuthType: ANONYMOUS
-           Method: ['GET', 'POST', 'PUT']
+           Methods: ['GET', 'POST', 'PUT']
AI 代码解读

当将所有的错误修复完成后,我们再重新执行 fun validate,即可发现,我们的所有错误都被修正啦。

接下来,我们就使用这个 template.yml 完成后续的 fun local、fun deploy 等功能就可以了。

3.3 修改记录汇总

我们将上面所有的改错记录记录如下:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
  local-http-demo:
-   Type: 'Aliyun::Serverless::InvalidService'
+   Type: 'Aliyun::Serverless::Service'
    Properties:
      Description: 'local invoke demo'
    nodejs8:
-     Type: 'Aliyun::Serverless::InvalidFunction'
+     Type: 'Aliyun::Serverless::Function'
      Properties:
        Handler: index.handler
        CodeUri: nodejs8/
        Description: 'http trigger demo with nodejs8!'
+       Runtime: nodejs8
      Events:
        http-test:
          Type: HTTP
          Properties:
            AuthType: ANONYMOUS
-           Method: ['GET', 'POST', 'PUT']
+           Methods: ['GET', 'POST', 'PUT']
AI 代码解读

4. 总结

虽然 Fun 的规范文档描述的比较详细了,而且在 Fun 的 repo 首页,我们给出了非常多的示例文章,但依旧存在很大可能性会遇到各种各样的类似上面示例的书写错误。

因此,Fun 提供了比较强大的语法校验功能,并通过精准的报错信息,让用户可以方便的将其修正。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
打赏
0
0
0
0
142
分享
相关文章
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
探索Serverless架构:开发实践与优化策略
本文深入探讨了Serverless架构的核心概念、开发实践及优化策略。Serverless让开发者无需管理服务器即可运行代码,具有成本效益、高可扩展性和提升开发效率等优势。文章还详细介绍了函数设计、安全性、监控及性能和成本优化的最佳实践。
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
265 1
探索Serverless架构:开发的未来趋势
【10月更文挑战第5天】Serverless架构,即无服务器架构,正逐渐成为云计算领域的热点。它允许开发者构建和运行应用程序而无需管理底层服务器。本文介绍了Serverless架构的基本概念、核心优势及挑战,并展示了其在事件驱动编程、微服务架构和数据流处理等场景中的应用。通过优化冷启动、使用外部存储等实战技巧,开发者可以更好地利用Serverless架构提升开发效率和应用性能。随着技术的成熟,Serverless将在未来软件开发中扮演重要角色。
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
114 0
Angular遇上Azure Functions:探索无服务器架构下的开发实践——从在线投票系统案例深入分析前端与后端的协同工作
【8月更文挑战第31天】在现代软件开发中,无服务器架构因可扩展性和成本效益而备受青睐。本文通过构建一个在线投票应用,介绍如何结合Angular前端框架与Azure Functions后端服务,快速搭建高效、可扩展的应用系统。Angular提供响应式编程和组件化能力,适合构建动态用户界面;Azure Functions则简化了后端逻辑处理与数据存储。通过具体示例代码,详细展示了从设置Azure Functions到整合Angular前端的全过程,帮助开发者轻松上手无服务器应用开发。
68 0
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力,用户只需提交 npx 命令即可“零改造”将开源 MCP Server 部署到云上,函数计算 FC 会准备好计算资源,并以弹性、可靠的方式运行 MCP 服务,按实际调用时长和次数计费,欢迎你在阿里云百炼和函数计算 FC 上体验 MCP 服务。
146 29
云大使 X 函数计算 FC 专属活动上线!享返佣,一键打造 AI 应用
如今,AI 技术已经成为推动业务创新和增长的重要力量。但对于许多企业和开发者来说,如何高效、便捷地部署和管理 AI 应用仍然是一个挑战。阿里云函数计算 FC 以其免运维的特点,大大降低了 AI 应用部署的复杂性。用户无需担心底层资源的管理和运维问题,可以专注于应用的创新和开发,并且用户可以通过一键部署功能,迅速将 AI 大模型部署到云端,实现快速上线和迭代。函数计算目前推出了多种规格的云资源优惠套餐,用户可以根据实际需求灵活选择。
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
Serverless MCP 运行时业界首发,函数计算支持阿里云百炼 MCP 服务!阿里云百炼发布业界首个全生命周期 MCP 服务,无需用户管理资源、开发部署、工程运维等工作,5 分钟即可快速搭建一个连接 MCP 服务的 Agent(智能体)。作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力。
157 0
 Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速

相关产品

  • 函数计算
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等