使用自定义资源,您可以在模板中编写自定义配置逻辑,每次创建、更新(如果您更改了自定义资源)或删除资源栈时,阿里云ROS都会运行该逻辑。例如,您可能需要包含不可作为阿里云ROS资源类型的资源。您可以使用自定义资源包含这些资源。这样,您仍然可以在一个资源栈中管理所有相关资源。

自定义资源介绍

使用ALIYUN::ROS::CustomResource或Custom::MyCustomResourceTypeName资源类型在模板中定义自定义资源。自定义资源需要一个属性,即服务令牌,它指定阿里云ROS发送请求的目标,如阿里云MNS(消息服务)主题&队列,阿里云FC(函数计算)函数,或HTTP&HTTPS服务。

自定义资源必须将响应发送到预签名的响应URL。如果不能向ROS发送响应,阿里云ROS不会收到响应,资源栈操作就会失败。ResponseURL提供了公网响应的能力,IntranetResponseURL提供了阿里云内网响应的能力。

自定义资源的工作原理

自定义资源执行的任何操作均涉及三方。

  • 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等信息。有关请求中包含内容的更多信息,请参见自定义资源请求对象

    以下示例数据显示阿里云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" }
       }
    }
    						
  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函数检索该数据。