DataWorks は、タスクデプロイ前のコードレビューやデータガバナンスセンターでのガバナンス項目の組み込みチェックなど、組み込みのプロセスチェックを提供します。また、DataWorks は、DataWorks のプロセスを管理するために統合できるカスタムチェックロジックもサポートしています。このトピックでは、コミットおよびデプロイ時にコード内の MAX_PT 関数をチェックする例を用いて、拡張機能を使用してワークスペース内の特定の関数の使用を禁止する方法を説明します。
シナリオの説明
このベストプラクティスでは、コミットおよび公開されたコード内の MAX_PT 関数をチェックする例を提供します。チェックプロセスは次のとおりです:
No. | コアプロセス | コア機能 |
1 | ワークスペースから OpenEvent を通じて EventBridge にファイルのコミットおよび公開メッセージを送信します。その後、EventBridge はメッセージをフィルター処理し、ご利用のサービスに送信します。 | メッセージサブスクリプションを有効にする際、イベントルールでイベントタイプとしてファイルのコミットと公開 (dataworks:FileChange:CommitFile および dataworks:FileChange:DeployFile) を指定します。 詳細については、「ベストプラクティス:MAX_PT 関数の使用禁止 (高度な機能)」をご参照ください。 |
2 | ローカルまたはオンラインのサービスがメッセージを受信します。拡張機能を設定して、次の結果を実現します:
|
詳細については、「ベストプラクティス:MAX_PT 関数の使用禁止 (高度な機能)」をご参照ください。 |
前提条件
EventBridge が有効化されていること。詳細については、「課金」をご参照ください。
DataWorks が有効化されていること。詳細については、「購入ガイド」をご参照ください。
DataWorks でワークスペースが作成されていること。詳細については、「ワークスペースの作成」をご参照ください。
操作手順
ステップ 1:カスタムイベントバスの設定
EventBridge コンソールにログインします。左側のナビゲーションウィンドウで、[イベントバス] をクリックして、イベントバス作成ページを開きます。
[カスタムイベントバスの作成] ボタンをクリックします。[バス] モジュールで、[カスタムイベントバス名] を設定し、[次へ] をクリックしてイベントソースを設定します。
[スキップ] をクリックして、[イベントソース]、[ルール]、および [ターゲットモジュール] の設定をバイパスします。

左側のナビゲーションウィンドウで、[イベントバス] をクリックして [イベントバス] ページに移動します。作成したイベントバスを見つけて、その名前をクリックして概要ページに移動します。
左側のナビゲーションウィンドウで、[イベントルール] をクリックします。次に、[ルールの作成] をクリックします。
このベストプラクティスでは、カスタム 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 の値を追加または変更し、イベントをテストします。テストが成功したら、[次へ] をクリックします。

イベントターゲットの構成。
[サービスタイプ]:[HTTPS] または [HTTP] を選択します。詳細については、「イベントルールの管理」をご参照ください。
[URL]:カスタムバスからプッシュされたメッセージを受信するための URL を入力します。例:
https://server_address:port_number/extensions/consumer。[ボディ] には、完了イベントを選択します。
[ネットワークタイプ] を [パブリックネットワーク] に設定します。

ステップ 2:イベント配信チャネルの設定
[開発者バックエンド] タブに移動します。
DataWorks コンソールにログインします。上部のナビゲーションバーで、目的のリージョンを選択します。左側のナビゲーションウィンドウで、を選択します。表示されたページで、[オープンプラットフォームへ] をクリックします。[開発者バックエンド] タブが表示されます。
[開発者バックエンド] ページで、左側のナビゲーションウィンドウの [OpenEvent] をクリックします。表示されたページで、[イベント配信チャネルの追加] をクリックし、ダイアログボックスでパラメーターを設定します。
[イベント配信用のワークスペース]:作成したワークスペースを選択します。
[配信用のカスタム EventBridge バス]:ステップ 1 で作成したイベントバスを選択します。
イベント配信チャネルを保存した後、チャネルを見つけて、[操作] 列の [有効化] をクリックします。

ステップ 3:拡張機能 (Extension) の登録と設定
[開発者バックエンド] タブに移動します。
DataWorks コンソールにログインします。上部のナビゲーションバーで、目的のリージョンを選択します。左側のナビゲーションウィンドウで、を選択します。表示されたページで、[オープンプラットフォームへ] をクリックします。[開発者バックエンド] タブが表示されます。
[開発者バックエンド] ページで、左側のナビゲーションウィンドウの [拡張機能] をクリックします。次に、[拡張機能の登録] をクリックし、ダイアログボックスでパラメーターを設定します。
デプロイ方法:[自己構築サービスを使用したデプロイ] を選択します。
拡張機能の登録
拡張機能名:カスタム名を入力します。
[処理される拡張ポイント] で、[ファイルコミット前のイベント] と [ファイル公開前のイベント] を選択します。
[テストワークスペース]:拡張機能が作成されてから送信される前にテストできるワークスペースを指定します。
拡張パラメーター設定
このパラメーターを使用して、拡張機能の範囲を制御できます。指定されたワークスペースで:
ノードがコミットされるとき ([ファイルコミット前のイベント])、拡張機能のチェックがトリガーされないため、コミットプロセスはブロックされません。
ノードが公開されるとき、[ファイル公開前のイベント] イベントが拡張機能のチェックをトリガーします。チェック条件が満たされない場合、公開プロセスはブロックされます。
パラメーターを
extension.project.commit-file.disabled=YourProjectIdのように設定します。YourProjectId を、指定されたイベントに対して拡張機能を無効にしたいワークスペースの ID に置き換えます。[拡張機能のオプション設定]:チェック条件が満たされない場合に使用する応答メソッド (アラートや無効化など) を指定します。
{ "type":"object", "properties":{ "checkStatus":{ "type":"number", "title":"Check method for MAX-PT function", "x-decorator":"FormItem", "x-component":"Radio.Group", "x-decorator-props":{ "tooltip":"Description file" }, "x-component-props":{ "dataSource":[ { "value":"WARN", "label":"Alert" }, { "value":"FAIL", "label":"Disable" } ], "mode":"multiple" } } } }
設定が完了したら、[OK] をクリックして登録された拡張機能を保存します。
拡張機能の [操作] 列で、[送信] をクリックして審査プロセスを開始します。
説明拡張機能は DataWorks プラットフォームによって審査されます。審査には通常 3 営業日かかります。しばらくお待ちください。
作成した拡張機能をテストするには、[テストワークスペース] を設定する必要があります。
拡張機能が承認されたら、[操作] 列の [公開] をクリックして公開します。
[拡張機能管理] ボタンをクリックして、ページに移動します。作成した拡張機能を選択し、[有効化] 列で有効にし、[設定] をクリックしてワークスペース内の MAX_PT 関数の制御レベルを設定します。

拡張機能の開発と設定
EventBridge は、HTTP リクエストを介して DataWorks から送信された JSON 形式のイベントを受信し、メッセージを解析して宛先サービスプログラムにプッシュします。イベントを処理した後、プログラムは結果を DataWorks に返します。
サンプルコード
このサンプルコードは、UpdateIDEEventResult API を呼び出して結果をコールバックとして送信します。API の messageId パラメーターを使用して詳細なイベント情報を取得し、論理チェックを実行して制限された機能が含まれているかどうかを判断します。チェック結果は UpdateIDEEventResult を使用して 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("The code contains a restricted function.");
} else {// コールバック成功。
updateIDEEventResultRequest.setCheckResult(EventCheckEnum.OK.getCode());
updateIDEEventResultRequest.setCheckResultTip(EventCheckEnum.OK.getName());
}
// DataWorks へのコールバック。
UpdateIDEEventResultResponse response = client.updateIDEEventResult(updateIDEEventResultRequest);
// リクエストの一意の識別子。後続のトラブルシューティングに使用されます。
System.out.println("response:" + response.getBody().getRequestId());
} catch (Exception e) {
// エラー説明メッセージ。
System.out.println("ErrMsg:" + e.getMessage());
}
} else {
// 他のイベントのフィルタリングに失敗しました。設定手順を確認してください。
System.out.println("Failed to filter other events. Check the configuration steps.");
}
}
}
サンプルプロジェクトのデプロイ
環境とプロジェクトの準備
依存関係:Java 8 以降、Maven ビルドツール。
プロジェクトダウンロードリンク:extensions-demo-maxpt.zip (219 KB)。
デプロイ方法
ローカルデプロイ:プロジェクトを JAR ファイルにパッケージングします。Java 8 と Maven ツールがデプロイされているローカルサーバーで、
java -jar yourapp.jarコマンドを実行してサービスプログラムを開始します。クラウドプラットフォームでのデプロイ:プロジェクトを JAR ファイルにパッケージングし、Docker コンテナや Elastic Compute Service (ECS) インスタンスなどのランタイム環境にアップロードしてデプロイします。
説明デプロイされたサービスは、パブリックネットワーク経由で EventBridge からアクセスできる必要があります。
プロジェクトをダウンロードした後、プロジェクトのルートディレクトリに移動し、パッケージングコマンドを実行してプロジェクトを JAR ファイルにパッケージングします。
mvn clean package -Dmaven.test.skip=true spring-boot:repackageJAR ファイルを実行します:
java -jar target/extensions-demo-maxpt-1.0.jarプロジェクトは次の図に示すように正常に起動します。
ブラウザで http://localhost:8080/indexと入力します。"hello world!"が返された場合、アプリケーションは正常にデプロイされています。ネットワークが接続された後、EventBridge からのメッセージをサブスクライブできます。
結果の検証
コードをデプロイし、ネットワークを EventBridge に接続した後、拡張機能が有効になっているワークスペースで結果を検証できます。
検証手順
[データ開発] ページで、ノードを作成します。ノードで、禁止されている
MAX_PT関数を含むようにコードを編集し、保存してコミットします。[公開] ボタンをクリックします。[デプロイパッケージの作成] ページで、ノードを公開します。この操作により、拡張機能のチェックがトリガーされます。
説明拡張機能は、指定されたワークスペースでのファイルコミットイベントを無視するように設定されています。したがって、
MAX_PT関数を含むノードをコミットしても、拡張機能のチェックはトリガーされません。チェックは、MAX_PT関数を含むノードを公開したときにトリガーされます。