Automatisch starten applicatiemodule vanuit Azure Data Factory

Go to English version

Met Invantive App Online is het mogelijk om procedure logica uit te voeren via het aanroepen van een hyperlink. In dit artikel wordt een methode getoond waarmee automatisch een applicatiemodule volgens een instelbaar schema kan worden gestart vanuit Azure Data Factory. De volledige verwerking vindt echter plaats via de applicatiemodule en kan daardoor forse financiele besparingen opleveren voor het gebruik van Azure Data Factory.

De volgende stappen worden uitgevoerd:

  • Maak een module die een Exact Online-tabel kopieert naar Azure SQL Server.
  • Bepaal de hyperlink van de module.
  • Maak een Azure Data Factory-pijplijn die de hyperlink aanroept en de resultaten protocolleert in een tabel.
  • Controleer de werking.

Deze stappen zijn als illustratie bedoeld; er zijn veel andere manieren denkbaar die beter passen bij individuele situaties.

Aan het einde worden separaat nog de JSON-definities van de gebruikte Azure Data Factory-elementen getoond.

Module Maken Kopieren Exact Online-tabel naar Azure SQL Server

Binnen Invantive Cloud kan het scherm “Applicaties” gebruikt worden om een applicatiemodule te definieren die data kopieert.

Maak eerst een database aan zoals beschreven in Elementaire datareplicatie tussen Exact Online en Azure SQL Server.

Maak daarna een module met code Hello, moduletaal PSQL en de volgende broncode zoals getoond in de afbeelding:

begin
  --
  -- LOGIC HERE SUCH AS:
  --
  -- Kopieer de Accounts van alle Exact Online administraties
  -- naar de SQL Server-database als een nieuwe tabel.
  --
  -- create or replace table eol_accounts@sqlserver
  -- as
  -- select *
  -- from   AccountsIncremental@eol
  -- ;
  --
  -- Report results as JSON.
  --
  cloud_http.append_line_to_response_body_text
  ( '{'
    || jsonelement('message', 'Everything fine.', false)
    || ', '
    || jsonelement('success', true, false)
    || '}'
  );
exception
  when others
  then
    --
    -- Report failures.
    --
    cloud_http.append_line_to_response_body_text
    ( '{'
      || jsonelement('message', sqlerrm, false)
      || ', '
      || jsonelement('success', false, false)
      || '}'
    );
end;

Bepaal Hyperlink Module

De module kan rechtstreeks uitgevoerd worden via de knop “Uitvoeren” binnen Invantive Cloud, maar binnen Invantive Cloud geldt een loopduurbeperking van 5 minuten, plus dat het niet mogelijk is om Invantive Cloud automatisch te sturen.

Via Invantive App Online kan de applicatiemodule ook uitgevoerd worden via een hyperlink. De hyperlink kan aangeroepen worden met zogenaamde “Basic Authentication”, bestaande uit Invantive Cloud-gebruikersnaam en wachtwoord.

Bovendien moet de database verbindingen toestaan vanaf de gewenste IP-adressen. Bij het gebruik van Azure Data Factory is het het goedkoopst om geen vast IP-adres te hebben, maar moeten dan wel veel IP-adressen opgevoerd worden of een * gebruikt worden.

Configureer eerst de database qua toegestane IP-adressen zoals beschreven in Corrigeer itgenboe031 en itgenboe030 melding bij Power BI Verversen (Bridge Online toegang is niet geautoriseerd vanaf IP-adres ...)).

Ga vervolgens naar de applicatie en kies “Uitvoeren”:

image

Indien er meerdere databases zijn wordt een menu getoond met meerdere opties. Kies daar de gewenste database.

Indien er maar 1 database is, dan wordt deze automatisch geselecteerd.

Een of meerdere kaarten verschijnen zoals:

image

Kies “Kopieer Link” rechtsonder.

De hyperlink voor App Online staat dan op het klembord.

Bewaar de hyperlink in notepad.

Maak Azure Data Factory-Pijplijn

Meld aan op Azure Data Factory.

Voeg een pijplijn toe zoals getoond en sleep hier een ‘Copy data’ element in onder ‘Move and transform’. Selecteer dit element en vul deze onder de ‘General’ tab aan met een naam, maximale loopduur van 12 uur, 2 pogingen bij fouten en een interval tussen pogingen van 5 minuten:

Koppel hier een bron zoals beschreven in JSON-formaat (het bovenstaande voorbeeld van applicatiemodule geeft via JSON zijn voortgang terug):

De bron is een HTTP-service:

Die als volgt ingesteld is:

Vervang hierbij de URL door de bewaarde hyperlink, en gebruikersnaam en wachtwoord door het Invantive Cloud-account waarmee de koppeling moet draaien.

De JSON geeft in dit geval twee velden terug:

Vervolgens kan de uitvoer vastgelegd worden in bijvoorbeeld een tabel:

In dit voorbeeld wordt een Azure-tabel gebruikt:

Maar het kan uiteraard ook via een traditionele tabel.

Tijdens de eerste keer draaien wordt de tabel automatisch aangemaakt, maar onder “Mapping” kunnen ook de vertalingen opgegeven worden zoals:

Tenslotte dient de pijplijn nog automatisch regelmatig afgetrapt te worden. Dit kan door de knop “Trigger” te kiezen. In dit voorbeeld wordt een trigger gebruikt die elke 5 minuten leidt tot uitvoering van de pijplijn (voor productiedoeleinden wordt een beduidend lagere frequentie aangeraden).

De definitie van de trigger voor kopieren van de Exact Online-tabellen naar SQL Server is hieronder weergegeven:

Controleer de Werking

Na het gebruik van de “Debug”-knop of door tien minuten te wachten, kan de werking gecontroleerd worden:

Ga naar Invantive App Online Monitoring en controleer dat de module succesvol heeft gedraaid:

Ga naar de uitvoertabel, bijvoorbeeld via “Open” in het tab “Sink” van de pijplijn, en kies voor “Preview data”:

JSON-definities

Pijplijn
{
    "name": "RunHelloWorld",
    "properties": {
        "activities": [
            {
                "name": "Run Hello World and copy to log table",
                "type": "Copy",
                "dependsOn": [],
                "policy": {
                    "timeout": "0.12:00:00",
                    "retry": 2,
                    "retryIntervalInSeconds": 300,
                    "secureOutput": false,
                    "secureInput": false
                },
                "userProperties": [],
                "typeProperties": {
                    "source": {
                        "type": "JsonSource",
                        "storeSettings": {
                            "type": "HttpReadSettings",
                            "requestMethod": "GET"
                        },
                        "formatSettings": {
                            "type": "JsonReadSettings"
                        }
                    },
                    "sink": {
                        "type": "AzureTableSink",
                        "azureTableInsertType": "merge",
                        "writeBatchSize": 10000
                    },
                    "enableStaging": false,
                    "translator": {
                        "type": "TabularTranslator",
                        "mappings": [
                            {
                                "source": {
                                    "path": "$['message']"
                                },
                                "sink": {
                                    "name": "message"
                                }
                            },
                            {
                                "source": {
                                    "path": "$['success']"
                                },
                                "sink": {
                                    "name": "success"
                                }
                            }
                        ],
                        "collectionReference": "",
                        "mapComplexValuesToString": false
                    }
                },
                "inputs": [
                    {
                        "referenceName": "OutputApp",
                        "type": "DatasetReference"
                    }
                ],
                "outputs": [
                    {
                        "referenceName": "LoggingTable",
                        "type": "DatasetReference"
                    }
                ]
            }
        ],
        "annotations": []
    }
}
Uitvoer van App
{
    "name": "OutputApp",
    "properties": {
        "linkedServiceName": {
            "referenceName": "HelloWorld",
            "type": "LinkedServiceReference"
        },
        "annotations": [],
        "type": "Json",
        "typeProperties": {
            "location": {
                "type": "HttpServerLocation"
            }
        },
        "schema": {
            "type": "object",
            "properties": {
                "message": {
                    "type": "string"
                },
                "success": {
                    "type": "boolean"
                }
            }
        }
    }
}
Azure-tabel
{
    "name": "LoggingTable",
    "properties": {
        "linkedServiceName": {
            "referenceName": "AzureTableStorage1",
            "type": "LinkedServiceReference"
        },
        "annotations": [],
        "type": "AzureTable",
        "schema": [],
        "typeProperties": {
            "tableName": "mytable"
        }
    }
}
Trigger
{
    "name": "RunHelloWorld5Min",
    "properties": {
        "annotations": [],
        "runtimeState": "Started",
        "pipelines": [
            {
                "pipelineReference": {
                    "referenceName": "RunHelloWorld",
                    "type": "PipelineReference"
                }
            }
        ],
        "type": "ScheduleTrigger",
        "typeProperties": {
            "recurrence": {
                "frequency": "Minute",
                "interval": 5,
                "startTime": "2023-10-26T14:20:00",
                "timeZone": "W. Europe Standard Time"
            }
        }
    }
}