カスタムリソースを使用すると、テンプレートにカスタム構成ロジックを記述できます。Resource Orchestration Service(ROS)は、スタックの作成、更新(カスタムリソースを変更した場合)、または削除を行うたびに、このロジックを実行します。たとえば、カスタムリソースを使用して、ROSでサポートされていないリソースタイプを含めることができます。このようにして、関連するすべてのリソースを単一のスタックで管理できます。
ALIYUN::ROS::CustomResource または Custom::MyCustomResourceTypeName リソースタイプを使用して、テンプレートでカスタムリソースを定義できます。カスタムリソースでは、ROSがリクエストを送信するターゲットを指定するプロパティが必要です。このプロパティは、Message Service(MNS)トピックまたはキュー、Function Compute関数、あるいは HTTP または HTTPS URL であるサービストークンです。
カスタムリソースは、署名済みレスポンス URL にレスポンスを送信する必要があります。ROS にレスポンスを送信できない場合、ROS はレスポンスを受信せず、スタック操作は失敗します。ResponseURL はインターネットで使用され、InnerResponseURL は Alibaba Cloud の内部ネットワークで使用されます。
カスタムリソースのしくみ
カスタムリソース操作には、3 つの関係者が関与します。
- テンプレート開発者
- テンプレート開発者は、カスタムリソースタイプを含むテンプレートを作成します。テンプレート開発者は、サービストークンとすべての入力データをテンプレートに指定します。
- カスタムリソースプロバイダー
- カスタムリソースプロバイダーは、カスタムリソースを所有し、ROS からのリクエストの処理方法と応答方法を決定します。カスタムリソースプロバイダーは、テンプレート開発者にサービストークンを提供する必要があります。
- ROS
- スタック操作中に、ROS はテンプレートで指定されたサービストークンにリクエストを送信し、レスポンスを待って続行します。
- テンプレート開発者は、テンプレートでカスタムリソースを定義します。テンプレートには、サービストークンとすべての入力データパラメーターが含まれています。カスタムリソースは、入力データパラメーターが必要かどうかを判断します。サービストークンは常に必須です。
サービストークンは、ROS がリクエストを送信する場所を指定します。たとえば、MNS トピック ARN や Function Compute 関数 ARN などです。詳細については、「ALIYUN::ROS::CustomResource」をご参照ください。サービストークンと入力データの構造は、カスタムリソースプロバイダーによって定義されます。
- テンプレートを使用してカスタムリソースを作成、更新、または削除すると、ROS は指定されたサービストークンにリクエストを送信します。サービストークンのリージョンに制限はありません。
ROS リクエストには、リクエストタイプや、カスタムリソースがリクエストを送信する署名済み URL などの情報が含まれています。詳細については、「カスタムリソースリクエストオブジェクト」をご参照ください。
次のサンプルデータは、ROS リクエストに含まれるコンテンツを示しています。
{ "RequestType" : "Create", // リクエストタイプ "RequestId" : "unique id for this create request", // この作成リクエストの一意のID "ResponseURL" : "pre-signed-url-for-create-response", // 作成レスポンス用の署名済みURL "InnerResponseURL" : "pre-signed-inner-url-for-create-response", // 作成レスポンス用の署名済み内部URL "ResourceType" : "Custom::MyCustomResourceType", // リソースタイプ "LogicalResourceId" : "name of resource in template", // テンプレート内のリソース名 "StackId" : "stack id", // スタックID "StackName" : "stack name", // スタック名 "ResourceOwnerId": "resource owner id", // リソース所有者ID "CallerId": "caller id", // 呼び出し元ID "RegionId": "region id", // リージョンID "ResourceProperties" : { // リソースプロパティ "key1" : "string", "key2" : [ "list" ], "key3" : { "key4" : "map" } } } - カスタムリソースプロバイダーは ROS リクエストを処理し、署名済み URL に SUCCESS または FAILED レスポンスを返します。カスタムリソースプロバイダーは、JSON 形式のレスポンスデータを含むレスポンス URL を提供します。
カスタムリソースプロバイダーは、テンプレート開発者がレスポンスでアクセスできる名前と値のペアを含めることもできます。たとえば、レスポンスには、リクエストが成功した場合は出力データ、リクエストが失敗した場合はエラーメッセージを含めることができます。詳細については、「カスタムリソースレスポンスオブジェクト」をご参照ください。
カスタムリソースプロバイダーは、リクエストをリッスンして応答する責任があります。たとえば、カスタムリソースプロバイダーは、特定のトピック ARN に送信された MNS トピック通知をリッスンして応答する必要があります。ROS は、署名済み URL の場所でレスポンスを待機してリッスンします。
次のサンプルデータは、カスタムリソースがレスポンスに含めることができるコンテンツを示しています。
{ "Status" : "SUCCESS", // ステータス "RequestId" : "unique id for this create request (copied from request)", // この作成リクエストの一意のID(リクエストからコピー) "LogicalResourceId" : "name of resource in template (copied from request)", // テンプレート内のリソース名(リクエストからコピー) "StackId" : "stack id (copied from request)", // スタックID(リクエストからコピー) "PhysicalResourceId" : "required vendor-defined physical id that is unique for that vendor", // ベンダー固有の一意の物理ID(必須) "Data" : { // データ "keyThatCanBeUsedInGetAtt1" : "data for key 1", // Fn::GetAttで使用できるキー1のデータ "keyThatCanBeUsedInGetAtt2" : "data for key 2" // Fn::GetAttで使用できるキー2のデータ } } - SUCCESS レスポンスを受信した後、ROS はスタック操作を続行します。FAILED レスポンスまたはレスポンスが返されない場合は、操作が失敗したことを示します。カスタムリソースからのすべての出力データは、署名済み URL の場所に保存されます。テンプレート開発者は、Fn::GetAtt 関数を使用してデータを取得できます。