天天看點

資源編排ROS之自定制資源(基礎篇)背景功能介紹執行個體測試

背景

資源編排服務

(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作為一個特殊的傳回值,包含所有供應商提供的傳回值。

工作原理

資源編排ROS之自定制資源(基礎篇)背景功能介紹執行個體測試

對自定義資源執行的任何操作均涉及三方。

  • template developer
    • 建立包含自定義資源類型的模闆。template developer在模闆中指定服務令牌和所有輸入資料。
  • custom resource provider
    • 上圖中的“後端服務”。擁有自定義資源并确定如何處理和響應來自 阿裡雲 ROS 的請求。custom resource provider必須提供template developer使用的服務令牌。
  • 阿裡雲 ROS
    • 在資源棧操作期間,向模闆中指定的服務令牌發送請求,然後等待響應,再繼續資源棧操作。

template developer和custom resource provider可以是同一人員或實體,但過程相同。以下步驟介紹了一般過程:

  1. template developer在其模闆中定義自定義資源,該模闆包含服務令牌和任何輸入資料參數。根據自定義資源,輸入資料是可能必需的;但是,服務令牌是總是必需的。

    服務令牌指定 阿裡雲 ROS 将請求發送到的位置,例如發送到 阿裡雲 MNS 主題 ARN 或 阿裡雲 FC 函數 ARN。有關更多資訊,請參閱

    ALIYUN::ROS::CustomResource 。服務令牌和輸入資料的結構由custom resource provider定義。
  2. 當任何人使用模闆建立、更新或删除自定義資源時,阿裡雲 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" }
       }
    }
    						           
  3. 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"
       }
    }           
  4. 獲得 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之自定制資源(基礎篇)背景功能介紹執行個體測試

資源清單:

資源編排ROS之自定制資源(基礎篇)背景功能介紹執行個體測試

輸出清單:

資源編排ROS之自定制資源(基礎篇)背景功能介紹執行個體測試

可以看到,這個模闆雖然簡單,但示範了如何把自定義資源與自定義後端服務關聯,并傳遞輸入和擷取輸出的完整流程。

有了這個功能,在ROS上實作多雲管理或是其他複雜邏輯都成為了可能。

繼續閱讀