カスタムリソースを使用すると、カスタムロジックを Resource Orchestration Service (ROS) テンプレートに埋め込むことができます。 ROS は、スタックを作成、更新、または削除するときにこのロジックを実行します。カスタムリソースを使用して、ROS がネイティブにサポートしていないリソースタイプを管理し、すべてのリソースを単一のスタックに保持できます。
カスタムリソースについて
テンプレートでカスタムリソースを定義するには、ALIYUN::ROS::CustomResource または Custom::MyCustomResourceTypeName リソースタイプを使用します。各カスタムリソースには、ROS がリクエストを送信する場所を指定するサービストークンが必要です。送信先には、SMQ (Simple Message Queue (formerly MNS)) のトピックやキュー、Function Compute (FC) の関数、または HTTP および HTTPS サービスなどがあります。
カスタムリソースは、署名付き URL にレスポンスを送信する必要があります。レスポンスが送信されない場合、スタック操作は失敗します。パブリックネットワーク経インのレスポンスには ResponseURL を、Alibaba Cloud の内部ネットワーク経由のレスポンスには IntranetResponseURL を使用します。
カスタムリソースの仕組み
カスタムリソースの操作には、3 つのエンティティが関わります:
-
テンプレート開発者:カスタムリソースタイプ、サービストークン、および入力データを含むテンプレートを作成します。
-
カスタムリソースプロバイダー:カスタムリソースを所有し、ROS リクエストの処理方法とレスポンス方法を決定し、テンプレート開発者にサービストークンを提供します。
-
ROS:スタック操作中にテンプレートで指定されたサービストークンにリクエストを送信し、処理を続行する前にレスポンスを待機します。
テンプレート開発者とカスタムリソースプロバイダーは、同一人物または同一エンティティである場合があります。カスタムリソースのワークフローは次のとおりです:
-
テンプレート開発者は、必要なサービストークンとオプションの入力データパラメーターを使用して、テンプレート内にカスタムリソースを定義します。
サービストークンは、「ALIYUN::ROS::CustomResource」で定義されているように、ROS がリクエストを送信する場所 (SMQ トピックの Alibaba Cloud リソースネーム (ARN) や FC 関数の ARN など) を指定します。カスタムリソースプロバイダーは、サービストークンの構造と入力データを定義します。
-
カスタムリソースを作成、更新、または削除すると、ROS は指定されたサービストークンにリクエストを送信します。サービストークンにリージョン制限はありません。
ROS のリクエストには、リクエストタイプ、署名付きレスポンス URL、および「Custom resource request objects」で説明されているその他のメタデータが含まれます。
リクエストの例:
{ "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" } } } -
カスタムリソースプロバイダーはリクエストを処理し、
SUCCESSまたはFAILEDの JSON レスポンスを署名付き URL に返します。レスポンスには、「Custom resource response objects」で説明されているように、成功時には出力データ、失敗時にはエラーメッセージを含めることができます。
プロバイダーは、リクエストをリッスンして応答する必要があります。たとえば、SMQ ベースのプロバイダーは、指定されたトピック 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" } } -
ROS が
SUCCESSレスポンスを受信すると、スタック操作を続行します。FAILEDレスポンスを受信した場合、またはレスポンスがない場合は、操作が失敗します。テンプレート開発者は、Fn::GetAtt関数を使用して、レスポンスから出力データを取得できます。