前言
首先介绍下在本文出现的几个比较重要的概念:
函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息参考。
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考。
Api 网关: API 网关(API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简单的操作,即可快速、低成本、低风险地开放数据或服务。
函数计算提供了 HTTP 触发器,并且支持本地调试,使得通过函数计算开发一个 web 应用十分的方便。
但也存在一些场景,比如已经存在了一个 API 网关 + 函数计算的应用,想要将该应用部署到不同的 region。如果通过手工操作,这个过程会十分的繁琐,且容易出错。而通过 Fun 可以较容易的实现一键部署 API 网关 + 函数计算到所有 region。
本文,主要介绍如何通过 Fun 发布 Api 网关 + 函数计算应用。
在读本文前,建议阅读 Fun 工具相关的基础知识。
注意: 本文只会附上核心的代码或配置,如果想要完整的例子,可以参考。
简单的例子
编写函数代码
首先需要编写函数的代码,函数可以是一个简单的 helloworld:
exports.handler = function(event, context, callback) {
var response = {
isBase64Encoded: false,
statusCode: 200,
body: 'hellow wrold'
};
callback(null, response);
};
也可以是一段更复杂的程序,比如 这里 涉及到的代码。
配置 Api 网关
HelloworldGroup: # Api Group
Type: 'Aliyun::Serverless::Api'
Properties:
StageName: RELEASE
DefinitionBody:
'/': # request path
get: # http method
x-aliyun-apigateway-api-name: hello_get # api name
x-aliyun-apigateway-fc: # 当请求该 api 时,要触发的函数,
arn: acs:fc:::services/${fc.Arn}/functions/${helloworld.Arn}/
timeout: 3000
其中 x-aliyun-apigateway-fc 配置项中的 fc 以及 helloworld,分别为服务名、函数名,需要根据实际配置的函数进行修改。
发布
通过 Fun deploy 即可发布:
打开提示的 url 即可进行访问。
更多例子
在 Fun 项目中,提供了很多 API 网关的 demo 和文档,可以参考。
使用进阶
如果已有的文档无法满足需求,比如想要配置 https、超时时间,必须按可选等参数,可以根据 API 网关的 API 文档 进行更多的配置,Fun 支持的参数包括但不限于 ApiName、Visibility、RequestConfig、RequestParameters、ServiceParameters、ServiceParametersMap 等。
如果想要通过 API 文档 编写 Fun 配置文件,就需要了解 API 与 Fun 配置的映射关系。映射规则如下:
将参数名小写,并将原来的驼峰用 -
连接,然后加上 x-aliyun-apigateway
前缀。
举例,比如对于一下几个 API 参数,映射关系分别为:
ApiName => x-aliyun-apigateway-api-name
Visibility => x-aliyun-apigateway-visibility
RequestParameters => x-aliyun-apigateway-request-parameters
ServiceParametersMap => x-aliyun-apigateway-service-parameters-map
另外,针对每一个参数,可以进一步进行更细粒度的配置,比如在 API 文档 上介绍了 RequestParameters 其实是一个 RequestParameter 的数组的字符串表示,而 RequestParameter 可进行的配置有 ApiParameterName、LocationParameterType、Required 等。
转换成 Fun 配置,只需要将首字母小写即可,比如:
ApiParameterName => apiParameterName
Location => location
映射示例
对于 RequestParameters 的配置,转换成 Fun 配置为:
x-aliyun-apigateway-request-parameters:
- apiParameterName: 'token'
location: 'Query'
parameterType: 'String'
required: 'REQUIRED'
- apiParameterName: 'token2'
location: 'Query'
parameterType: 'String'
required: 'REQUIRED'
在上面的例子中,配置了两个 Query 类型的必须按参数,其中,第一个参数名为 token,第二个为 token2。
常量参数、系统参数
根据 API 网关的文档,以及上面的映射规则,可以写出常量参数的配置如下:
x-aliyun-apigateway-request-parameters:
- apiParameterName: 'token'
location: 'Query'
parameterType: 'String'
required: 'REQUIRED'
defaultValue: 'e'
x-aliyun-apigateway-service-parameters:
- serviceParameterName: 'token'
location: 'Query'
parameterCatalog: 'CONSTANT'
同样可以写出系统参数的配置如下:
x-aliyun-apigateway-request-parameters:
- apiParameterName: 'CaClientIp'
location: 'Query'
parameterType: 'String'
required: 'REQUIRED'
x-aliyun-apigateway-service-parameters:
- serviceParameterName: 'CaClientIp'
location: 'Query'
parameterCatalog: 'SYSTEM'
改造已有的 API
如果已经存在了一个 API 网关的 API,如何快速的用 Fun 描述出来?
这里介绍一个技巧,打开 API 网关控制台,选择想要改造的 API,点击编辑,然后不做任何修改直接保存。
然后找到 ModifyApi.json 请求,可以看到 RequestParamters
等参数的配置:
将其按照上面的映射规则进行改写即可。
总结
本文介绍了通过 Fun 部署 API 网关以及函数计算的例子,如果应用比较简单可以直接复制这些例子的配置使用,如果提供的示例无法满足需求,可以通过本文介绍的映射规则进行自定义配置。
利用 Fun 配置 API 网关具有重复部署、多 region 部署、协同开发、版本控制管理等优点,推荐优先使用 Fun 部署 Api 网关。