Serverunabhängige Web-App und Eventing für Datenabruf und -analyse
Für dieses Lernprogramm können Kosten anfallen. Mit dem Kostenschätzer können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung generieren.
In diesem Lernprogramm erstellen Sie eine Anwendung zum automatischen Erfassen von GitHub-Datenverkehrsstatistiken für Repositorys und legen die Grundlage für die Datenverkehrsanalyse. GitHub macht nur Datenverkehrsdaten für die letzten 14 Tage zugänglich. Wenn Sie Statistiken über einen längeren Zeitraum analysieren möchten, müssen Sie die entsprechenden Daten selbst herunterladen und speichern. In diesem Lernprogramm stellen Sie eine serverunabhängige App in einem IBM Cloud Code Engine-Projekt bereit. Die App verwaltet die Metadaten für GitHub-Repositorys und bietet Zugriff auf die Statistikdaten für die Datenanalyse. Die Verkehrsdaten werden aus GitHub entweder bedarfsgesteuert in der App oder bei Auslösung durch Code Engine-Ereignisse (z. B. täglich) erfasst. Die im vorliegenden Lernprogramm behandelte App implementiert eine Multi-Tenant-fähige Lösung mit den ursprünglichen Funktionen bereit, die einen Single-Tenant-Modus unterstützen.

Ziele
- Containerisierte Python-Datenbank-App mit Multi-Tenant-Unterstützung und sicherem Zugriff bereitstellen
- App-ID als OpenID Connect-Authentifizierungsprovider integrieren
- Automatisierte und serverunabhängige Erfassung von GitHub-Datenverkehrsstatistiken einrichten
Vorbereitende Schritte
Für dieses Lernprogramm ist Folgendes erforderlich:
- IBM Cloud CLI,
- IBM Cloud Code Engine-Plug-in
- IBM Cloud® Container Registry-Plug-in
- GitHub-Konto
Die Abschnitte, die eine Shell erfordern, können Sie in IBM® Cloud Shell ausführen.
Anweisungen zum Herunterladen und Installieren dieser Tools für Ihre Betriebsumgebung finden Sie in der Anleitung zur Einführung in die Lernprogramme.
Service- und Umgebungskonfiguration (Shell)
In diesem Abschnitt richten Sie die erforderlichen Services ein und bereiten die Umgebung vor. Alle erforderlichen Schritte können in der Shellumgebung (Terminal) ausgeführt werden.
-
Wenn Sie nicht angemeldet sind, verwenden Sie
ibmcloud login
oderibmcloud login --sso
, um sich interaktiv anzumelden. -
Verwenden Sie den Befehl
ibmcloud target
, um die Ressourcengruppe und Region zu ermitteln.RESOURCE_GROUP_NAME=Default REGION=us-south ibmcloud target -r $REGION -g $RESOURCE_GROUP_NAME
-
Erstellen Sie eine IBM Db2 SaaS-Instanz mit dem kostenfreien Plan (Lite-Plan) und benennen Sie sie mit ghstatsDB.
ibmcloud resource service-instance-create ghstatsDB dashdb-for-transactions free $REGION
-
Erstellen Sie eine Instanz des App ID-Service. Verwenden Sie den Namen ghstatsAppID und den Plan mit gestaffelter Preisstufe (graduated tier).
ibmcloud resource service-instance-create ghstatsAppID appid graduated-tier $REGION
-
Fügen Sie einen neuen Namensbereich ghstats zu IBM Cloud® Container Registry hinzu. Diesen Namensbereich verwenden Sie zum Referenzieren von Container-Images. Es gibt ein globales Register sowie regionale Register. Verwenden Sie die globale Registry.
ibmcloud cr region-set global NAMESPACE=ghstatsYourInitials ibmcloud cr namespace-add $NAMESPACE
Code Engine vorbereiten (Shell)
Nachdem die Services eingerichtet worden sind und die allgemeine Konfiguration fertiggestellt wurde, müssen Sie nun das Code Engine-Projekt erstellen, ein Container-Image für die App erstellen und das Image bereitstellen.
- Erstellen Sie ein Code Engine-Projekt namens ghstats. Der Befehl legt das Projekt automatisch als aktuellen Kontext von Code Engine fest.
ibmcloud ce project create --name ghstats
- Erstellen Sie eine Code Engine-Buildkonfiguration, konfigurieren Sie also das Projekt so, dass das Container-Image automatisch erstellt wird. Es entnimmt den Code aus GitHub für dieses Tutorial und speichert das Bild in der Registrierung im zuvor erstellten Namespace unter Verwendung der registrierten Benutzerinformationen.
ibmcloud ce build create --name ghstats-build --source https://github.com/IBM-Cloud/github-traffic-stats --context-dir /backend --commit master --image private.icr.io/$NAMESPACE/codeengine-ghstats
- Beachten Sie, dass der Erstellungsbefehl den Nebeneffekt hatte, dass ein geheimer Schlüssel für den Registry-Zugriff erstellt wurde, der dem Projekt das Schreiben und Lesen von IBM Cloud® Container Registryermöglicht.
ibmcloud ce registry list
- Führen Sie als Nächstes den eigentlichen Buildprozess aus.
Die Ausgabe gibt weitere Befehle an, die ausgeführt werden müssen, um die Statusprotokolle des Builds im Verlauf zu verfolgen. Ähnlich wie Folgendes:ibmcloud ce buildrun submit --build ghstats-build
ibmcloud ce buildrun logs -f -n ghstats-build-run-123456-123456789
App bereitstellen (Shell)
Sobald der Build bereit ist, können Sie die App mit dem Container-Image bereitstellen und danach die zuvor eingerichteten Services binden.
-
Bereitstellen der App bedeutet, dass eine Code Engine-App erstellt und mit ghstats-app benannt wird. Die App extrahiert das Image aus der angegebenen Registry und dem angegebenen Namensbereich.
ibmcloud ce app create --name ghstats-app --image private.icr.io/$NAMESPACE/codeengine-ghstats:latest --registry-secret ce-auto-icr-private-global
Nachdem die App bereitgestellt worden ist, können Sie überprüfen, ob sie an der URL verfügbar ist, die in der Ausgabe angezeigt wird. Die App ist nicht konfiguriert und daher noch nicht verwendbar. Den Bereitstellungsstatus können Sie mit dem Befehl
ibmcloud ce app list
überprüfen; Details erhalten Sie durch Ausführung vonibmcloud ce app get --name ghstats-app
.Die Mindestskalierung ist standardmäßig Null (0). Dies bedeutet, dass die Anzahl der aktiven Instanzen von Code Engine auf Null reduziert wird, wenn keine Workload für die App vorhanden ist. Dies spart Kosten, erfordert jedoch einen kurzen Neustart der App, wenn Sie die Skalierung wieder von Null heraufsetzen. Mit dem Parameter
--min 1
können Sie dies beim Erstellen oder Aktualisieren der App verhindern. -
Damit die eingerichteten Services genutzt werden können, müssen Sie sie an die App binden. Binden Sie zuerst IBM Db2 SaaS, dann App ID:
ibmcloud ce application bind --name ghstats-app --service-instance ghstatsDB
ibmcloud ce application bind --name ghstats-app --service-instance ghstatsAppID
Jede
application bind
erstellt die folgenden Ressourcen und Beziehungen:- Eine IAM Service-ID.
- Ein IAM-API-Schlüssel wird in der ID IAM Service erstellt.
- Ein Ressourcenserviceschlüssel. Diese werden in der Konsole von IBM Cloud als Serviceberechtigungsnachweise bezeichnet. Führen Sie den folgenden Befehl aus, um den Eintrag App ID anzuzeigen:
ibmcloud resource service-keys --instance-name ghstatsAppID
Anstatt die Services an die App zu binden, können Sie auch geheime Schlüssel oder Konfigurationszuordnungen verwenden. Diese können aus Werten gefüllt werden, die in Dateien gespeichert sind, oder als Literale übergeben werden. Eine Beispieldatei für Geheimnisse und die dazugehörige Anleitung finden Sie im GitHub für dieses Tutorial.
App-ID und GitHub-Konfiguration (Browser)
Die folgenden Schritte werden in Ihrem Internet-Browser ausgeführt. Zuerst konfigurieren Sie App ID für die Verwendung von Cloud Directory und der App. Anschließend erstellen Sie ein GitHub-Zugriffstoken. Das Token wird von der App Abrufen der Datenverkehrsdaten benötigt.
-
Öffnen Sie in der IBM Cloud®-Ressourcenliste die Übersicht über Ihre Services. Lokalisieren Sie die Instanz des App ID-Service im Abschnitt Services. Klicken Sie auf den zugehörigen Eintrag, um die Details zu öffnen.
-
Klicken Sie im Service-Dashboard im Menü auf der linken Seite auf Authentifizierung verwalten. Eine Liste der verfügbaren Identitätsprovider wie Facebook, Google, SAML 2.0 Federation und Cloud Directory wird angezeigt. Setzen Sie Cloud Directory auf Aktiviert und alle übrigen Provider auf Inaktiviert.
Möglicherweise möchten Sie die Mehrfaktorauthentifizierung (Multi-Factor Authentication, MFA) und erweiterte Kennwortregeln konfigurieren. Diese Komponenten werden im vorliegenden Lernprogramm nicht behandelt.
-
Klicken Sie in demselben Dialog auf die Registerkarte Authentifizierungseinstellung. Geben Sie in Web-Weiterleitungs-URLs hinzufügen die URL Ihrer Anwendung gefolgt von
/redirect_uri
ein, zum Beispielhttps://ghstats-app.56ab78cd90ef.us-south.codeengine.appdomain.cloud/redirect_uri
.Die Umleitungs-URL zum lokalen Testen der App lautet
http://127.0.0.1:5000/redirect_uri
. Sie können mehrere Umleitungs-URLs konfigurieren. Zum lokalen Testen der App kopieren Sie .env.local.template nach .env, passen Sie dies an und starten Sie die App mittelspython3 ghstats.py
. -
Erweitern Sie im Menü auf der linken Seite die Ansicht von Cloud Directory und klicken Sie auf Benutzer. Die Liste der Benutzer in Cloud Directory wird angezeigt. Klicken Sie auf die Schaltfläche Benutzer erstellen, um Ihren Benutzernamen als ersten Benutzer hinzuzufügen. Damit ist die Konfiguration des App ID-Service abgeschlossen.
-
Rufen Sie im Browser Github.com auf und gehen Sie zu Einstellungen -> Entwicklereinstellungen -> Persönliche Zugriffstoken. Klicken Sie auf die Schaltfläche "Neues Token generieren (klassisch )". Geben Sie GHStats Tutorial für den Hinweis ein. Aktivieren Sie anschließend public_repo in der Kategorie repo und read:org unter admin:org. Klicken Sie nun unten auf dieser Seite auf Token generieren. Das neue Zugriffstoken wird auf der nächsten Seite angezeigt. Sie benötigen das Token beim nachfolgenden Einrichten der Anwendungskonfiguration.
GitHub Zugangstoken
Python-App konfigurieren und testen
Im Anschluss an die Vorbereitung konfigurieren und testen Sie die App. Die App wurde in Python unter Verwendung des beliebten Flachmann-Mikroframeworks geschrieben. Sie können Repositorys für die Statistikerfassung hinzufügen oder entfernen. Auf die Verkehrsdaten können Sie in einer tabellarischen Ansicht oder in Form eines Kurvendiagramms zugreifen.
-
Öffnen Sie den URI der bereitgestellten App in einem Browser. Es sollte eine Begrüßungsseite angezeigt werden.
Eingangsanzeige -
Fügen Sie im Browser
/admin/initialize-app
zum URI hinzu und rufen Sie die Seite auf. Sie wird zum Initialisieren der Anwendung und der zugehörigen Daten verwendet. Klicken Sie auf die Schaltfläche Initialisierung starten. Daraufhin wird eine kennwortgeschützte Konfigurationsseite geöffnet. Die E-Mail-Adresse, mit der Sie sich anmelden, wird als Identifikation für den Systemadministrator verwendet. Verwenden Sie die E-Mail-Adresse und das Kennwort, die Sie zuvor konfiguriert haben. -
Geben Sie auf der Konfigurationsseite einen Namen ein (er wird als Begrüßung verwendet), sowie den GitHub-Benutzernamen und das Zugriffstoken, das Sie zuvor generiert haben. Klicken Sie auf Initialisieren. Daraufhin werden die Datenbanktabellen erstellt und einige Konfigurationswerte eingefügt. Abschließend werden Datenbankdatensätze für den Systemadministrator und einen Tenant erstellt.
Erster Schritt -
Nachdem der Vorgang abgeschlossen ist, wird die Liste der verwalteten Repositorys angezeigt. Sie können nun Repositorys hinzufügen, indem Sie den Namen des GitHub-Kontos oder der Organisation und den Namen des Repositorys angeben. Klicken Sie nach dem Eingeben der Daten auf Repository hinzufügen. Das Repository mit einer neu zugeordneten Kennung müsste in der Tabelle angezeigt werden. Sie können Repositorys aus dem System entfernen, indem Sie die zugehörigen IDs eingeben und auf Repository löschen klicken.
Liste der Repositorys -
Klicken Sie zum Testen auf Verwaltung und anschließend auf Statistik erfassen. Diese Aktion ruft die Verkehrsdaten bei Bedarf ab. Klicken Sie danach auf Repositorys und auf Täglicher Datenverkehr. Daraufhin sollten die erfassten Daten angezeigt werden.
Verkehrsdaten
Täglichen Datenabruf einrichten (Shell)
Nachdem die App erstellt und konfiguriert worden ist, muss zum Schluss der tägliche Abruf von GitHub-Verkehrsdaten initialisiert werden. Hierzu werden Sie ein Cron-Abonnement erstellen. Ähnlich wie bei einem Cron-Job abonniert die App Ereignisse nach dem angegebenen Zeitplan (Eventing).
-
Erstellen Sie das Cron-Abonnement ghstats-daily mit einem Tagesplan um 6.00 Uhr UTC mit einem POST-Ereignis im Pfad /collectStats. Ersetzen Sie im folgenden Befehl GEHEIMES_TOKEN_ALS_KENNUNG durch den von Ihnen gewählten Wert für den geheimen Schlüssel. Hiermit wird der Ereignisgeber für die App identifiziert.
ibmcloud ce subscription cron create --name ghstats-daily --destination ghstats-app --path /collectStats --schedule '0 6 * * *' --data '{"token":"SECRET_TOKEN_AS_IDENTIFIER"}' --content-type application/json
-
Nun müssen Sie die App aktualisieren, damit das geheime Token für die App bekannt wird. Ersetzen Sie im folgenden Befehl GEHEIMES_TOKEN_ALS_KENNUNG durch den Wert, den Sie im vorherigen Schritt ausgewählt haben.
ibmcloud ce app update --name ghstats-app --registry-secret usicr --env EVENT_TOKEN=SECRET_TOKEN_AS_IDENTIFIER
Hierdurch wird eine neue Revision der App erstellt. Ob die Ereignisse empfangen und von der App verarbeitet wurden, können Sie überprüfen, indem Sie in der App zu Verwaltung und dann zu Systemprotokoll navigieren.
Mit dem obigen Befehl wird ein Zeitplan für täglich 6.00 Uhr (UTC) erstellt. Wenn Sie direkt überprüfen wollen, ob das Eventing funktioniert, wählen Sie einen Zeitpunkt aus, der einige Minuten nach der aktuellen Uhrzeit liegt (in UTC konvertiert).
Schlussbemerkungen
In diesem Lernprogramm haben Sie eine serverunabhängige App in IBM Cloud Code Engine bereitgestellt. Die App-Quelle wurde aus einem GitHub-Repository verwendet. Sie haben Code Engine angewiesen, das Container-Image zu erstellen und in IBM Cloud® Container Registry zu speichern. Anschließend wurde das Image mit einer Pull-Operation daraus extrahiert und als Container bereitgestellt. Die App ist an IBM Cloud-Services gebunden worden.
Die App und das zugehörige Eventing ermöglichen den automatischen Abruf von Verkehrsdaten für GitHub-Repositorys. Informationen zu diesen Repositorys (einschließlich des tenantspezifischen Zugriffstokens) werden in einer SQL-Datenbank (IBM Db2 Warehouse SaaS) gespeichert. Diese Datenbank wird von der Python-App verwendet, um Benutzer und Repositorys zu verwalten und Datenverkehrsstatistiken anzuzeigen. Für Benutzer werden die Datenverkehrsstatistiken in durchsuchbaren Tabellen angezeigt oder in einem einfachen Kurvendiagramm (siehe nachfolgende Abbildung) dargestellt. Die Liste der Repositorys und die Datenverkehrsdaten können außerdem als CSV-Dateien heruntergeladen werden.

Sicherheit: Serviceberechtigungsnachweise turnusmäßig wechseln
Wenn Sie diese Lösung in der Produktion einsetzen, sollten Sie die Serviceberechtigungsnachweise in regelmäßigen Zeitabständen wechseln. Viele Sicherheitsrichtlinien erfordern, dass Kennwörter und Berechtigungsnachweise alle 3 Monate oder in ähnlichen Zeitabständen geändert werden.
Sie können die Berechtigungsnachweise für die an die App gebundenen Services neu erstellen und dadurch turnusmäßig wechseln, indem Sie die Bindung der Services aufheben und die Services anschließend erneut binden. Wenn Sie anstelle von Servicebindungen geheime Schlüssel verwenden, haben Sie sogar noch mehr Möglickeiten, indem Sie zunächst Serviceschlüssel erneut erstellen, anschließend die geheimen Schlüssel aktualisieren und zum Schluss die App aktualisieren.
Ressourcen entfernen
Zum Bereinigen der Ressourcen, die für dieses Lernprogramm verwendet wurden, können Sie das zugehörige Projekt und die Services löschen.
- Heben Sie die Bindung der bereitgestellten Services auf. Zuerst die Bindungen anzeigen und dann nach Namen der Servicebindungen löschen (FIRST und SECOND unten stammen aus der Get-Ausgabe)
ibmcloud ce application get --name ghstats-app
ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-FIRST
ibmcloud ce application unbind --name ghstats-app --binding ghstats-app-ce-service-binding-SECOND
- Löschen Sie das Projekt und seine Komponenten.
ibmcloud ce project delete --name ghstats --hard -f
- Löschen Sie die Services:
ibmcloud resource service-instance-delete -f ghstatsDB
ibmcloud resource service-instance-delete -f ghstatsAppID
- Löschen Sie den Namensraum Container Registry
ibmcloud cr namespace-rm $NAMESPACE -f
- Löschen Sie das Github.com-Token.
Je nach Ressource wird diese möglicherweise nicht sofort gelöscht, sondern (standardmäßig für 7 Tage) aufbewahrt. Sie können die Ressource zurückfordern, indem Sie sie permanent löschen oder innerhalb des Aufbewahrungszeitraums wiederherstellen. In diesem Dokument erfahren Sie mehr zur Verwendung der Ressourcenrückforderung.
Lernprogramm erweitern
Sie möchten dieses Lernprogramm ergänzen oder ändern? Hier einige Vorschläge:
- Erweitern Sie die App durch Multi-Tenant-Unterstützung.
- Verwenden Sie Identitätsprovider für soziale Netze.
- Fügen Sie auf der Statistikseite ein Datumsauswahlfeld zum Filtern der angezeigten Daten hinzu.
- Verwenden Sie eine angepasste Anmeldeseite für App ID.
Zugehörige Inhalte
Hier finden Sie Links mit weiteren Informationen zu den in diesem Lernprogramm behandelten Themen. Die App selbst ist in diesem GitHub verfügbar.
Dokumentation: