背景
資源編排服務(Resource Orchestration Service, 簡稱ROS)是阿裡雲提供的一項簡化雲計算資源管理的服務。您可以遵循ROS定義的模闆規範編寫資源棧模闆,在模闆中定義所需的雲計算資源(例如ECS執行個體、RDS資料庫執行個體)、資源間的依賴關系等。ROS的編排引擎将根據模闆自動完成所有資源的建立和配置,實作自動化部署及運維。
ROS資源編排接入了大量的阿裡雲資源,目前涉及38個服務,近200個資源,而且還在持續增長中。但使用者有時候會需要使用一些非阿裡雲的資源,如跨雲部署場景。甚至于非雲資源,或是隻是一段複雜的功能邏輯。這種情況下,ROS如何滿足使用者需求?
自定義資源為您提供了一種在 ROS 模闆中編寫自定義配置邏輯并使 ROS 在資源棧操作(如建立、更新或删除資源棧)期間運作該邏輯的方式。例如,您可能需要包含不可作為 阿裡雲 ROS 資源類型的資源。您可以使用自定義資源包含這些資源。這樣,您仍然可以在一個資源棧中管理所有相關資源。
進階篇:
多雲部署AWS篇,
多雲部署Terraform篇。
功能介紹
簡單示例
首先通過一個簡單的示例模闆直覺的感受一下。
模闆中定義了一個自定義資源SimpleTest,類型為Custom::Add。該資源使用FC(函數計算)的函數,以X、Y作為輸入參數,進行加法計算得到一個Z值作為輸出。
ROSTemplateFormatVersion: '2015-09-01'
Resources:
SimpleTest:
Type: Custom::Add
Properties:
ServiceToken: acs:fc:cn-hangzhou:123456789:services/test-service/functions/test-function
Parameters: {X: 1, Y: 2}
Outputs:
SimpleTestOutputs:
Value:
Fn::GetAtt: [SimpleTest, Outputs]
Result:
Value:
Fn::GetAtt: [SimpleTest, Z]
功能說明
資源類型名稱
對于自定義資源,您可以指定 ALIYUN::ROS::CustomResource 作為資源類型,也可以指定自己的資源類型名稱。例如,您可以使用 ALIYUN::ROS::CustomResource,而不使用 Custom::MyCustomResourceTypeName。
自定義資源類型名稱可包含字母數字字元和以下字元:_@-。您可指定最大長度為 68 個字元的自定義資源類型名稱。在更新期間,不能更改類型。
使用自己的資源類型名稱有助于快速區分堆棧中自定義資源的類型。例如,如果您有執行兩種不同 ping 測試的兩個自定義資源,則可以将其類型命名為 Custom::PingTester(而不使用 ALIYUN::ROS::CustomResource)以便友善地識别為 ping 測試器。
資源屬性
為了友善,我們稱服務令牌的提供者為提供商。
自定義資源需包含三個屬性:
- ServiceToken:服務令牌,它指定 阿裡雲 ROS 發送請求的目标,如 阿裡雲 MNS(消息服務) 主題&隊列, 阿裡雲 FC(函數計算) 函數,或 HTTP&HTTPS 服務。
- Parameters:自定義資源的屬性,會通過請求中傳遞給提供商。
- Timeout:等待提供商響應的逾時時間。
資源傳回值
對于自定義資源,傳回值是由自定義資源提供商定義的,并且可通過調用 Fn::GetAtt 在供應商提供的傳回值中進行檢索。
Outputs作為一個特殊的傳回值,包含所有供應商提供的傳回值。
工作原理

對自定義資源執行的任何操作均涉及三方。
- template developer
- 建立包含自定義資源類型的模闆。template developer在模闆中指定服務令牌和所有輸入資料。
- custom resource provider
- 上圖中的“後端服務”。擁有自定義資源并确定如何處理和響應來自 阿裡雲 ROS 的請求。custom resource provider必須提供template developer使用的服務令牌。
- 阿裡雲 ROS
- 在資源棧操作期間,向模闆中指定的服務令牌發送請求,然後等待響應,再繼續資源棧操作。
template developer和custom resource provider可以是同一人員或實體,但過程相同。以下步驟介紹了一般過程:
-
template developer在其模闆中定義自定義資源,該模闆包含服務令牌和任何輸入資料參數。根據自定義資源,輸入資料是可能必需的;但是,服務令牌是總是必需的。
服務令牌指定 阿裡雲 ROS 将請求發送到的位置,例如發送到 阿裡雲 MNS 主題 ARN 或 阿裡雲 FC 函數 ARN。有關更多資訊,請參閱
ALIYUN::ROS::CustomResource 。服務令牌和輸入資料的結構由custom resource provider定義。 -
當任何人使用模闆建立、更新或删除自定義資源時,阿裡雲 ROS 将向指定服務令牌發送請求。服務令牌無區域限制。
在請求中,阿裡雲 ROS 包含請求類型和自定義資源向其發送請求的預簽名 URL 等資訊。有關請求中包含的内容的更多資訊,請參閱
自定義資源請求對象。
在異步請求中(MNS、FC、異步HTTP&HTTPS),custom resource provider必須将響應發送到預簽名的響應 URL。如果不能向 ROS 發送響應,阿裡雲 ROS 不會收到響應,資源棧操作就會失敗。ResponseURL提供了公網響應的能力,InnerResponseURL提供了阿裡雲内網響應的能力。
以下示例資料顯示 阿裡雲 ROS 在請求中包含哪些内容:
{ "RequestType" : "Create", "RequestId" : "unique id for this create request", "ResponseURL" : "pre-signed-url-for-create-response", "InnerResponseURL" : "pre-signed-inner-url-for-create-response", "ResourceType" : "Custom::MyCustomResourceType", "LogicalResourceId" : "name of resource in template", "StackId" : "stack id", "StackName" : "stack name", "ResourceOwnerId": "resource owner id", "CallerId": "caller id", "RegionId": "region id", "ResourceProperties" : { "key1" : "string", "key2" : [ "list" ], "key3" : { "key4" : "map" } } }
-
custom resource provider處理 阿裡雲 ROS 請求并向預簽名 URL 傳回 SUCCESS 或 FAILED 響應。custom resource provider 提供采用 JSON 格式資料響應 URL。
在響應中,custom resource provider還可以包含template developer可以通路的名稱-值對。例如,如果請求成功,響應可以包含輸出資料,如果請求失敗,可以包含錯誤消息。有關響應的更多資訊,請參閱
自定義資源響應對象custom resource provider負責偵聽和響應請求。例如,對于 阿裡雲 MNS主題 通知,custom resource provider 必須偵聽并響應發送到特定主題 ARN 的通知。阿裡雲 ROS 在預簽名 URL 位置等待并偵聽響應。
以下示例資料說明自定義資源在響應中可以包含的内容:
{ "Status" : "SUCCESS", "RequestId" : "unique id for this create request (copied from request)", "LogicalResourceId" : "name of resource in template (copied from request)", "StackId" : "stack id (copied from request)", "PhysicalResourceId" : "required vendor-defined physical id that is unique for that vendor", "Data" : { "keyThatCanBeUsedInGetAtt1" : "data for key 1", "keyThatCanBeUsedInGetAtt2" : "data for key 2" } }
- 獲得 SUCCESS 響應後,阿裡雲ROS 繼續堆棧操作。如果收到 FAILED 響應或未傳回任何響應,則操作失敗。來自自定義資源的所有輸出資料都由預簽名 URL 響應傳回。template developer可使用 Fn::GetAtt 函數檢索該資料。
執行個體測試
上述簡單示例的完整模闆。
ROSTemplateFormatVersion: '2015-09-01'
Parameters:
ServiceName:
Type: String
Default: test-service
FunctionName:
Type: String
Default: test-function
Timeout:
Type: Number
Default: 60
X:
Type: Number
Y:
Type: Number
Resources:
Service:
Type: ALIYUN::FC::Service
Properties:
ServiceName:
Ref: ServiceName
Function:
Type: ALIYUN::FC::Function
Properties:
ServiceName:
Fn::GetAtt: [Service, ServiceName]
FunctionName:
Ref: FunctionName
Handler: index.handler
Runtime: python2.7
Code:
SourceCode: |
import time
import json
import urllib2
import logging
def handler(event, context):
logger = logging.getLogger()
event = json.loads(event)
logger.info('receive request: %s', event)
res_props = event['ResourceProperties']
result = dict(
RequestId=event['RequestId'],
LogicalResourceId=event['LogicalResourceId'],
StackId=event['StackId'],
Status='SUCCESS',
PhysicalResourceId='dummy'
)
if event['RequestType'] != 'Delete':
result['Data'] = dict(z=res_props['X'] + res_props['Y'])
headers = {
'Content-type': 'application/json',
'Accept': 'application/json',
'Date': time.strftime('%a, %d %b %Y %X GMT', time.gmtime())
}
req = urllib2.Request(event['ResponseURL'], data=json.dumps(result), headers=headers)
resp = urllib2.urlopen(req)
resp_content = resp.read()
logger.info('response: %s', resp_content)
SimpleTest:
Type: Custom::Add
Properties:
ServiceToken:
Fn::GetAtt: [Function, ARN]
Parameters:
X:
Ref: X
Y:
Ref: Y
Timeout:
Ref: Timeout
Outputs:
SimpleTestOutputs:
Value:
Fn::GetAtt: [SimpleTest, Outputs]
Result:
Value:
Fn::GetAtt: [SimpleTest, Z]
在ROS控制台進行建立。
資源清單:
輸出清單:
可以看到,這個模闆雖然簡單,但示範了如何把自定義資源與自定義後端服務關聯,并傳遞輸入和擷取輸出的完整流程。
有了這個功能,在ROS上實作多雲管理或是其他複雜邏輯都成為了可能。