使用自定义资源,您可以在模板中编写自定义配置逻辑,当您创建、更新(如果您更改了自定义资源)或删除资源栈时,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资源,从而达到多云部署的目标。