iX 7/2016
S. 124
Praxis
Kundenbeziehungsmanagement
Aufmacherbild

Integration von Salesforce und Azure

Wolke an Wolke

Wer über die Möglichkeiten von Salesforce hinausgehendes Data Mining betreiben will, kann dazu zum Beispiel auf Microsoft Azure zurückgreifen. Ein paar Hinweise zur Integration der beiden Cloud-Systeme.

Mit dem Salesforce CRM lassen sich Vertriebsdaten auf verschiedenste Art und Weise analysieren. Doch nicht immer reicht das aus, und nicht für alle Analysen stellt die Salesforce-Cloud genügend Rechenkapazitäten zur Verfügung. Dann kann – oder muss – man andere Systeme hinzuziehen. So hat Microsoft in seiner Azure-Cloud einige mächtige Werkzeuge zur Datenanalyse im Portfolio, insbesondere die Data-Mining-Plattform „Azure Machine Learning“.

Dieser Artikel zeigt, wie ein Datenaustausch zwischen Salesforce und Microsoft Azure funktionieren kann, das heißt, welche Optionen für eine Integration zur Verfügung stehen. Man benötigt dazu den – kostenlosen – Microsoft-Account nebst der Registrierung für Azure. Die gezeigten Techniken sind zwar Azure-spezifisch, lassen sich aber im Prinzip auf andere Cloud-Anbieter wie AWS oder Google übertragen.

Verschiedene Wege der Datenbereitstellung

Viele Wege: Integrationsmethoden von Salesforce-Daten in Azure (Abb. 1)

Salesforce-Daten lassen sich auf verschiedenen Wegen extrahieren:

 durch manuellen Export mit dem Data Loader;

 durch Bereitstellen über die Programmierschnittstelle Apex oder Berichte;

 durch Streaming der Daten via API.

Die „Data Loader“ genannte Anwendung wurde in früheren Artikeln bereits intensiv zum Datenimport genutzt. Einen manuellen Export kann man direkt aus dem Webbrowser anstoßen. Das Ausgabeformat ist standardmäßig CSV, kann aber – in gewissem Maße – konfiguriert werden.

Sollen die Daten ohne zusätzlichen manuellen Aufwand jederzeit abrufbar sein, bietet sich die Bereitstellung mithilfe sogenannter Visualforce-Seiten oder über Berichte als CSV an. Während man Berichte in einem Berichtsdesigner komfortabel zusammenklicken kann, ist für das Erstellen einer Visualforce-Seite das Schreiben von Apex-Code erforderlich. Dies erhöht jedoch die Flexibilität der Datenausgabe.

Dazu kann man die Streaming-API von Salesforce nutzen, die ein Datenabonnement einrichtet. Die gewünschten Daten definiert eine SOQL-Abfrage (Salesforce Object Query Language). Es entsteht so ein Datenkanal, den Salesforce immer dann automatisch mit Daten befüllt, wenn die SOQL-Abfrage neue Datensätze liefern würde. Diesen Datenkanal können Client-Programme abonnieren, die benachrichtigt werden, sobald neue Daten zum Abruf bereitstehen.

Analysen mit Azure Machine Learning

Die in diesem Artikel verwendete Data-Mining-Plattform Azure Machine Learning (Azure ML) von Microsoft ist erst seit Kurzem am Markt, verfügt jedoch bereits über einige fortgeschrittene Analysemöglichkeiten. Die Plattform kann auf die Ressourcen der Azure-Cloud zurückgreifen und verteilt die Analysen automatisch auf mehrere Server, was im Normalfall zu einer guten Performance führt.

Azure ML unterstützt den Anwender bei verschiedenen Data-Mining-Tasks, indem es eine Reihe von Standardkomponenten bereitstellt. Die Integration der Programmiersprache R erweitert die Flexibilität nochmals.

Data-Mining-Tasks sollen Erkenntnisse aus Datensätzen gewinnen. Daher müssen diese Datensätze zunächst der Data-Mining-Umgebung zur Verfügung stehen. Azure ML bietet dazu drei Möglichkeiten:

 manuelles Hochladen lokaler Daten;

 HTTP-Abfrage der Daten zur Laufzeit des Tasks;

 Zugriff auf Azure-Speicherdienste.

Die ersten beiden Varianten beschränken sich auf relativ einfache Datenformate wie CSV, TSV und ARFF (ein populäres Dateiformat im Data Mining). Die HTTP-Abfrage kann auch auf Data Feeds im OData-Format erfolgen. Nutzbar sind die Azure-Speicherdienste Azure SQL Database, Azure Table und Azure Blob Storage. Letzteres bietet wieder die altbekannten einfachen Datenformate sowie Excel-Daten an.

Variante 1 taugt für das regelmäßige Auswerten von CRM-Daten nur bedingt und ist eher in Testszenarien interessant. Wenn man jedoch einmalig eine aufwendige Auswertung eines bestimmten Datenbestands braucht, kommt man damit am schnellsten und ohne jeglichen Programmieraufwand ans Ziel. Für die eigentliche Datenanalyse spielt die Art des Dateneinlesens keine Rolle.

Manuelle Übertragung der Daten

Um schnell und ohne Programmieraufwand Daten von Salesforce nach Azure zu übertragen, bietet sich ein Export im Textformat an. Der Data Loader stellt eine entsprechende Option zur Verfügung, man kann die Daten über das Web-GUI („Setup/Verwalten/Datenverwaltung/Datenexport“) exportieren, einen Bericht erstellen oder eine Visualforce-Seite programmieren, die die benötigten Daten liefert.

Die beiden letztgenannten Varianten haben den Vorteil, dass man beliebige Daten vor dem Export miteinander verknüpfen kann. Außerdem kann man so Daten regelmäßig abfragen, und der Konsument (also Azure ML) erhält mit jedem Aufruf den aktuellen Datensatz. In der Azure-Cloud können auf diese Weise exportierte Textdateien entweder manuell vom lokalen PC aus in Azure ML hochgeladen oder über Umwege wie den Datenimport in Azures Speicherdienste eingelesen werden. Eine direkte Abfrage der Daten über HTTP kommt mit Azure ML leider nicht infrage, da Microsoft bisher keine Authentifizierung gegenüber einem Webserver implementiert hat.

Erstellen einer Visualforce-Seite (Abb. 2)

Das Erstellen von Textdateien mithilfe des Data Loader und des Exportdialogs ist mit wenigen Klicks erledigt und bedarf wohl keiner weiteren Erläuterungen. Das Generieren von Berichten oder einer Visualforce-Seite dagegen ist um einiges komplexer. Eine Visualforce-Seite lässt sich einrichten mit einem Klick auf „Setup“, einem weiteren Klick auf „Visualforce-Seiten“ in der Kategorie „Entwickeln“ und dort einem letzten Klick auf „Neu“ neben dem Button „Entwicklerkonsole“ (siehe Abbildung 2).

Mehr Ergebnisse: Neue Apex-Klasse für CSV Export erstellen (Abb. 3)

Listing 1: CouponRedemptCSV

public class CouponRedemptCSV
{
  public List<List<Coupon_Redempt__c>> resultList;
  public integer count = 0;
  public CouponRedemptCSV(ApexPages.StandardController stdController)
  {
      this.count = database.countQuery('SELECT COUNT() FROM Coupon_Redempt__c');
      this.resultList = new List<List<Coupon_Redempt__c>>();
      integer iterations = this.count / 1000;
      integer start, stop;
      for (integer i = 1; i <= iterations + 1; i++)
      {
          stop = 1000 * i;
          start = 1000 * (i - 1);
          this.resultList.add([SELECT id, Coupon__c, day__c, Account__c  FROM Coupon_Redempt__c LIMIT: stop OFFSET: start]);
  }
}
public List<List<Coupon_Redempt__c>> getResultList()
{
  return this.resultList;
}
}

Bezeichnung und Name sind frei wählbar. Im unteren Teil des Dialogs zum Erstellen der Seite kann man dann bereits das Markup einer neuen Seite eingeben. Dabei ist zu beachten, dass die zugrunde liegende SOQL-Abfrage für Visualforce-Seiten auf 2000 Ergebnisse beschränkt ist. Um das zu umgehen, muss unter „Setup/Entwickeln/Apex-Klassen/Neu“ eine neue Apex-Klasse definiert werden.

Diese teilt die Abfrage in mehrere Schritte auf und gibt dann das Gesamtergebnis in einer Liste zurück. Der in Listing 1 gezeigte Quellcode demonstriert anhand des Coupon_Redempt-Objekts, wie eine SOQL-Abfrage in 1000er-Paketen durchgeführt und anschließend als komplette Liste zurückgegeben werden kann.

Datenquelle via WWW verfügbar machen

Listing 2: Controller CouponRedempt

<apex:page standardController="Coupon_Redempt__c" extensions="CouponRedemptCSV"
contentType="text/csv#CouponRedempt.csv">
  "Id","Coupon__c","day__c","Account__c"
  <apex:repeat value="{!resultList}" var="list">
      <apex:repeat value="{!list}" var="couponRedempt">
            "{!couponRedempt.id}","{!couponRedempt.Coupon__c}",
          "{!couponRedempt.day__c}","{!couponRedempt.Account__c}"
      </apex:repeat>
  </apex:repeat>
</apex:page>

Diese Klasse kann man nun beim Erstellen der Visualforce-Seite als Datenquelle angeben. Das Markup in Listing 2 führt dazu, dass beim Öffnen der Seite eine CSV-Datei aus dem Rückgabewert der Methode getResultList() erzeugt wird. Das Anklicken der Vorschau sollte nun bereits den Dialog zum Herunterladen der CSV-Datei öffnen.