原文作者:资源编排(ROS)
原文链接:https://developer.aliyun.com/article/740218?spm=a2c6h.12873581.0.0.120c115e9hbaKn&groupCode=cloudnative
更多云原生技术资讯可关注阿里巴巴云原生技术圈
本文介绍阿里云资源编排服务(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是传递给函数的参数,必须是utf-8编码的字符串,如果要传递二进制,可以使用base64进行编码。ExecuteVersion的变化才能够触发函数的调用。
函数执行的返回结果也要求为utf-8编码的字符串,如果要返回二进制或其他编码的字符串,可以先使用base64编码再返回。
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中奖"
]
}
}
}
}
“ 阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”