DataWorks には、タスクデプロイ前のコードレビューおよび Data Governance Center による検証など、組み込みのチェック機能が提供されています。さらに、カスタム検証ロジックを統合して、DataWorks 内でのプロセス制御を強化することも可能です。本トピックでは、ファイルの提出またはデプロイ時に MAX_PT 関数をチェックする例を通じて、ワークスペース内で特定の関数を禁止するための拡張機能の使用方法を説明します。
利用シーン
このベストプラクティスでは、提出・デプロイされるコード内に MAX_PT 関数が含まれているかどうかをチェックする方法を例示します。以下の表は、検証プロセスを説明しています。
|
ステップ |
コアプロセス |
キーフィーチャー |
|
1 |
Open Event がワークスペースから EventBridge へファイル提出およびデプロイに関するメッセージ(ノードの提出・デプロイなど)を送信します。EventBridge はイベントメッセージをフィルター処理し、お客様のサービスへ転送します。 |
メッセージサブスクリプションを有効にする際は、イベントルールを使用して特定のイベントタイプ(ファイル提出 (dataworks:FileChange:CommitFile) やファイルデプロイ (dataworks:FileChange:DeployFile) など)をサブスクライブします。 構成の詳細については、「ベストプラクティス:(高度な機能)MAX_PT 関数の禁止」をご参照ください。 |
|
2 |
ローカルまたはオンラインサービスがメッセージを受信します。拡張機能は以下のようにイベントを処理するように構成されています。
|
構成の詳細については、「ベストプラクティス:(高度な機能)MAX_PT 関数の禁止」をご参照ください。 |
前提条件
-
EventBridge が有効化されている必要があります。詳細については、「EventBridge の有効化」をご参照ください。
-
DataWorks が有効化されています。詳細については、「DataWorks の有効化」をご参照ください。
-
DataWorks ワークスペースが作成済みである必要があります。詳細については、「ワークスペースの作成」をご参照ください。
操作手順
ステップ 1:カスタムイベントバスの構成
-
EventBridge コンソールにログインします。左側のナビゲーションウィンドウで、Event Bus をクリックしてイベントバスページに移動します。
-
ボタンをクリックして、カスタムイベントバスの作成 を行います。-
バス セクションで、カスタムイベントバス名 を構成し、Next step をクリックしてイベントソースの構成に進みます。
-
Skip をクリックして、イベントソース、Rule、および ターゲットモジュール の構成をスキップします。説明 を入力します。
-
-
左側のナビゲーションウィンドウで、Event Bus をクリックしてイベントバスページに移動します。作成したイベントバスを見つけ、その名前をクリックして概要ページに移動します。
-
左側のナビゲーションウィンドウで [イベントルール] をクリックしてイベントルールページに移動し、[イベントルールの作成] をクリックしてイベントルールを作成します。
-
この例では、カスタム EventBridge バスを構成して、DataWorks からのファイルコミットおよびファイルデプロイイベントメッセージを受信します。以下のセクションでは、構成デモと主要パラメーターについて説明します。
-
基本情報の構成: ルール名を任意に設定します。
-
パターンコンテンツ。
-
イベントソースタイプ:カスタムイベントソースを選択します。
-
イベントソース:このフィールドは空のままにします。
-
パターンコンテンツ:JSON 形式で記述します。構成は以下のとおりです。
{ "source": [ "acs.dataworks" ], "type": [ "dataworks:FileChange:CommitFile", "dataworks:FileChange:DeployFile" ] }-
source:プロダクト名識別子 acs.dataworks を定義します。
-
type:プロダクト下のイベントタイプ識別子を定義します。dataworks:FileChange:CommitFile および dataworks:FileChange:DeployFile を設定します。
-
-
イベントパターンのデバッグ:source および type の値を入力・変更し、イベントテストを実行します。テストが成功したら、[次へ] をクリックします。[テスト] をクリックして、カスタムイベントがパターンに一致するか確認します。テストに合格すると、ページに マッチに成功しました。イベントは正常にトリガーできます と表示されます。
-
-
イベントターゲットの構成。
-
Service Type:HTTPS または HTTP を選択します。その他のサービスタイプについては、「イベントターゲット」をご参照ください。
-
URL:カスタムバスによってプッシュされたメッセージを受信する URL を入力します(例:
https://server-address:port/extensions/consumer)。 -
Body:完全なイベントを選択します。
-
ネットワークタイプ:パブリックネットワークを選択します。
-
-
-
ステップ 2:イベントディストリビューションチャンネルの構成
DataWorks コンソールにログインします。対象のリージョンで、左側のナビゲーションウィンドウのをクリックします。入力 オープンプラットフォームをクリックして、[開発者バックエンド]ページを開きます。
-
開発者バックエンドページで、左側のナビゲーションウィンドウの OpenEvent をクリックします。表示されたページで、イベントディストリビューションチャンネルの追加 をクリックし、ダイアログで設定を行います。
-
イベントディストリビューション用ワークスペース:作成済みのワークスペースを選択します。
-
ディストリビューション用 EventBridge のカスタムバス:ステップ 1 で作成したイベントバスを選択します。
-
-
イベントディストリビューションチャンネルを保存後、チャンネルの 操作 列で、Enable をクリックして、新規イベントディストリビューションチャンネルを有効化します。
ステップ 3:拡張機能の登録および構成
DataWorks コンソールにログインします。対象のリージョンで、左側のナビゲーションウィンドウのをクリックします。入力 オープンプラットフォームをクリックして、[開発者バックエンド]ページを開きます。
-
開発者バックエンドページで、左側のナビゲーションウィンドウの 拡張機能 をクリックします。表示されたページで、レジスター拡張子 をクリックし、ダイアログで設定を行います。
-
デプロイ方法:セルフビルドサービスによるデプロイを選択します。
-
拡張機能の登録
-
拡張名:任意の名前を入力します。
-
処理エクステンションポイント:ファイルコミット前 および ファイルデプロイ前 を選択します。
-
テスト用ワークスペース:この設定を構成することで、提出前に指定されたワークスペースで拡張機能をテストできます。
-
プログラムパラメーター設定の拡張
このパラメーターを使用して、拡張機能の適用範囲を制御できます。指定されたワークスペースでは、以下のようになります。
-
ノードの提出 (ファイルコミット前) では、拡張機能の検証はトリガーされず、提出プロセスはブロックされません。
-
ノードのデプロイ (ファイルデプロイ前) では、拡張機能の検証がトリガーされます。検証に失敗した場合、デプロイプロセスがブロックされます。
これを
extension.project.commit-file.disabled=YourProjectIdに設定します。ここで YourProjectId は、拡張ポイントイベントが適用されないワークスペース ID です。 -
-
Options for Extension:検証失敗時の応答方法を定義するために使用します。この例では、指定された応答方法にアラートとブロックが含まれています。
{ "type":"object", "properties":{ "checkStatus":{ "type":"number", "title":"MAX-PT 関数チェック方法", "x-decorator":"FormItem", "x-component":"Radio.Group", "x-decorator-props":{ "tooltip":"説明ファイル" }, "x-component-props":{ "dataSource":[ { "value":"WARN", "label":"警告" }, { "value":"FAIL", "label":"無効" } ], "mode":"multiple" } } } }オプション構成のフィールドは以下のとおりです。
-
checkStatus:拡張機能開発者がオプション構成で定義するカスタムフィールド名(コンポーネント名、一意である必要があります)。拡張機能サーバーは、このフィールド名を通じてワークスペース管理者がワークスペースに対して構成した値を読み取ります。 -
title:オプションのタイトル。値については、「高度な機能:拡張機能オプション構成」のパラメーター解析および構成例をご参照ください。この例では、タイトルは MAX-PT 関数チェック方法 です。 -
x-component:オプションで使用されるフォームコンポーネント。この例では、ラジオボタンコンポーネント (Radio.Group) が使用されています。 -
dataSource:ラジオボタンコンポーネントの選択可能なオプション。labelは UI に表示されるテキスト、valueは対応する識別子です。この例では、2 つの値が提供されています。アラート (WARN) および ブロック (FAIL)。これにより、ワークスペース管理者は拡張機能の有効化時に MAX_PT 関数が検出された際の応答方法を選択できます。
本トピックの サンプルコード と組み合わせることで、
checkStatusの値の流れを理解できます。ワークスペース管理者が拡張機能を有効化する際、MAX-PT 関数チェック方法 から アラート または ブロック を選択します。拡張機能サーバーはGetOptionValueForProjectを通じてこの構成を読み取り、jsonObject.getString("checkStatus")で管理者の選択を取得し、setCheckResultをコールバックとして DataWorks に結果を返し、ノードのデプロイプロセスに対してアラートまたはブロックを行います。説明checkStatusはラジオボタンコンポーネントを使用した構成例の一つにすぎません。オプション構成では現在、テキスト、単一行入力、複数行入力、単一選択ドロップダウン、複数選択ドロップダウン、チェックボックス、ラジオボタンの 7 種類のコンポーネントタイプがサポートされています。コンポーネントタイプおよび構成方法の完全なリストについては、「高度な機能:拡張機能オプションの構成」をご参照ください。 -
-
-
-
構成が完了したら、Determine をクリックして、拡張機能を保存・登録します。
-
作成した拡張機能の 操作 列で、Submit をクリックして、拡張機能をレビューに提出します。
説明-
拡張機能のレビューは DataWorks プラットフォームによって実施されます。レビュー完了まで通常 T+3 営業日かかります。
-
作成した拡張機能をテストするには、テスト用ワークスペース を構成してください。
-
-
レビュー承認後、操作列の [デプロイ] をクリックして、拡張機能をオンラインにします。
-
Manage Extensions をクリックして、 ページに移動します。作成した拡張機能を選択し、[有効化] 列で有効化して、[設定] をクリックしてワークスペース内の MAX_PT 関数使用に対する制御レベルを構成します。
拡張機能の開発および構成
EventBridge は、HTTP リクエストを通じて JSON 形式の DataWorks イベントメッセージを受信し、メッセージを解析してターゲットサービスにプッシュします。サービスがイベントを処理した後、結果を DataWorks に返します。
サンプルコード
このコードサンプルは、UpdateIDEEventResult API を呼び出してコールバック結果を返します。API の messageId パラメーターを使用してイベント詳細を取得し、制限された関数が使用されているかどうかを判断するロジックを実行し、UpdateIDEEventResult API を通じて結果を DataWorks に返します。詳細については、「拡張機能の開発」をご参照ください。
環境セットアップ:Java 8、Maven ビルドツール。
package com.aliyun.dataworks.demo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dataworks.config.Constants;
import com.aliyun.dataworks.config.EventCheckEnum;
import com.aliyun.dataworks.config.ExtensionParamProperties;
import com.aliyun.dataworks.services.DataWorksOpenApiClient;
import com.aliyun.dataworks_public20200518.Client;
import com.aliyun.dataworks_public20200518.models.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author dataworks demo
*/
@RestController
@RequestMapping("/extensions")
public class ExtensionsController {
@Autowired(required = false)
private DataWorksOpenApiClient dataWorksOpenApiClient;
@Autowired
private ExtensionParamProperties extensionParamProperties;
/**
* EventBridge によってプッシュされたメッセージを受信
*
* @param jsonParam
*/
@PostMapping("/consumer")
public void consumerEventBridge(@RequestBody String jsonParam) {
JSONObject jsonObj = JSON.parseObject(jsonParam);
String eventCode = jsonObj.getString(Constants.EVENT_CODE_FILED);
if (Constants.COMMIT_FILE_EVENT_CODE.equals(eventCode) || Constants.DEPLOY_FILE_EVENT_CODE.equals(eventCode)) {
//クライアントを初期化
Client client = dataWorksOpenApiClient.createClient();
try {
//現在のイベントパラメーター情報
String messageId = jsonObj.getString("id");
JSONObject data = jsonObj.getObject("data", JSONObject.class);
Long projectId = data.getLong("projectId");
//イベントコールバックを初期化
UpdateIDEEventResultRequest updateIDEEventResultRequest = new UpdateIDEEventResultRequest();
updateIDEEventResultRequest.setMessageId(messageId);
updateIDEEventResultRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
//拡張ポイントイベントがトリガーされた時点の拡張ポイントデータスナップショットを照会
GetIDEEventDetailRequest getIDEEventDetailRequest = new GetIDEEventDetailRequest();
getIDEEventDetailRequest.setMessageId(messageId);
getIDEEventDetailRequest.setProjectId(projectId);
GetIDEEventDetailResponse getIDEEventDetailResponse = client.getIDEEventDetail(getIDEEventDetailRequest);
String content = getIDEEventDetailResponse.getBody().getEventDetail().getCommittedFile().getContent();
//コードに制限された関数が含まれているかどうかをチェック
if (content.contains(Constants.CHECK_CODE)) {
//ワークスペースの拡張機能オプション構成を取得
GetOptionValueForProjectRequest getOptionValueForProjectRequest = new GetOptionValueForProjectRequest();
getOptionValueForProjectRequest.setProjectId(String.valueOf(projectId));
getOptionValueForProjectRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
GetOptionValueForProjectResponse getOptionValueForProjectResponse = client.getOptionValueForProject(getOptionValueForProjectRequest);
JSONObject jsonObject = JSON.parseObject(getOptionValueForProjectResponse.getBody().getOptionValue());
//注:DataWorks で構成された実際のフォーマットに従って記入
String checkStatus = jsonObject.getString("checkStatus");
updateIDEEventResultRequest.setCheckResult(checkStatus);
updateIDEEventResultRequest.setCheckResultTip("コード内に制限された関数が見つかりました");
} else {//成功コールバック
updateIDEEventResultRequest.setCheckResult(EventCheckEnum.OK.getCode());
updateIDEEventResultRequest.setCheckResultTip(EventCheckEnum.OK.getName());
}
//DataWorks へのコールバック
UpdateIDEEventResultResponse response = client.updateIDEEventResult(updateIDEEventResultRequest);
//後続のトラブルシューティング用の一意なリクエスト ID
System.out.println("response:" + response.getBody().getRequestId());
} catch (Exception e) {
//エラーの説明
System.out.println("ErrMsg:" + e.getMessage());
}
} else {
System.out.println("他のイベントのフィルターに失敗しました。構成手順を確認してください");
}
}
}
サンプルプロジェクトのデプロイ
-
環境およびプロジェクトの準備
-
必要な環境:Java 8 以降、Maven ビルドツール。
-
プロジェクトダウンロードリンク:extensions-demo-maxpt.zip (219 KB)。
-
-
デプロイ方法
-
ローカルデプロイ:プロジェクトを JAR ファイルとしてパッケージ化し、Java 8 および Maven がインストールされたローカルサーバー上で
java -jar yourapp.jarコマンドを実行してサービスを起動します。 -
クラウドデプロイ:プロジェクトを JAR ファイルとしてパッケージ化し、Docker コンテナやクラウドサーバーなどの適切な実行環境にアップロードしてデプロイします。
説明デプロイされたサービスは、EventBridge からインターネット経由でアクセス可能である必要があります。
-
-
プロジェクトをダウンロード後、ルートディレクトリに移動し、パッケージングコマンドを実行して JAR ファイルをビルドします。
mvn clean package -Dmaven.test.skip=true spring-boot:repackage -
JAR ファイルを実行します。
java -jar target/extensions-demo-maxpt-1.0.jarプロジェクトが正常に起動します。
/\ / /'---'. __ __ ____ /'\'\\ ( ( )\'---'| '--'| '--'\/'--'| '\ \\\\ \/ /__) | |__| | | |__(___| | ) ) ) ) ' '__| | |__| |'| |___| | / / / / =========|_|===============|__/=/=/_/ :: Spring Boot :: (v2.7.2) 2022-08-22 11:17:35.261 INFO 28648 --- [ main] com.aliyun.dataworks.DemoStarter : Starting DemoStarter v1.0 using Java 1.8.0_151 on xxx.local with PID 28648 (/Users/xxx/ts/extensions-demo-maxpt ns-demo-maxpt/target/extensions-demo-maxpt-1.0.jar started by guangzhen.zk in /Users/xxx/ts/extensions-demo-maxpt) 2022-08-22 11:17:35.264 INFO 28648 --- [ main] com.aliyun.dataworks.DemoStarter : No active profile set, falling back to 1 default profile: "default" 2022-08-22 11:17:35.276 INFO 28648 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2022-08-22 11:17:36.291 INFO 28648 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2022-08-22 11:17:36.291 INFO 28648 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.65] 2022-08-22 11:17:36.419 INFO 28648 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2022-08-22 11:17:36.419 INFO 28648 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1099 ms 2022-08-22 11:17:36.851 INFO 28648 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2022-08-22 11:17:36.860 INFO 28648 --- [ main] com.aliyun.dataworks.DemoStarter : Started DemoStarter in 1.98 seconds (JVM running for 2.449)ブラウザで
http://localhost:8080/indexを入力します。"hello world!"が表示された場合、アプリケーションは正常にデプロイされています。ネットワーク接続を確立した後、EventBridge メッセージをサブスクライブできます。
結果の検証
コードのデプロイが完了し、EventBridge とのネットワーク接続が確立された後、拡張機能が有効化されているワークスペースで構成を検証できます。
検証手順
-
Data Studio ページでノードを作成し、ノード内に禁止されている
MAX_PT関数を記述して、ノードを保存・提出します。 -
[デプロイ] ボタンをクリックしてデプロイメントパッケージ作成ページに移動し、ノードをデプロイします。これにより拡張機能の検証がトリガーされます。
説明拡張機能の構成に基づき、指定されたワークスペースではファイル提出イベントに対して拡張機能は適用されません。そのため、
MAX_PT関数を含むノードを提出しても、拡張機能の検証はトリガーされません。拡張機能は、MAX_PT関数を含むノードをデプロイする場合にのみトリガーされます。