DataWorks propose des vérifications intégrées, telles que les revues de code avant le déploiement des tâches et les validations depuis le Data Governance Center. Vous pouvez également intégrer une logique de validation personnalisée pour appliquer des contrôles de processus dans DataWorks. Cette rubrique explique comment utiliser une extension pour interdire des fonctions spécifiques dans un espace de travail, en prenant l'exemple d'une vérification de la fonction MAX_PT lors de la soumission ou du déploiement.
Scénario
Cette bonne pratique illustre la vérification de la présence de la fonction MAX_PT dans le code soumis et déployé. Le tableau suivant décrit le processus de validation :
|
Étape |
Processus principal |
Fonctionnalité clé |
|
1 |
Open Event envoie des messages de soumission et de déploiement de fichiers (tels que la soumission et le déploiement de nœuds) depuis un espace de travail vers EventBridge. EventBridge filtre ensuite les messages d'événement et les transmet à votre service. |
Lorsque vous activez l'abonnement aux messages, utilisez une règle d'événement pour vous abonner à des types d'événements spécifiques, tels que la soumission de fichier (dataworks:FileChange:CommitFile) et le déploiement de fichier (dataworks:FileChange:DeployFile). Pour plus de détails sur la configuration, consultez Bonnes pratiques : (fonctionnalité avancée) Interdire la fonction MAX_PT. |
|
2 |
Un service local ou en ligne reçoit les messages. L'extension est configurée pour gérer les événements comme suit :
|
Pour plus de détails sur la configuration, consultez Bonnes pratiques : (fonctionnalité avancée) Interdire la fonction MAX_PT. |
Prérequis
EventBridge est activé. Pour plus d'informations, consultez Activer EventBridge.
DataWorks est activé. Pour plus d'informations, consultez Activer DataWorks.
Un espace de travail DataWorks a été créé. Pour plus d'informations, consultez Créer un espace de travail.
Procédure
Étape 1 : Configurer un bus d'événements personnalisé
Connectez-vous à la console EventBridge. Dans le volet de navigation de gauche, cliquez sur Event Bus pour accéder à la page des bus d'événements.
-
Cliquez sur le bouton
pour Create Custom Event Bus.Dans la section Bus, configurez le Custom Event Bus Name, puis cliquez sur Next step pour passer à la configuration de la source d'événement.
Cliquez sur Skip pour ignorer la configuration de la Event Source, de la Rule et du Target Module. Saisissez une Description.
-
Dans le volet de navigation de gauche, cliquez sur Event Bus pour accéder à la page des bus d'événements. Recherchez le bus d'événements que vous avez créé et cliquez sur son nom pour accéder à la page de présentation.
Dans le volet de navigation de gauche, cliquez sur Event Rules pour accéder à la page des règles d'événement, puis cliquez sur Create Rule pour créer une règle d'événement.
-
Dans cet exemple, le bus EventBridge personnalisé est configuré pour recevoir les messages d'événement de commit de fichier et de déploiement de fichier provenant de DataWorks. La section suivante décrit la démonstration de configuration et les paramètres clés.
Configure Basic Information : Personnalisez le nom de la règle.
-
Pattern Content.
Event Source Type : Sélectionnez custom event source.
Event Source : Laissez ce champ vide.
-
Pattern Content : Rédigez au format JSON. La configuration est la suivante.
{ "source": [ "acs.dataworks" ], "type": [ "dataworks:FileChange:CommitFile", "dataworks:FileChange:DeployFile" ] }source : Définit l'identifiant du nom du produit acs.dataworks.
type : Définit les identifiants de type d'événement sous le produit. Définissez cette valeur sur dataworks:FileChange:CommitFile et dataworks:FileChange:DeployFile.
Event Pattern Debugging : Remplissez et modifiez les valeurs source et type, puis effectuez un test d'événement. Une fois le test réussi, cliquez sur Next. Cliquez sur Test pour vérifier que l'événement personnalisé correspond au modèle. Si le test est concluant, la page affiche Match passed, event can be triggered normally.
-
Configure Event Target.
Service Type : Sélectionnez HTTPS ou HTTP. Pour plus de types de services, consultez Cibles d'événement.
URL : Saisissez l'URL qui reçoit les messages poussés par le bus personnalisé, par exemple
https://server-address:port/extensions/consumer.Body : Sélectionnez Complete Event.
Network Type : Sélectionnez Public Network.
Étape 2 : Configurer un canal de distribution d'événements
-
Connectez-vous à la console DataWorks. Dans la région cible, cliquez sur dans le volet de navigation de gauche. Cliquez sur Go to Open Platform pour ouvrir la page Developer Backend.
-
Sur la page Developer Backend, cliquez sur OpenEvent dans le volet de navigation de gauche. Sur la page qui s'affiche, cliquez sur Add Event Distribution Channel et configurez les paramètres dans la boîte de dialogue.
Workspace for Event Distribution : Sélectionnez un espace de travail que vous avez créé.
Custom Bus in Eventbridge for Distribution : Sélectionnez le bus d'événements créé à l'étape 1.
Une fois le canal de distribution d'événements enregistré, cliquez sur Enable dans la colonne Operation du canal pour activer le nouveau canal de distribution d'événements.
Étape 3 : Enregistrer et configurer une extension
-
Connectez-vous à la console DataWorks. Dans la région cible, cliquez sur dans le volet de navigation de gauche. Cliquez sur Go to Open Platform pour ouvrir la page Developer Backend.
-
Sur la page Developer Backend, cliquez sur Extension dans le volet de navigation de gauche. Sur la page qui s'affiche, cliquez sur Register Extension et configurez les paramètres dans la boîte de dialogue.
Méthode de déploiement : Sélectionnez Deploy via self-built service.
-
Enregistrez l'extension
Extension Name : Saisissez un nom personnalisé.
Extension Point Event : Sélectionnez Before File Commit et Before File Deploy.
Workspace for Testing : Après avoir configuré ce paramètre, vous pouvez tester l'extension dans l'espace de travail spécifié avant de la soumettre.
-
Parameter Configurations for Extension
Vous pouvez utiliser ce paramètre pour contrôler la portée de l'extension. Dans l'espace de travail spécifié :
La soumission d'un nœud (Before File Commit) ne déclenche pas la validation de l'extension ni ne bloque le processus de soumission.
Le déploiement d'un nœud (Before File Deploy) déclenche la validation de l'extension. Si la validation échoue, le processus de déploiement est bloqué.
Définissez cette valeur sur extension.project.commit-file.disabled=YourProjectId, où YourProjectId est l'ID de l'espace de travail dans lequel l'événement de point d'extension ne prend pas effet.
-
Options for Extension : Utilisé pour définir les méthodes de réponse en cas d'échec de la validation. Dans cet exemple, les méthodes de réponse spécifiées incluent l'alerte et le blocage.
{ "type":"object", "properties":{ "checkStatus":{ "type":"number", "title":"MAX-PT function check method", "x-decorator":"FormItem", "x-component":"Radio.Group", "x-decorator-props":{ "tooltip":"Description file" }, "x-component-props":{ "dataSource":[ { "value":"WARN", "label":"Warning" }, { "value":"FAIL", "label":"Disabled" } ], "mode":"multiple" } } } }Les champs de la configuration des options sont décrits ci-dessous :
checkStatus : Un nom de champ personnalisé (nom du composant, doit être unique) défini par le développeur de l'extension dans la configuration des options. Le serveur d'extension lit la valeur configurée par l'administrateur de l'espace de travail pour l'espace de travail via ce nom de champ.
title : Le titre de l'option. Pour les valeurs, consultez les exemples d'analyse et de configuration des paramètres dans Fonctionnalité avancée : Configuration des options d'extension. Dans cet exemple, le titre est MAX-PT Function Check Method.
x-component : Le composant de formulaire utilisé par l'option. Dans cet exemple, un composant de bouton radio (Radio.Group) est utilisé.
dataSource : Les options sélectionnables pour le composant de bouton radio, où label est le texte affiché sur l'interface utilisateur et value est l'identifiant correspondant. Cet exemple fournit deux valeurs : Alert (WARN) et Block (FAIL), qui permettent à l'administrateur de l'espace de travail de sélectionner la méthode de réponse lorsque la fonction MAX_PT est détectée lors de l'activation de l'extension.
Combiné avec le code d'exemple de cette rubrique, vous pouvez comprendre le flux de valeur de checkStatus : Lorsque l'administrateur de l'espace de travail active l'extension, il sélectionne soit Alert, soit Block dans MAX-PT Function Check Method. Le serveur d'extension lit cette configuration via GetOptionValueForProject, récupère la sélection de l'administrateur via jsonObject.getString("checkStatus") et renvoie le résultat à DataWorks via setCheckResult sous forme de rappel, ce qui alerte ou bloque le processus de déploiement du nœud.
RemarquecheckStatus n'est qu'un exemple de configuration utilisant le composant de bouton radio. La configuration des options prend actuellement en charge sept types de composants : texte, entrée sur une seule ligne, entrée sur plusieurs lignes, liste déroulante à sélection unique, liste déroulante à sélections multiples, case à cocher et bouton radio. Pour connaître tous les types de composants et les méthodes de configuration, consultez Avancé : Configurer les options d'extension.
Une fois la configuration terminée, cliquez sur Determine pour enregistrer l'extension.
-
Dans la colonne Operation de l'extension créée, cliquez sur Submit pour soumettre l'extension pour examen.
RemarqueL'examen de l'extension est effectué par la plateforme DataWorks. L'examen prend généralement T+3 jours ouvrables.
Pour tester l'extension créée, configurez le Workspace for Testing.
Une fois l'examen approuvé, cliquez sur Deploy dans la colonne Operation pour mettre l'extension en ligne.
Cliquez sur Manage Extensions pour accéder à la page . Sélectionnez l'extension que vous avez créée, activez-la dans la colonne Enable et cliquez sur Settings pour configurer le niveau de contrôle pour l'utilisation de la fonction MAX_PT dans l'espace de travail.
Développer et configurer l'extension
EventBridge reçoit les messages d'événement DataWorks au format JSON via des requêtes HTTP, analyse les messages et les pousse vers le service cible. Après le traitement des événements par le service, celui-ci renvoie les résultats à DataWorks.
Exemple de code
Cet exemple de code appelle l'API UpdateIDEEventResult pour renvoyer le résultat du rappel. Il utilise le paramètre messageId de l'API pour obtenir les détails de l'événement, exécute la logique permettant de déterminer si des fonctions restreintes sont utilisées et renvoie le résultat à DataWorks via l'API UpdateIDEEventResult. Pour plus d'informations, consultez Développer une extension.
Configuration de l'environnement : Java 8, outil de build 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; / Receive messages pushed by 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)) { //Initialize client Client client = dataWorksOpenApiClient.createClient(); try { //Current event parameter information String messageId = jsonObj.getString("id"); JSONObject data = jsonObj.getObject("data", JSONObject.class); Long projectId = data.getLong("projectId"); //Initialize event callback UpdateIDEEventResultRequest updateIDEEventResultRequest = new UpdateIDEEventResultRequest(); updateIDEEventResultRequest.setMessageId(messageId); updateIDEEventResultRequest.setExtensionCode(extensionParamProperties.getExtensionCode()); //Query the extension point data snapshot when the extension point event was triggered GetIDEEventDetailRequest getIDEEventDetailRequest = new GetIDEEventDetailRequest(); getIDEEventDetailRequest.setMessageId(messageId); getIDEEventDetailRequest.setProjectId(projectId); GetIDEEventDetailResponse getIDEEventDetailResponse = client.getIDEEventDetail(getIDEEventDetailRequest); String content = getIDEEventDetailResponse.getBody().getEventDetail().getCommittedFile().getContent(); //Check whether the code contains restricted functions if (content.contains(Constants.CHECK_CODE)) { //Get the extension option configuration for the workspace 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()); //Note: fill in according to the actual format configured in DataWorks String checkStatus = jsonObject.getString("checkStatus"); updateIDEEventResultRequest.setCheckResult(checkStatus); updateIDEEventResultRequest.setCheckResultTip("Restricted functions found in code"); } else {//Success callback updateIDEEventResultRequest.setCheckResult(EventCheckEnum.OK.getCode()); updateIDEEventResultRequest.setCheckResultTip(EventCheckEnum.OK.getName()); } //Callback to DataWorks UpdateIDEEventResultResponse response = client.updateIDEEventResult(updateIDEEventResultRequest); //Unique request ID for subsequent troubleshooting System.out.println("response:" + response.getBody().getRequestId()); } catch (Exception e) { //Error description System.out.println("ErrMsg:" + e.getMessage()); } } else { System.out.println("Failed to filter other events, please check the configuration steps"); } } }
Déployer l'exemple de projet
-
Préparez l'environnement et le projet
Environnement requis : Java 8 ou version ultérieure, outil de build Maven.
Lien de téléchargement du projet : extensions-demo-maxpt.zip (219 Ko).
-
Méthodes de déploiement
Déploiement local : Emballez le projet sous forme de fichier JAR, puis exécutez la commande
java -jar yourapp.jarsur un serveur local disposant de Java 8 et de Maven installés pour démarrer le service.Déploiement cloud : Emballez le projet sous forme de fichier JAR, puis téléchargez-le dans l'environnement d'exécution approprié, tel qu'un conteneur Docker ou un serveur cloud, pour le déploiement.
RemarqueLe service déployé doit être accessible par EventBridge via Internet.
-
Après avoir téléchargé le projet, accédez au répertoire racine et exécutez la commande d'emballage pour générer le fichier JAR.
mvn clean package -Dmaven.test.skip=true spring-boot:repackage -
Exécutez le fichier JAR :
java -jar target/extensions-demo-maxpt-1.0.jarLe projet démarre avec succès.
/\ / /'---'. __ __ ____ /'\'\\ ( ( )\'---'| '--'| '--'\/'--'| '\ \\\\ \/ /__) | |__| | | |__(___| | ) ) ) ) ' '__| | |__| |'| |___| | / / / / =========|_|===============|__/=/=/_/ :: 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)Saisissez
http://localhost:8080/indexdans un navigateur. Si vous recevez"hello world!", l'application est déployée avec succès. Une fois la connectivité réseau établie, vous pouvez vous abonner aux messages EventBridge.
Vérification des résultats
Une fois le déploiement du code terminé et la connectivité réseau avec EventBridge établie, vous pouvez vérifier la configuration dans l'espace de travail où l'extension est activée.
Étapes de vérification
Sur la page Data Studio, créez un nœud, écrivez la fonction interdite
MAX_PTdans le nœud, enregistrez et soumettez le nœud.-
Cliquez sur le bouton Deploy pour accéder à la page de création du package de déploiement et déployez le nœud. Cela déclenche la validation de l'extension.
RemarqueSelon la configuration de l'extension, celle-ci ne prend pas effet pour les événements de soumission de fichier dans l'espace de travail spécifié. Par conséquent, la soumission d'un nœud contenant la fonction
MAX_PTne déclenche pas la validation de l'extension. L'extension n'est déclenchée que lors du déploiement d'un nœud contenant la fonctionMAX_PT.