Function Compute3.0是產品的一個重大升級版本,在函數管理、函數執行引擎、自訂網域名、函數授權及Auto Scaling規則方面進行了多項改進,旨在為使用者提供極簡的產品體驗。本文主要介紹Function Compute3.0的功能變化及相容原有服務和函數的規則。
Function Compute3.0功能變化
Function Compute3.0功能變化如下:
函數管理變化
移除服務概念,函數成為一級實體,角色、日誌和VPC等直接在函數層級配置。
版本和別名直接作用在函數層級,可以對函數進行獨立的版本控制。
詳細變化,請參見函數管理變化。
函數執行引擎變化
統一請求處理常式(Handler)簽名,HTTP請求和事件請求處理常式統一。具體資訊,請參見HTTP Trigger行為變化。
標準運行時(Runtime)不再支援單一實例多並發功能,Custom Runtime仍然支援單一實例多並發功能。
函數執行個體生命週期不再支援PreFreeze回調方法。
自訂網域名變化
自訂網域名不再依賴HTTP Trigger,可以直接引流到對應的函數。
函數授權變化
支援服務關聯角色(SLR),簡化函數授權體驗。更多資訊,請參見函數角色變化(SLR)。
Auto Scaling規則變化
按量執行個體伸縮控制功能更新為函數並發度管理,可以限制預留執行個體和按量執行個體的總並發度。
原有的服務和函數配置等保持不變,調用不受影響。例如,原有的函數配置了單一實例多並發可以繼續使用,但在Function Compute3.0中新建立的標準運行時的函數,無法再配置單一實例多並發功能。關於相容原有的服務和函數的規則,請參見相容原有的服務和函數。
函數管理變化
在Function Compute3.0中,可以直接建立函數,不需要先建立服務。原服務等級的配置例如角色、日誌配置、VPC配置等,直接在函數層級配置。以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)在函數層級發布版本和建立別名,以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行為變化
在Function Compute3.0中,處理事件請求和處理HTTP請求的函數入口統一。以Python為例,代碼如下:
def handler(event, context):
return 'hello fc'
對於HTTP Trigger調用,即通過HTTP Trigger的URL訪問的請求或者通過自訂網域名訪問的請求,Function Compute會將HTTP請求轉換成event,同時將函數的響應轉換成HTTP響應。
請求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響應樣本如下:
def handler(event, context):
return {
'body': 'hello FC',
'headers': {
'my-custom-header': 'foo'
},
'statusCode': 400
}
以上代碼將被轉換成如下的HTTP響應:
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詳細的請求和響應格式轉換請參考HTTP觸發器概述。
函數角色變化(SLR)
在使用Function Compute提供的日誌、VPC、非同步呼叫目標服務等功能時,Function Compute需要訪問其他的雲端服務。例如配置函數日誌時,使用者需要授權Function Compute對指定日誌Logstore的寫入許可權,Function Compute才能夠將函數日誌寫入到使用者的Logstore。原來這個授權是通過服務角色進行授權,服務角色一方面用於Function Compute訪問其他的雲端服務,另一方面也用於函數執行時使用者代碼訪問其他雲端服務。這樣可能會導致服務角色的許可權過大的問題。
在Function Compute3.0,Function Compute支援了服務關聯角色,專門用於授權Function Compute訪問其他的雲端服務,而使用者代碼訪問其他雲端服務,則由函數角色來授權,使用者可以根據函數的需要,細粒度地控制函數角色的授權。
在使用者一次性授權後,在Function Compute3.0建立的函數,預設將使用服務關聯角色(SLR)。函數不需要配置角色即可使用日誌、VPC、非同步呼叫目標服務等功能。
相容原有的服務和函數
Function Compute3.0提供了一套全新的API和控制台操作介面,針對使用者原有的服務和函數,也能夠相容。相容的規則如下:
類別 | 相容規則 | 樣本 |
服務配置 | 原有的服務和函數將被統一轉換成函數,函數名為 服務的配置,例如服務角色、日誌配置、VPC配置等將被轉換成函數配置。 | 原有服務s1,s1中有2個函數f1和f2,在Function Compute3.0中,將被轉換成2個函數,函數名分別為 |
更新函數配置,不改變服務配置,也不會影響服務下的其他函數。 | 原有服務s1有2個函數f1和f2,更新 | |
使用Function Compute2.0API更新服務配置,則服務下所有函數的對應配置會被更新。 | 原有服務s1有2個函數f1和f2,更新s1的VPC配置,則 | |
版本和別名 | 原有的服務版本和別名會被轉換成函數版本和別名。 | 原有的服務s1有2個版本1和2,有1個別名prod,在Function Compute3.0版中, |
對函數發布一個版本,同時也會對服務和服務下的其他函數發布一個版本。 |
| |
對函數建立別名,同時也會對服務和服務下的其他函數也會增加一個別名。 |
| |
不允許對函數刪除版本或別名,因為函數版本和別名是服務及其服務下的其他函數共同的版本和別名。 | 刪除 | |
更新函數別名,不改變服務別名,也不影響服務下的其他函數。 | 更新 | |
使用Function Compute2.0API更新服務別名,則服務下的所有函數的別名配置都會被更新。 | 更新s1的prod別名,讓它從指向版本1變成指向版本2,則 |
已有函數在Function Compute3.0控制台操作後,函數將具有獨立的服務等級配置,之後在Function Compute3.0控制台對此函數的操作都只會更新此函數的配置,不會影響同服務下的其他函數。在Function Compute2.0控制台,修改服務等級的配置,則會更新該服務下的所有函數對應配置。