DataWorks オープンプラットフォームは、OpenAPI、OpenEvent、および拡張機能を提供します。これらの機能を使用して、特定のフローに対するカスタムコントロールと応答を実装できます。このトピックでは、タスクデプロイメントのロックダウンシナリオを例に、データ開発ページでのデプロイのためのノード送信などのイベントに対してオープンプラットフォームを構成する方法を説明します。
背景情報
このベストプラクティスで使用されるオープンプラットフォームの機能と概念の概要については、「OpenEvent の概要」および「拡張機能の概要」をご参照ください。
シナリオの説明
サブスクリプションの構成
サブスクリプションを構成する際、イベントルールを使用してファイル送信またはデプロイのイベントタイプを指定できます。
標準モードのワークスペースでは、dataworks:FileChange:CommitFile を使用します。
基本モードのワークスペースでは、dataworks:FileChange:DeployFile を使用します。
前提条件
EventBridge が有効化されていること。詳細については、「課金」をご参照ください。
DataWorks が有効化されていること。詳細については、「購入ガイド」をご参照ください。
DataWorks でワークスペースが作成されていること。詳細については、「ワークスペースの作成」をご参照ください。
手順
ステップ 1:カスタムイベントバスの構成
メッセージサブスクリプションを有効化して構成する詳細な手順については、「メッセージサブスクリプションの有効化」をご参照ください。以下のセクションでは、このベストプラクティスの主要な構成フローと重要な注意事項について説明します。
EventBridge コンソールにログインします。左側のナビゲーションウィンドウで、[イベントバス] をクリックして、イベントバス作成ページに移動します。
[カスタムイベントバスの作成] をクリックします。[イベントバス] セクションで、[カスタムイベントバス名] を構成し、[次へ] をクリックしてイベントソースの構成に進みます。
[スキップ] をクリックして、[イベントソース]、[ルール]、[ターゲット] の構成をスキップします。

左側のナビゲーションウィンドウで [イベントバス] をクリックします。作成したイベントバスを見つけ、その名前をクリックして概要ページに移動します。
左側のナビゲーションウィンドウで [イベントルール] をクリックします。[イベントルール] ページで、[ルールの作成] をクリックして新しいイベントルールを作成します。
このベストプラクティスでは、カスタム EventBridge バスが DataWorks のファイル送信およびファイルデプロイのイベントメッセージを受信するように構成されます。以下のセクションでは、デモ構成と主要なパラメーターについて説明します。
[基本情報の構成]:カスタムルール名を入力します。
演習コンテンツ
[イベントソースタイプ]:[カスタムイベントソース] を選択します。
イベントソース:このパラメーターは空のままにします。
[パターン内容]:次のように JSON 形式で内容を記述します。この例では、標準モードのワークスペースを使用します。
説明基本モードのワークスペースの場合、このパラメーターを dataworks:FileChange:DeployFile に設定します。
{ "source": [ "acs.dataworks" ], "type": [ "dataworks:FileChange:CommitFile" ] }source:イベントのプロダクト名識別子を定義します。これは acs.dataworks です。
type:プロダクトのイベントタイプ識別子を定義します。このパラメーターを dataworks:FileChange:CommitFile に設定します。
イベントパターンのデバッグ: [ソース] と [タイプ] の値を変更し、イベントをテストします。テストが成功した場合、[次へ] をクリックします。

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

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

ステップ 3:拡張機能の登録と構成
[開発者バックエンド] タブに移動します。
DataWorks コンソールにログインします。上部のナビゲーションバーで目的のリージョンを選択します。左側のナビゲーションウィンドウで、 を選択します。表示されたページで [オープンプラットフォームへ移動] をクリックします。[開発者バックエンド] タブが表示されます。
[開発者バックエンド] ページで、左側のナビゲーションウィンドウの [拡張機能] をクリックします。次に、[拡張機能の登録] をクリックし、ダイアログボックスでパラメーターを構成します。
デプロイ方法:[セルフマネージドサービスでデプロイ] を選択します。
拡張機能を登録します。
拡張機能名:任意の名前を入力します。
処理済み拡張ポイント: [ファイルコミットの事前イベント] と [ファイルデプロイメントの事前イベント] を選択します。
[テストワークスペース]:構成が完了した後、拡張機能が作成されてから送信されるまでの間に、このワークスペースで拡張機能をテストできます。
拡張パラメーター設定: ファイルコミットの事前イベント。
UI のプロンプトに従って他のパラメーターを構成します。

構成が完了したら、[OK] をクリックして登録した拡張機能を保存します。
拡張機能の [操作] 列で、[送信] をクリックしてレビュープロセスを開始します。
説明拡張機能は DataWorks プラットフォームによってレビューされます。レビューには通常 3 営業日かかります。しばらくお待ちください。
作成した拡張機能をテストするには、[テストワークスペース] を構成する必要があります。
拡張機能が承認された後、[操作] 列の [公開] をクリックして公開します。
[拡張機能の管理] をクリックして、 ページに移動します。 作成した拡張機能を選択し、[有効] 列で有効にします。

拡張機能の開発と構成
サンプルコード
このコードは、EventBridge からサービスにプッシュされたメッセージを使用してサービスを呼び出します。コードは現在の日付を構成済みの休日およびロックダウン日と比較して、ロックダウン日であるかどうかを判断します。結果は、UpdateIDEEventResult OpenAPI 操作を使用したコールバックを介して 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.UpdateIDEEventResultRequest;
import com.aliyun.dataworks_public20200518.models.UpdateIDEEventResultResponse;
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;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.List;
/**
* @author dataworks デモ
*/
@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)) {
// クライアントを初期化します
Client client = dataWorksOpenApiClient.createClient();
// 現在時刻を取得します
SimpleDateFormat sdf = new SimpleDateFormat(Constants.YYYY_MM_DD);
String now = sdf.format(System.currentTimeMillis());
// 2022年の休日とロックダウン日を取得します
List<String> holidayList = Arrays.asList(extensionParamProperties.getHolidayList().split(","));
// 現在の日付がロックダウン日であるかを確認します
boolean isExists = holidayList.stream().anyMatch(day -> day.equals(now));
// コールバックメソッド
UpdateIDEEventResultRequest updateIDEEventResultRequest = new UpdateIDEEventResultRequest();
updateIDEEventResultRequest.setMessageId(jsonObj.getString("id"));
updateIDEEventResultRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
// ロックダウン日である場合、チェックは失敗します
if (isExists) {
updateIDEEventResultRequest.setCheckResult(EventCheckEnum.FAIL.getCode());
updateIDEEventResultRequest.setCheckResultTip("ロックダウン日にはファイルの送信は許可されていません。");
} else {
// ロックダウン日でない場合、チェックは成功します
updateIDEEventResultRequest.setCheckResult(EventCheckEnum.OK.getCode());
updateIDEEventResultRequest.setCheckResultTip(EventCheckEnum.OK.getName());
}
try {
// コールバックを DataWorks に送信します
UpdateIDEEventResultResponse response = client.updateIDEEventResult(updateIDEEventResultRequest);
// リクエストの一意の ID。トラブルシューティングに使用されます。
System.out.println("response:" + response.getBody().getRequestId());
} catch (Exception e) {
System.out.println("consumerEventBridge error:" + e.getMessage());
throw new RuntimeException(e);
}
} else {
System.out.println("他のイベントのフィルタリングに失敗しました。構成手順を確認してください。");
}
}
}サンプルプロジェクトのデプロイ
環境とプロジェクトの準備
必須環境:Java 8 以降および Maven ビルドツール。
プロジェクトのダウンロードリンク:extension-demo-deploycontroller.zip (30 KB)。
デプロイ方法
ローカルデプロイ:プロジェクトを JAR ファイルにパッケージングします。Java 8 と Maven がインストールされているローカルサーバーまたは Windows マシンで、
java -jar yourapp.jarコマンドを実行してサービスプログラムを実行します。クラウドプラットフォームへのデプロイ:プロジェクトを JAR ファイルにパッケージングします。ファイルを Docker コンテナや Elastic Compute Service (ECS) インスタンスなどのランタイム環境にアップロードしてデプロイします。
プロジェクトをダウンロードした後、プロジェクトのルートディレクトリに移動し、パッケージングコマンドを実行してプロジェクトを JAR ファイルにパッケージングします。
mvn clean package -Dmaven.test.skip=true spring-boot:repackageJAR ファイルを実行します:
java -jar target/extension-demo-deploycontroller-1.0.jar
プロジェクトが正常に起動すると、次の図のようになります。
ブラウザで http://localhost:8080/index と入力します。"hello world!" が返された場合、アプリケーションは正常にデプロイされています。ネットワーク接続を確立した後、EventBridge からのメッセージをサブスクライブできます。
結果の検証
コードをデプロイし、EventBridge へのネットワーク接続を確立した後、拡張機能が有効になっているワークスペースで検証を実行できます。
