函數(shù)計(jì)算3.0和2.0版本差異及兼容性說明
函數(shù)計(jì)算3.0是產(chǎn)品的一個(gè)重大升級版本,在函數(shù)管理、函數(shù)執(zhí)行引擎、自定義域名、函數(shù)授權(quán)及彈性伸縮規(guī)則方面進(jìn)行了多項(xiàng)改進(jìn),旨在為用戶提供極簡的產(chǎn)品體驗(yàn)。本文主要介紹函數(shù)計(jì)算3.0的功能變化及兼容原有服務(wù)和函數(shù)的規(guī)則。
函數(shù)計(jì)算3.0功能變化
函數(shù)計(jì)算3.0功能變化如下:
函數(shù)管理變化
移除服務(wù)概念,函數(shù)成為一級實(shí)體,角色、日志和VPC等直接在函數(shù)級別配置。
版本和別名直接作用在函數(shù)級別,可以對函數(shù)進(jìn)行獨(dú)立的版本控制。
詳細(xì)變化,請參見函數(shù)管理變化。
函數(shù)執(zhí)行引擎變化
統(tǒng)一請求處理程序(Handler)簽名,HTTP請求和事件請求處理程序統(tǒng)一。具體信息,請參見HTTP Trigger行為變化。
標(biāo)準(zhǔn)運(yùn)行時(shí)(Runtime)不再支持單實(shí)例多并發(fā)功能,Custom Runtime仍然支持單實(shí)例多并發(fā)功能。
函數(shù)實(shí)例生命周期不再支持PreFreeze回調(diào)方法。
自定義域名變化
自定義域名不再依賴HTTP Trigger,可以直接引流到對應(yīng)的函數(shù)。
函數(shù)授權(quán)變化
支持服務(wù)關(guān)聯(lián)角色(SLR),簡化函數(shù)授權(quán)體驗(yàn)。更多信息,請參見函數(shù)角色變化(SLR)。
彈性伸縮規(guī)則變化
按量實(shí)例伸縮控制功能升級為函數(shù)并發(fā)度管理,可以限制預(yù)留實(shí)例和按量實(shí)例的總并發(fā)度。
原有的服務(wù)和函數(shù)配置等保持不變,調(diào)用不受影響。例如,原有的函數(shù)配置了單實(shí)例多并發(fā)可以繼續(xù)使用,但在函數(shù)計(jì)算3.0中新創(chuàng)建的標(biāo)準(zhǔn)運(yùn)行時(shí)的函數(shù),無法再配置單實(shí)例多并發(fā)功能。關(guān)于兼容原有的服務(wù)和函數(shù)的規(guī)則,請參見兼容原有的服務(wù)和函數(shù)。
函數(shù)管理變化
在函數(shù)計(jì)算3.0中,可以直接創(chuàng)建函數(shù),不需要先創(chuàng)建服務(wù)。原服務(wù)級別的配置例如角色、日志配置、VPC配置等,直接在函數(shù)級別配置。以Go SDK為例,代碼如下:
resp, err := client.CreateFunction(
new(fc.CreateFunctionRequest).
SetBody(&fc.CreateFunctionInput{
FunctionName: &funcName,
Runtime: tea.String("nodejs12"),
Handler: tea.String("index.handler"),
MemorySize: tea.Int32(128),
Role: tea.String("role-arn"),
VpcConfig: &fc.VPCConfig{
VpcId: tea.String("vpc-id"),
VSwitchIds: []*string{tea.String("vsw-id")},
SecurityGroupId: tea.String("sg-id"),
},
Code: new(fc.InputCodeLocation).SetZipFile(fx.GetCodeZipBase64()),
}))
event := "my event"
resp, err = client.InvokeFunction(&funcName,
new(fc.InvokeFunctionRequest).SetBody(strings.NewReader(event)))
body, err := ioutil.ReadAll(resp.Body)
在函數(shù)級別發(fā)布版本和創(chuàng)建別名,以Go SDK為例,代碼如下:
resp, err := client.PublishFunctionVersion(&funcName,
new(fc.PublishFunctionVersionRequest).SetBody(&fc.PublishVersionInput{
Description: tea.String("version desc"),
}))
aliasName := "my-alias"
routingConfig := map[string]*float32{
"2": tea.Float32(float32(0.05)),
}
resp, err := client.CreateAlias(&funcName, new(fc.CreateAliasRequest).
SetBody(&fc.CreateAliasInput{
AliasName: &aliasName,
VersionId: tea.String("1"),
AdditionalVersionWeight: routingConfig,
}))
HTTP Trigger行為變化
在函數(shù)計(jì)算3.0中,處理事件請求和處理HTTP請求的函數(shù)入口統(tǒng)一。以Python為例,代碼如下:
def handler(event, context):
return 'hello fc'
對于HTTP Trigger調(diào)用,即通過HTTP Trigger的URL訪問的請求或者通過自定義域名訪問的請求,函數(shù)計(jì)算會將HTTP請求轉(zhuǎn)換成event,同時(shí)將函數(shù)的響應(yīng)轉(zhuǎn)換成HTTP響應(yīng)。
請求event示例如下:
{
"version": "v1",
"rawPath": "/my/path",
"httpMethod": "POST",
"headers": {
"header1": "value1,value2",
"header2": "value2"
},
"queryParameters": {
"param1": "value1,value2",
"param2": "value2"
},
"body": "hello from client",
"isBase64Encoded": false,
"requestContext": {
"accountId": "12345678",
"domainName": "my-domain.com",
"domainPrefix": "prefix",
"requestId": "abcd-efgh",
"time": "2023-09-01T14:17:23+08:00",
"timeEpoch": 1693549043255,
"http": {
"method": "GET",
"path": "/my/path",
"protocol": "http",
"sourceIP": "39.40.41.42",
"userAgent": "go-sdk/1.0"
}
}
}
HTTP響應(yīng)示例如下:
def handler(event, context):
return {
'body': 'hello FC',
'headers': {
'my-custom-header': 'foo'
},
'statusCode': 400
}
以上代碼將被轉(zhuǎn)換成如下的HTTP響應(yīng):
HTTP/1.1 400 Bad Request
Content-Type: text/plain; charset=utf-8
My-Custom-Header: foo
X-Fc-Request-Id: 64e866c9-69902fbc525fd10989e7299c
Date: Fri, 25 Aug 2023 10:18:06 GMT
Content-Length: 8
hello FC
詳細(xì)的請求和響應(yīng)格式轉(zhuǎn)換請參考HTTP觸發(fā)器概述。
函數(shù)角色變化(SLR)
在使用函數(shù)計(jì)算提供的日志、VPC、異步調(diào)用目標(biāo)服務(wù)等功能時(shí),函數(shù)計(jì)算需要訪問其他的云服務(wù)。例如配置函數(shù)日志時(shí),用戶需要授權(quán)函數(shù)計(jì)算對指定日志Logstore的寫入權(quán)限,函數(shù)計(jì)算才能夠?qū)⒑瘮?shù)日志寫入到用戶的Logstore。原來這個(gè)授權(quán)是通過服務(wù)角色進(jìn)行授權(quán),服務(wù)角色一方面用于函數(shù)計(jì)算訪問其他的云服務(wù),另一方面也用于函數(shù)執(zhí)行時(shí)用戶代碼訪問其他云服務(wù)。這樣可能會導(dǎo)致服務(wù)角色的權(quán)限過大的問題。
在函數(shù)計(jì)算3.0,函數(shù)計(jì)算支持了服務(wù)關(guān)聯(lián)角色,專門用于授權(quán)函數(shù)計(jì)算訪問其他的云服務(wù),而用戶代碼訪問其他云服務(wù),則由函數(shù)角色來授權(quán),用戶可以根據(jù)函數(shù)的需要,細(xì)粒度地控制函數(shù)角色的授權(quán)。
在用戶一次性授權(quán)后,在函數(shù)計(jì)算3.0創(chuàng)建的函數(shù),默認(rèn)將使用服務(wù)關(guān)聯(lián)角色(SLR)。函數(shù)不需要配置角色即可使用日志、VPC、異步調(diào)用目標(biāo)服務(wù)等功能。
兼容原有的服務(wù)和函數(shù)
函數(shù)計(jì)算3.0提供了一套全新的API和控制臺操作界面,針對用戶原有的服務(wù)和函數(shù),也能夠兼容。兼容的規(guī)則如下:
類別 | 兼容規(guī)則 | 示例 |
服務(wù)配置 | 原有的服務(wù)和函數(shù)將被統(tǒng)一轉(zhuǎn)換成函數(shù),函數(shù)名為 服務(wù)的配置,例如服務(wù)角色、日志配置、VPC配置等將被轉(zhuǎn)換成函數(shù)配置。 | 原有服務(wù)s1,s1中有2個(gè)函數(shù)f1和f2,在函數(shù)計(jì)算3.0中,將被轉(zhuǎn)換成2個(gè)函數(shù),函數(shù)名分別為 |
更新函數(shù)配置,不改變服務(wù)配置,也不會影響服務(wù)下的其他函數(shù)。 | 原有服務(wù)s1有2個(gè)函數(shù)f1和f2,更新 | |
使用函數(shù)計(jì)算2.0API更新服務(wù)配置,則服務(wù)下所有函數(shù)的對應(yīng)配置會被更新。 | 原有服務(wù)s1有2個(gè)函數(shù)f1和f2,更新s1的VPC配置,則 | |
版本和別名 | 原有的服務(wù)版本和別名會被轉(zhuǎn)換成函數(shù)版本和別名。 | 原有的服務(wù)s1有2個(gè)版本1和2,有1個(gè)別名prod,在函數(shù)計(jì)算3.0版中, |
對函數(shù)發(fā)布一個(gè)版本,同時(shí)也會對服務(wù)和服務(wù)下的其他函數(shù)發(fā)布一個(gè)版本。 |
| |
對函數(shù)創(chuàng)建別名,同時(shí)也會對服務(wù)和服務(wù)下的其他函數(shù)也會增加一個(gè)別名。 |
| |
不允許對函數(shù)刪除版本或別名,因?yàn)楹瘮?shù)版本和別名是服務(wù)及其服務(wù)下的其他函數(shù)共同的版本和別名。 | 刪除 | |
更新函數(shù)別名,不改變服務(wù)別名,也不影響服務(wù)下的其他函數(shù)。 | 更新 | |
使用函數(shù)計(jì)算2.0API更新服務(wù)別名,則服務(wù)下的所有函數(shù)的別名配置都會被更新。 | 更新s1的prod別名,讓它從指向版本1變成指向版本2,則 |
已有函數(shù)在函數(shù)計(jì)算3.0控制臺操作后,函數(shù)將具有獨(dú)立的服務(wù)級別配置,之后在函數(shù)計(jì)算3.0控制臺對此函數(shù)的操作都只會更新此函數(shù)的配置,不會影響同服務(wù)下的其他函數(shù)。在函數(shù)計(jì)算2.0控制臺,修改服務(wù)級別的配置,則會更新該服務(wù)下的所有函數(shù)對應(yīng)配置。