使用自定义资源,您可以在模板中编写自定义配置逻辑,当您创建、更新(如果您更改了自定义资源)或删除资源栈时,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可以是同一人员或实体,但过程相同。自定义资源的步骤如下:

  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函数检索该数据。

最佳实践