本文介绍阿里云资源编排服务 (ROS)(下面简称 ROS) 函数计算相关功能, 涉及如下资源类型:
ALIYUN::FC::Service 创建服务
ALIYUN::FC::Function 创建函数
ALIYUN::FC::FunctionInvoker 主动执行函数
ALIYUN::FC::Trigger 创建触发器, 触发执行函数
通过使用上面的资源类型进行编排, 可以灵活的使用函数计算的功能.
函数计算资源类型介绍
我们先看看阿里云 ROS 函数计算相关的 4 个资源类型都提供了什么能力和怎么使用. 如果你还没接触过阿里云的资源编排服务, 请戳这里
创建服务
服务 ( Service ) 是函数计算资源管理的单位. 服务下的所有函数共享一些相同的设置, 例如服务授权, 配置日志. 同一服务下有多个函数, 这些函数共享服务配置的资源( 例如日志库, 服务角色等).
资源编排聚合了函数计算 Service 相关接口的能力, 一个简单的创建服务的模板如下:
- {
- "ROSTemplateFormatVersion" : "2015-09-01",
- "Parameters" : {
- "ServiceName": {
- "Type": "String"
- }
- },
- "Resources" : {
- "Service": {
- "Type": "ALIYUN::FC::Service",
- "Properties": {
- "ServiceName": {
- "Ref": "ServiceName"
- }
- }
- }
- },
- "Outputs": {
- "ServiceId": {
- "Value": {"Fn::GetAtt": ["Service", "ServiceId"]}
- }
- }
- }
参数取值示例:
- {
- "ServiceName": "test-fc-service"
- }
可以看出, 在最简单的情况下, 只需要定义 ServiceName, 就可以创建出一个服务.
ALIYUN::FC::Service 还支持其他很多参数, 具体可以参考相关文档.
创建函数
函数是系统调度和运行的单位. 函数必须从属于服务, 一个服务下的所有函数都共享该服务的属性, 例如授权, 日志设置.
资源编排聚合了函数计算 Function 相关接口的能力, 一个简单的创建函数的模板如下:
- {
- "ROSTemplateFormatVersion" : "2015-09-01",
- "Parameters" : {
- "ServiceName": {
- "Type": "String"
- },
- "Code": {
- "Type": "Json"
- },
- "FunctionName": {
- "Type": "String"
- },
- "Handler": {
- "Type": "String"
- },
- "Runtime": {
- "Type": "String"
- }
- },
- "Resources" : {
- "Function": {
- "Type": "ALIYUN::FC::Function",
- "Properties": {
- "ServiceName": {
- "Ref": "ServiceName"
- },
- "Code": {
- "Ref": "Code"
- },
- "FunctionName": {
- "Ref": "FunctionName"
- },
- "Handler": {
- "Ref": "Handler"
- },
- "Runtime": {
- "Ref": "Runtime"
- }
- }
- }
- },
- "Outputs": {
- "FunctionId": {
- "Value": {"Fn::GetAtt": ["Function", "FunctionId"]}
- }
- }
- }
参数取值示例:
- {
- "ServiceName": "test-fc-service",
- "Code": {
- "ZipFile": "UEsDBBQAAAAIAFybkk7kWCJARgAAAE0AAAAHAAAAbWFpbi5weePKzC3ILypRKErMS8nP5eLiSklNUyjKz8nRSC1LzSvRUUjOzytJrSjRtOJSAIKi1JLSojyoaj0QlZlXomGgo2BoYKDJBQBQSwECFAMUAAAACABcm5JO5FgiQEYAAABNAAAABwAAAAAAAAAAAAAApIEAAAAAbWFpbi5weVBLBQYAAAAAAQABADUAAABrAAAAAAA="
- },
- "FunctionName": "test-fc-function",
- "Handler": "main.roll",
- "Runtime": "python2.7"
- }
可以看出, 只需要传递服务名, 函数名, 执行代码, 运行时, 执行入口, 就可以创建出一个函数. 示例使用了直接传递代码的方式(code zip 包的 base64 编码), 推荐采用 OSS 的方式. 这是段 python 的代码, 运行入口是 main.py 的 roll 函数, 具体功能是返回一个 1-100 的随机数.
ALIYUN::FC::Function 还支持其他很多参数, 具体可以参考相关文档.
执行函数
主动执行函数.
资源编排聚合了函数计算 Function 执行相关接口的能力, 一个简单的创建函数的模板如下:
- {
- "ROSTemplateFormatVersion" : "2015-09-01",
- "Parameters" : {
- "ServiceName": {
- "Type": "String"
- },
- "FunctionName": {
- "Type": "String"
- },
- "Async": {
- "Type": "Boolean"
- },
- "Event": {
- "Type": "String"
- },
- "ExecuteVersion": {
- "Type": "Number"
- }
- },
- "Resources" : {
- "FunctionInvoker": {
- "Type": "ALIYUN::FC::FunctionInvoker",
- "Properties": {
- "ServiceName": {
- "Ref": "ServiceName"
- },
- "FunctionName": {
- "Ref": "FunctionName"
- },
- "Async": {
- "Ref": "Async"
- },
- "Event": {
- "Ref": "Event"
- },
- "ExecuteVersion": {
- "Ref": "ExecuteVersion"
- }
- }
- }
- },
- "Outputs": {
- "Result": {
- "Value": {"Fn::GetAtt": ["FunctionInvoker", "Result"]}
- },
- "ResultType": {
- "Value": {"Fn::GetAtt": ["FunctionInvoker", "ResultType"]}
- }
- }
- }
参数取值示例:
- {
- "ServiceName": "test-fc-service",
- "FunctionName": "test-fc-function",
- "Async": false,
- "Event": "abc",
- "ExecuteVersion": 0
- }
通过传递服务名, 函数名就能构建一个 FunctionInvoker.Async 用于表明是否异步执行, 同步执行会产生输出, 异步执行不会产生输出. Event 是传递给函数的参数. ExecuteVersion 的变化才能够触发函数的调用.
ALIYUN::FC::FunctionInvoker 的更多使用细节可以参考相关文档.
创建触发器
触发器是触发函数执行的方式. 在事件驱动的计算模型中, 事件源是事件的生产者, 函数是事件的处理者, 而触发器提供了一种集中的和统一的方式来管理不同的事件源. 在事件源中, 当事件发生时, 如果满足触发器定义的规则, 事件源则调用触发器所对应的函数.
资源编排聚合了函数计算 Trigger 相关接口的能力, 一个简单的创建触发器的模板如下:
- {
- "ROSTemplateFormatVersion": "2015-09-01",
- "Resources": {
- "Trigger": {
- "Type" : "ALIYUN::FC::Trigger",
- "Properties" : {
- "ServiceName" : "test-fc-service",
- "FunctionName": "test-fc-function",
- "TriggerName": "test-fc-trigger",
- "TriggerType": "oss",
- "TriggerConfig": {
- "events": [
- "oss:ObjectCreated:*"
- ],
- "filter": {
- "key": {
- "prefix": "abc",
- "suffix": "def"
- }
- }
- },
- "InvocationRole": "acs:ram::123456789:role/test-fc-trigger",
- "SourceArn": "acs:oss:cn-hangzhou:123456789:oss-test-fc-trigger"
- }
- }
- }
- }
Trigger 相对来说比较复杂, 尤其在 TriggerConfig 的编写上, 这可以参考函数计算 Trigger 的官方文档.
ALIYUN::FC::Trigger 的更多使用细节可以参考相关文档.
综合应用场景: 抽奖
我们把函数计算相关的资源组合在一起使用, 实现一个抽奖功能. 使用附录中的模板创建 Stack, 创建参数如下图所示. 该模板使用函数计算实现了抽奖功能, 在 Stack 中通过把参与者传递给函数计算, 抽取出中奖者并显示出来.
等待 Stack 创建完成, 观察 Stack 输出结果. 发现小明中奖.
更新 Stack, 修改 ExecuteVersion 为 1. 等待 Stack 更新完成, 观察 Stack 输出结果. 发现王五中奖.
附录: 抽奖模板
- {
- "ROSTemplateFormatVersion": "2015-09-01",
- "Parameters": {
- "Persons": {
- "Type": "CommaDelimitedList"
- },
- "ServiceName": {
- "Type": "String",
- "Default": "test-fc-service"
- },
- "FunctionName": {
- "Type": "String",
- "Default": "test-fc-function"
- },
- "ExecuteVersion": {
- "Type": "Number",
- "Default": 0
- }
- },
- "Resources": {
- "Service": {
- "Type": "ALIYUN::FC::Service",
- "Properties": {
- "ServiceName": {
- "Ref": "ServiceName"
- }
- }
- },
- "Function": {
- "Type": "ALIYUN::FC::Function",
- "DependsOn": "Service",
- "Properties": {
- "ServiceName": {
- "Ref": "ServiceName"
- },
- "FunctionName": {
- "Ref": "FunctionName"
- },
- "Code": {
- "ZipFile": "UEsDBBQAAAAIADZ+pk6tb78pYgAAAHQAAAAHAAAAbWFpbi5weS2MQQqDQAxF9zlFds6AzAG8SulCxogBJxnib7G3by2+5YP3SFv3AMdsizciWmTl3QGJT5K3GEaubpATeSL+EYJX2B2UurlWSQ+bm5QDoT1lXj34EqzG/0c5+q5IwzjkZ6YvuesBAhQDFAAAAAgANn6mTq1vvyliAAAAdAAAAAcAAAAAAAAAAAAAAKSBAAAAAG1haW4ucHlQSwUGAAAAAAEAAQA1AAAAhwAAAAAA"
- },
- "Handler": "main.lottery",
- "Runtime": "python2.7",
- "Timeout": 2
- }
- },
- "FunctionInvoker": {
- "Type": "ALIYUN::FC::FunctionInvoker",
- "DependsOn": "Function",
- "Properties": {
- "ServiceName": {
- "Ref": "ServiceName"
- },
- "FunctionName": {
- "Ref": "FunctionName"
- },
- "Async": false,
- "Event": {
- "Fn::Join": [",", {"Ref": "Persons"}]
- },
- "ExecuteVersion": {
- "Ref": "ExecuteVersion"
- }
- }
- }
- },
- "Outputs": {
- "Result": {
- "Value": {
- "Fn::Replace" : [
- {
- "Person": {
- "Fn::GetAtt": [
- "FunctionInvoker",
- "Result"
- ]
- }
- },
- "恭喜 Person 中奖"
- ]
- }
- }
- }
- }
来源: https://yq.aliyun.com/articles/701495