使用自定義資源,您可以在模板中編寫自定義配置邏輯,當您創建、更新(如果您更改了自定義資源)或刪除資源棧時,ROS會運行該邏輯。例如:您可能需要使用不可作為ROS資源類型的資源,此時可以在模板中自定義資源,從而在一個資源棧中管理所有相關資源。
自定義資源介紹
您可以使用ALIYUN::ROS::CustomResource或Custom::MyCustomResourceTypeName資源類型在模板中定義自定義資源。自定義資源需要一個屬性,即服務令牌,它指定ROS發送請求的目標,如SMQ(輕量消息隊列(原 MNS))主題和隊列,FC(函數計算)函數或HTTP和HTTPS服務。
自定義資源必須將響應發送到預簽名的響應URL。如果不能向ROS發送響應,資源棧操作會失敗。ResponseURL提供了公網響應的能力,IntranetResponseURL提供了阿里云內網響應的能力。
自定義資源的工作原理
自定義資源執行的操作涉及以下對象:
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等信息。更多信息,請參見自定義資源請求對象。
以下示例列出ROS在請求中包含的內容:
{ "RequestType" : "Create", "RequestId" : "unique id for this create request", "ResponseURL" : "pre-signed-url-for-create-response", "IntranetResponseURL" : "pre-signed-intranet-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函數檢索該數據。
最佳實踐
通過函數計算(FC)實現復雜邏輯處理。
通過函數計算(FC)與AWS CloudFormation部署AWS資源,從而達到多云部署的目標。
通過HTTP和HTTPS與Terraform部署AWS資源,從而達到多云部署的目標。