Tutorial: Erstellen einer Tomcat-Web-App mit Azure App Service für Linux und MySQL
In diesem Tutorial wird gezeigt, wie Sie eine sichere Tomcat-Anwendung in Azure App Service erstellen, konfigurieren und bereitstellen, die eine Verbindung mit einer MySQL-Datenbank herstellt (mithilfe von Azure Database for MySQL). Azure App Service ist ein hochgradig skalierbarer Webhostingdienst mit Self-Patching, der Apps problemlos unter Windows oder Linux bereitstellen kann. Wenn Sie fertig sind, verfügen Sie über eine Tomcat-App, die in Azure App Service für Linux ausgeführt wird.
In diesem Tutorial lernen Sie Folgendes:
- Erstellen Sie eine sichere standardmäßige Architektur für Azure App Service und Azure Database for MySQL.
- Schützen von Verbindungsgeheimnissen mit einer verwalteten Identität und Key Vault-Verweisen
- Bereitstellen einer Tomcat-Beispiel-App in App Service aus einem GitHub-Repository
- Zugreifen auf App Service-App-Einstellungen im Anwendungscode
- Vornehmen von Änderungen und erneutes Bereitstellen des Anwendungscodes
- Streamen von Diagnoseprotokollen aus App Service
- Verwalten der App im Azure-Portal
- Bereitstellen derselben Architektur und Bereitstellen mithilfe der Azure Developer CLI
- Optimieren des Entwicklungsworkflows mit GitHub Codespaces und GitHub Copilot
Voraussetzungen
- Ein Azure-Konto mit einem aktiven Abonnement. Falls Sie kein Azure-Konto besitzen, können Sie kostenlos eines erstellen.
- Ein GitHub-Konto. Sie können einen solchen Schlüssel auch kostenlos abrufen.
- Java-Kenntnisse zur Tomcat-Entwicklung
- (Optional) Ein GitHub Copilot-Konto, um GitHub Copilot zu testen. Es ist eine kostenlose 30-Tage-Testversion verfügbar.
- Ein Azure-Konto mit einem aktiven Abonnement. Falls Sie kein Azure-Konto besitzen, können Sie kostenlos eines erstellen.
- Eine installierte Azure Developer CLI. Sie können die Schritte mit der Azure Cloud Shell ausführen, da Azure Developer CLI dort bereits installiert ist.
- Java-Kenntnisse zur Tomcat-Entwicklung
- (Optional) Ein GitHub Copilot-Konto, um GitHub Copilot zu testen. Es ist eine kostenlose 30-Tage-Testversion verfügbar.
Zum Ende springen
Sie können die Beispiel-App in diesem Tutorial schnell bereitstellen und in Azure anzeigen. Führen Sie einfach die folgenden Befehle in Azure Cloud Shell aus, und befolgen Sie die Eingabeaufforderung:
mkdir msdocs-tomcat-mysql-sample-app
cd msdocs-tomcat-mysql-sample-app
azd init --template msdocs-tomcat-mysql-sample-app
azd up
1. Ausführen des Beispiels
Zunächst richten Sie eine datengesteuerte Beispiel-App als Ausgangspunkt ein. Das Beispielrepository umfasst der Einfachheit halber eine Entwicklercontainerkonfiguration. Der Entwicklercontainer verfügt über alles, was Sie zum Entwickeln einer Anwendung benötigen, einschließlich der Datenbank, des Caches und aller Umgebungsvariablen, die von der Beispielanwendung benötigt werden. Der Entwicklercontainer kann in einem GitHub-Codespace ausgeführt werden, was bedeutet, dass Sie das Beispiel auf jedem Computer mit einem Webbrowser ausführen können.
Schritt 1: In einem neuen Browserfenster:
- Melden Sie sich bei Ihrem GitHub-Konto an.
- Navigieren Sie zu https://github.com/Azure-Samples/msdocs-tomcat-mysql-sample-app/fork.
- Deaktivieren Sie die Option Nur Mainbranch kopieren. Sie benötigen alle Branches.
- Wählen Sie Fork erstellen aus.
Schritt 2: Im GitHub-Fork:
- Wählen Sie für den Startbranch main>starter-no-infra aus. Dieser Branch enthält nur das Beispielprojekt und keine Azure-bezogenen Dateien oder Konfigurationen.
- Wählen Sie Code>Codespace in starter-no-infra erstellen aus. Das Einrichten des Codespace dauert einige Minuten.
Schritt 3: Im Codespace-Terminal:
- Führen Sie
mvn jetty:run
aus. - Wenn die Benachrichtigung
Your application running on port 80 is available.
angezeigt wird, wählen Sie Im Browser öffnen aus. Die Beispielanwendung sollte auf einer neuen Browserregisterkarte angezeigt werden. Geben SieCtrl
+C
ein, um den Jetty-Server zu beenden.
Tipp
Sie können GitHub Copilot über dieses Repository befragen. Zum Beispiel:
- @workspace Was macht dieses Projekt?
- @workspace Wofür dient der Ordner „.devcontainer“?
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
2. Erstellen von App Service und MySQL
Zuerst erstellen Sie die Azure-Ressourcen. Die in diesem Tutorial ausgeführten Schritte erstellen eine Reihe standardmäßig sicherer Ressourcen, die App Service und Azure Database for MySQL umfassen. Für den Erstellungsprozess geben Sie Folgendes an:
- Den Namen für die Web-App. Er wird als Teil des DNS-Namens für Ihre App in Form von
https://<app-name>-<hash>.<region>.azurewebsites.net
verwendet. - Die Region für die physische Ausführung der App in der Welt Sie wird auch als Teil des DNS-Namens für Ihre App verwendet.
- Der Runtimestapel für die App. Hier wählen Sie die Version von Java aus, die für Ihre App verwendet werden soll.
- Der Hostingplan für die App. Dies ist der Tarif, der die Features und Skalierungskapazität für Ihre App enthält.
- Die Ressourcengruppe für die App. Mit einer Ressourcengruppe können Sie (in einem logischen Container) alle für die Anwendung benötigten Azure-Ressourcen gruppieren.
Melden Sie sich beim Azure-Portal an, und führen Sie die folgenden Schritte aus, um Ihre Azure App Service-Ressourcen zu erstellen.
Schritt 1: Im Azure-Portal:
- Geben Sie auf der Suchleiste oben im Azure-Portal „Web App Datenbank“ ein.
- Wählen Sie das Element mit der Bezeichnung Web-App + Datenbank unter der Überschrift Marketplace aus. Sie können auch direkt zum Erstellungs-Assistenten navigieren.
Schritt 2: Füllen Sie das Formular auf der Seite Web-App und Datenbank erstellen wie folgt aus.
- Ressourcengruppe: Wählen Sie die Option Neu erstellen aus, und verwenden Sie einen Namen wie msdocs-tomcat-mysql-tutorial.
- Region: Eine beliebige Azure-Region in Ihrer Nähe.
- Name: msdocs-tomcat-mysql-XYZ, wobei XYZ für drei beliebige Zeichen steht.
- Laufzeitstapel: Java 17.
- Java-Webserverstapel: Apache Tomcat 10.1.
- MySQL – Flexibler Server ist standardmäßig als Datenbankmodul ausgewählt. Falls nicht, wählen Sie die Option aus. Azure Database for MySQL ist eine vollständig verwaltete MySQL-Datenbank als Dienst auf Azure, kompatibel mit den neuesten Community-Editionen.
- Hostingplan: Basic. Wenn Sie bereit sind, können Sie auf einen Produktionstarif hochskalieren.
- Klicken Sie auf Überprüfen + erstellen.
- Wenn die Überprüfung abgeschlossen ist, wählen Sie Erstellen aus.
Schritt 3: Die Durchführung der Bereitstellung dauert einige Minuten. Wählen Sie nach Abschluss der Bereitstellung die Schaltfläche Zu Ressource wechseln aus. Sie werden direkt zur App Service App weitergeleitet, aber die folgenden Ressourcen werden erstellt:
- Ressourcengruppe: Der Container für alle erstellten Ressourcen.
- App Service-Plan: Definiert die Berechnungsressourcen für App Service. Ein Linux-Plan im Basic-Tarif wird erstellt.
- App Service: Stellt Ihre App dar und wird im App Service Plan ausgeführt.
- Virtuelles Netzwerk: Integriert in die App Service-App und isoliert den Back-End-Netzwerkdatenverkehr.
- Azure Database for MySQL – Flexibler Server: Nur über das virtuelle Netzwerk zugänglich. Eine Datenbank und ein Benutzer werden für Sie auf dem Server erstellt.
- Private DNS-Zonen: Aktivieren die DNS-Auflösung des Datenbankservers im virtuellen Netzwerk.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
3. Schützen von Verbindungsgeheimnissen
Der Erstellungs-Assistent hat die Verbindungszeichenfolge für Sie bereits als App-Einstellungen generiert. Die bewährte Sicherheitsmethode besteht jedoch darin, Geheimnisse vollständig aus App Service herauszuhalten. Sie verschieben Ihre Geheimnisse in einen Schlüsseltresor und ändern Ihre App-Einstellung mithilfe von Dienstconnectors in einen Key Vault-Verweis.
Schritt 1: Auf der App Service-Seite:
- Wählen Sie im linken Menü Einstellungen > Umgebungsvariablen aus.
- Wählen Sie AZURE_MYSQL_CONNECTIONSTRING. Es enthält eine JDBC-Verbindungszeichenfolge. Wenn Sie eine App-Einstellung hinzufügen, die eine gültige Oracle-, SQL Server-, PostgreSQL- oder MySQL-Verbindungszeichenfolge enthält, injiziert App Service sie als JNDI-Datenquelle (Java Naming and Directory Interface) in die Datei context.xml des Tomcat-Servers.
- Suchen Sie in Anwendungseinstellung hinzufügen/bearbeiten im Feld Wert den Teil password= am Ende der Zeichenfolge.
- Kopieren Sie die Kennwortzeichenfolge nach Password= zur späteren Verwendung. Mit dieser Anwendungseinstellung können Sie eine Verbindung mit der MySQL-Datenbank herstellen, die hinter einem privaten Endpunkt geschützt wird. Das Geheimnis wird jedoch direkt in der App Service-App gespeichert, was nicht optimal ist. Sie ändern dieses Verhalten.
Schritt 2: Erstellen eines Schlüsseltresors für die sichere Verwaltung von Geheimnissen
- Geben Sie in der oberen Suchleiste key vault ein, und wählen Sie dann Marketplace>Key Vault aus.
- Wählen Sie in Ressourcengruppe msdocs-tomcat-mysql-tutorial aus.
- Geben Sie unter Schlüsseltresornamen einen Namen ein, der nur aus Buchstaben und Zahlen besteht.
- Legen Sie den Wert für Region auf den Beispielstandort der Ressourcengruppe fest.
Schritt 3:
- Wählen Sie die Registerkarte Netzwerk aus.
- Deaktivieren SieÖffentlichen Zugriff aktivieren.
- Wählen sie Privaten Endpunkt erstellen aus.
- Wählen Sie in Ressourcengruppe msdocs-tomcat-mysql-tutorial aus.
- Geben Sie unter Schlüsseltresornamen einen Namen ein, der nur aus Buchstaben und Zahlen besteht.
- Legen Sie den Wert für Region auf den Beispielstandort der Ressourcengruppe fest.
- Wählen Sie im Dialogfeld unter Standort denselben Standort wie für Ihre App Service-App aus.
- Wählen Sie in Ressourcengruppe msdocs-tomcat-mysql-tutorial aus.
- Geben Sie in Name msdocs-tomcat-mysql-XYZVaultEndpoint ein.
- Wählen Sie im virtuellen Netzwerk msdocs-tomcat-mysql-XYZVnet aus.
- In Subnet wählen Sie msdocs-tomcat-mysql-XYZSubnet.
- Wählen Sie OK aus.
- Klicken Sie aufÜberprüfen + erstellen und dann auf Erstellen. Warten Sie, bis die Bereitstellung des Schlüsseltresors abgeschlossen ist. Die Meldung „Ihre Bereitstellung wurde abgeschlossen.“ sollte angezeigt werden.
Schritt 4:
- Geben Sie in der oberen Suchleiste msdocs-tomcat-mysql und dann die App-Dienstressource msdocs-tomcat-mysql-XYZ ein.
- Wählen Sie auf der App Service-Seite im linken Menü Einstellungen > Dienstconnector aus. Es gibt bereits einen Connector, den der App-Erstellungs-Assistent für Sie erstellt hat.
- Aktivieren Sie das Kontrollkästchen neben dem Connector, und wählen Sie dann Bearbeiten aus.
- Legen Sie auf der Registerkarte Grundlagen die Option Clienttyp auf Java fest.
- Wählen Sie die Registerkarte Authentifizierung aus.
- Fügen Sie unter Kennwort das Kennwort ein, das Sie zuvor kopiert haben.
- Wählen Sie Geheimnis in Key Vault speichern aus.
- Wählen Sie unter Key Vault-Verbindung die Option Neu erstellen aus. Über dem Bearbeitungsdialogfeld wird das Dialogfeld Verbindung erstellen geöffnet.
Schritt 5: Im Dialogfeld Verbindung erstellen für die Key Vault-Verbindung:
- Wählen Sie unter Schlüsseltresor den zuvor erstellten Schlüsseltresor aus.
- Klicken Sie auf Überprüfen + erstellen. Sie sehen, dass das Feld Systemseitig zugewiesene verwaltete Identität auf Ausgewählt festgelegt ist.
- Wählen Sie nach Abschluss der Überprüfung Erstellen aus.
Schritt 6: Sie befinden sich wieder im Bearbeitungsdialogfeld für defaultConnector.
- Warten Sie auf der Registerkarte Authentifizierung, bis der Schlüsseltresorconnector erstellt wurde. Nach Abschluss des Vorgangs wird er automatisch in der Dropdownliste Key Vault-Verbindung ausgewählt.
- Klicken Sie auf Weiter: Netzwerk.
- Wählen Sie Speichern. Warten Sie, bis die Benachrichtigung Update erfolgreich angezeigt wird.
Schritt 7: So überprüfen Sie Ihre Änderungen:
- Wählen Sie im linken Menü erneut Verbindungszeichenfolgen> Umgebungsvariablen aus.
- Wählen Sie neben AZURE_MYSQL_CONNECTIONSTRING die Option Wert anzeigen aus. Der Wert sollte
@Microsoft.KeyVault(...)
lauten. Das bedeutet, dass es sich um einen Schlüsseltresorverweis handelt, da das Geheimnis jetzt im Schlüsseltresor verwaltet wird.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
4. Überprüfen der JNDI-Datenquelle
Wenn Sie eine App-Einstellung hinzufügen, die eine gültige JDBC-Verbindungszeichenfolge für Oracle, SQL Server, PostgreSQL oder MySQL enthält, fügt App Service dafür eine JNDI-Datenquelle (Java Naming and Directory Interface) in der Datei context.xml des Tomcat-Servers hinzu. In diesem Schritt verwenden Sie die SSH-Verbindung mit dem App-Container, um die JNDI-Datenquelle zu überprüfen. Im Prozess erfahren Sie, wie Sie auf die SSH-Shell für den Tomcat-Container zugreifen.
Schritt 1: Zurück auf der App Service-Seite:
- Wählen Sie im linken Menü SSH aus.
- Klicken Sie auf Starten.
Schritt 2: Führen Sie im SSH-Terminal cat /usr/local/tomcat/conf/context.xml
aus. Sie sollten sehen, dass eine JNDI-Ressource namens jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
hinzugefügt wurde. Sie verwenden diese Datenquelle später.
Hinweis
Nur Änderungen an Dateien in /home
können über den Neustart der App hinaus beibehalten werden. Wenn Sie z. B. /usr/local/tomcat/conf/server.xml
bearbeiten, bleiben die Änderungen über einen App-Neustart hinaus nicht erhalten.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
5. Bereitstellen von Beispielcode
In diesem Schritt konfigurieren Sie die GitHub-Bereitstellung mithilfe von GitHub Actions. Es ist nur eine der vielen Möglichkeiten, um App Service bereitzustellen, aber auch eine hervorragende Möglichkeit, eine kontinuierliche Integration in Ihren Bereitstellungsprozess zu haben. Standardmäßig startet jede git push
in Ihrem GitHub-Repository die Build- und Bereitstellungsaktion.
Wie bei Tomcat üblich, benennen Sie Ihr erstelltes Artefakt ROOT.war, wenn Sie es im Stammkontext von Tomcat bereitstellen möchten.
Schritt 1: Wählen Sie zurück auf der App Service-Seite im Menü auf der linken Seite die Option Bereitstellungscenter aus.
Schritt 2: Auf der Seite „Bereitstellungscenter“:
- Wählen Sie in Quelle die Option GitHub aus. Standardmäßig wird GitHub Actions als Buildanbieter ausgewählt.
- Melden Sie sich bei Ihrem GitHub-Konto an und folgen Sie der Aufforderung, Azure zu autorisieren.
- Wählen Sie in Organisation Ihr Konto aus.
- Wählen Sie unter Repository das Repository msdocs-tomcat-mysql-sample-app aus.
- Wählen Sie unter Branch den Eintrag starter-no-infra aus. Dies ist der gleiche Branch, in dem Sie mit Ihrer Beispiel-App gearbeitet haben, ohne Azure-bezogene Dateien oder Konfigurationen.
- Wählen Sie unter Authentifizierungstyp die Option Benutzerseitig zugewiesene Identität aus.
- Wählen Sie im oberen Menü Speichern aus. App Service committet eine Workflowdatei in das ausgewählte GitHub-Repository im
.github/workflows
-Verzeichnis. Standardmäßig erstellt das Bereitstellungscenter eine benutzerseitig zugewiesene Identität für den Workflow zur Authentifizierung mithilfe von Microsoft Entra (OIDC-Authentifizierung). Weitere Informationen zu alternativen Authentifizierungsoptionen finden Sie unter Bereitstellen in App Service mithilfe von GitHub Actions.
Schritt 3: führen Sie zurück im GitHub-Codespace Ihrer Beispiel-Verzweigung git pull origin starter-no-infra
aus.
Dadurch wird die neu committete Workflowdatei in Ihren Codespace übertragen.
Schritt 4 (Option 1: mit GitHub Copilot):
- Starten Sie eine neue Chatsitzung, indem Sie die Chatansicht und dann + auswählen.
- Fragen Sie „@workspace Wie stellt die App eine Verbindung mit der Datenbank her?“ Copilot gibt Ihnen möglicherweise einige Erläuterungen über die
jdbc/MYSQLDS
-Datenquelle und wie sie konfiguriert wird. - Fragen Sie Folgendes: „@workspace Ich möchte die in der Datei „persistence.xml“ definierte Datenquelle durch eine vorhandene JNDI-Datenquelle in Tomcat ersetzen, aber ich möchte dies dynamisch ausführen.“. Copilot gibt Ihnen möglicherweise einen Codevorschlag ähnlich dem in den Schritten unter Option 2: ohne GitHub Copilot unten und schlägt Ihnen sogar vor, die Änderung in der ContextListener-Klasse vorzunehmen.
- Öffnen Sie src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java im Explorer, und fügen Sie den Codevorschlag in der
contextInitialized
-Methode hinzu. GitHub Copilot gibt Ihnen nicht jedes Mal die gleiche Antwort. Möglicherweise müssen Sie zusätzliche Fragen stellen, um die Antwort zu optimieren. Tipps finden Sie unter Was kann ich mit GitHub Copilot in meinem Codespace machen?.
Schritt 4 (Option 2: ohne GitHub Copilot):
- Öffnen Sie src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java im Explorer. Wenn die Anwendung gestartet wird, lädt diese Klasse die Datenbankeinstellungen in src/main/resources/META-INF/persistence.xml.
- Suchen Sie in der
contextIntialized()
-Methode den kommentierten Code (Zeilen 29–33), und heben Sie die Auskommentierung auf. Mit diesem Code wird überprüft, ob die App-EinstellungAZURE_MYSQL_CONNECTIONSTRING
vorhanden ist, und ändert die Datenquelle injava:comp/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
. Dabei handelt es sich um die Datenquelle, die Sie weiter oben in context.xml in der SSH-Shell gefunden haben.
Schritt 5:
- Wählen Sie die Quellsteuerungserweiterung aus.
- Geben Sie im Textfeld eine Commitnachricht ein, z. B.
Configure Azure data source
. - Wählen Sie Commit aus, und bestätigen Sie dann mit Ja.
- Wählen Sie Änderungen synchronisieren 1 aus, und bestätigen Sie dann mit OK.
Schritt 6: Zurück auf der Seite „Bereitstellungscenter“ im Azure-Portal:
- Wählen Sie Protokolle aus. Eine neue Bereitstellungsausführung wurde bereits durch Ihre committeten Änderungen gestartet.
- Wählen Sie in dem Protokollelement für die Bereitstellungsausführung den Eintrag Build/Deploy Logs mit dem neuesten Zeitstempel aus.
Schritt 7: Sie werden zu Ihrem GitHub-Repository weitergeleitet und sehen, dass die GitHub-Aktion ausgeführt wird. Die Workflowdatei definiert zwei separate Phasen, Erstellen und Bereitstellen. Warten Sie, bis die GitHub-Ausführung den Status Abgeschlossen anzeigt. Dies dauert ca. 5 Minuten.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
6. Navigieren zur App
Schritt 1: Auf der App Service-Seite:
- Wählen Sie im Menü auf der linken Seite die Option Übersicht aus.
- Wählen Sie die URL Ihrer App aus.
Schritt 2: Fügen Sie der Liste einige Aufgaben hinzu. Glückwunsch! Sie führen eine Web-App in Azure App Service mit sicherer Konnektivität zu Azure Database for MySQL aus.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
7. Streamen von Diagnoseprotokollen
Azure App Service erfasst alle Nachrichten, die in der Konsole ausgegeben werden, um Sie bei der Diagnose von Problemen mit Ihrer Anwendung zu unterstützen. Die Beispielanwendung enthält standardmäßige Log4j-Protokollierungsanweisungen, um diese Funktion wie im folgenden Codeschnipsel dargestellt zu veranschaulichen.
@WebServlet(urlPatterns = "/")
public class ViewServlet extends HttpServlet {
private static Logger logger = LogManager.getLogger(ViewServlet.class.getName());
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("GET /");
EntityManagerFactory emf = (EntityManagerFactory) req.getServletContext().getAttribute("EMFactory");
Schritt 1: Auf der App Service-Seite:
- Wählen Sie im linken Menü App Service-Protokolle aus.
- Wählen Sie unter Anwendungsprotokollierung die Option Dateisystem aus.
- Wählen Sie im oberen Menü Speichern aus.
Schritt 2: Wählen Sie im Menü auf der linken Seite die Option Protokollstream aus. Sie sehen die Protokolle für Ihre App, einschließlich Plattformprotokolle und Protokolle innerhalb des Containers.
Erfahren Sie mehr über die Protokollierung in Java-Apps in der Reihe unter Azure Monitor OpenTelemetry für .NET-, Node.js-, Python- und Java-Anwendungen aktivieren.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
8. Bereinigen von Ressourcen
Wenn Sie fertig sind, können Sie alle Ressourcen aus Ihrem Azure-Abonnement löschen, indem Sie die Ressourcengruppe löschen.
Schritt 1: In der Suchleiste oben im Azure-Portal:
- Geben Sie den Ressourcengruppennamen ein.
- Wählen Sie die Ressourcengruppe aus.
Schritt 2: Wählen Sie auf der Seite „Ressourcengruppe“ die Option Ressourcengruppe löschen aus.
Schritt 3:
- Geben Sie den Namen der Ressourcengruppe ein, um Ihre Löschung zu bestätigen.
- Klicken Sie auf Löschen.
- Bestätigen Sie erneut mit Löschen.
2. Erstellen von Azure-Ressourcen und Bereitstellen einer Beispiel-App
In diesem Schritt erstellen Sie die Azure-Ressourcen und stellen eine Beispiel-App für App Service für Linux bereit. Die in diesem Tutorial ausgeführten Schritte erstellen eine Reihe standardmäßig sicherer Ressourcen, die App Service und Azure Database for MySQL umfassen.
Der Entwicklercontainer verfügt bereits über die Azure Developer CLI (AZD).
Führen Sie im Repositorystamm
azd init
aus.azd init --template tomcat-app-service-mysql-infra
Wenn Sie dazu aufgefordert werden, geben Sie die folgenden Antworten:
Frage Antwort Das aktuelle Verzeichnis ist nicht leer. Möchten Sie ein Projekt hier in <Ihr Verzeichnis> initialisieren? Y Was möchten Sie mit diesen Dateien tun? Meine vorhandenen Dateien unverändert beibehalten Geben Sie einen neuen Umgebungsnamen ein. Geben Sie einen eindeutigen Namen ein. Die AZD-Vorlage verwendet diesen Namen als Teil des DNS-Namens Ihrer Web-App in Azure ( <app-name>-<hash>.azurewebsites.net
). Alphanumerische Zeichen und Bindestriche sind zulässig.Melden Sie sich mithilfe des Befehls
azd auth login
bei Azure an, und folgen Sie der Eingabeaufforderung:azd auth login
Führen Sie den
azd up
-Befehl aus, um die notwendigen Azure-Ressourcen zu erstellen und den App-Code bereitzustellen. Folgen Sie der Eingabeaufforderung, um das gewünschte Abonnement und den gewünschten Standort für die Azure-Ressourcen auszuwählen.azd up
Die Ausführung des Befehls
azd up
ist etwa 15 Minuten.(Der Großteil der Zeit fällt für den Redis-Cache an.) Außerdem wird Ihr Anwendungscode kompiliert und bereitgestellt. Sie ändern den Code jedoch später so, dass er mit App Service funktioniert. Während der Ausführung stellt der Befehl Nachrichten zum Bestimmungs- und Bereitstellungsprozess bereit, einschließlich eines Links zur Bereitstellung in Azure. Wenn er abgeschlossen ist, zeigt der Befehl auch einen Link zur Bereitstellungsanwendung an.Diese AZD-Vorlage enthält Dateien (azure.yaml und das Verzeichnis infra), die eine standardmäßig sichere Architektur mit den folgenden Azure-Ressourcen generieren:
- Ressourcengruppe: Der Container für alle erstellten Ressourcen.
- App Service-Plan: Definiert die Berechnungsressourcen für App Service. Ein Linux-Plan im B1-Tarif wird erstellt.
- App Service: Stellt Ihre App dar und wird im App Service Plan ausgeführt.
- Virtuelles Netzwerk: Integriert in die App Service-App und isoliert den Back-End-Netzwerkdatenverkehr.
- Azure Database for MySQL – Flexibler Server: Nur über das virtuelle Netzwerk durch die DNS-Zonenintegration zugänglich. Eine Datenbank wird für Sie auf dem Server erstellt.
- Azure Cache for Redis: Nur innerhalb des virtuellen Netzwerks zugänglich.
- Private Endpunkte: Zugriffsendpunkte für den Key Vault und den Redis-Cache im virtuellen Netzwerk.
- Private DNS-Zonen: Aktivieren der DNS-Auflösung des Schlüsseltresors, des Datenbankservers und des Redis-Cache im virtuellen Netzwerk.
- Log Analytics-Arbeitsbereich: Fungiert als Zielcontainer für Ihre App, um die Protokolle zu versenden. Dort können Sie auch die Protokolle abfragen.
- Key Vault: Wird verwendet, um das Datenbankkennwort beim erneuten Bereitstellen mit AZD beizubehalten.
Wenn der Befehl die Ressourcenerstellung abgeschlossen und den Anwendungscode zum ersten Mal bereitgestellt hat, funktioniert die bereitgestellte Beispiel-App noch nicht, da Sie kleine Änderungen vornehmen müssen, um eine Verbindung mit der Datenbank in Azure herzustellen.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
3. Überprüfen von Verbindungszeichenfolgen
Die von Ihnen verwendete AZD-Vorlage hat die Konnektivitätsvariablen für Sie bereits als App-Einstellungen generiert und gibt sie der Einfachheit halber im Terminal für Sie aus. App-Einstellungen sind eine Möglichkeit, um Verbindungsgeheimnisse aus Ihrem Coderepository herauszuhalten.
Suchen Sie in der AZD-Ausgabe die App-Einstellung
AZURE_MYSQL_CONNECTIONSTRING
. Nur die Einstellungsnamen werden angezeigt. Sie sehen in der AZD-Ausgabe wie folgt aus:App Service app has the following connection strings: - AZURE_MYSQL_CONNECTIONSTRING - AZURE_REDIS_CONNECTIONSTRING - AZURE_KEYVAULT_RESOURCEENDPOINT - AZURE_KEYVAULT_SCOPE
AZURE_MYSQL_CONNECTIONSTRING
enthält die Verbindungszeichenfolge für die MySQL-Datenbank in Azure. Sie müssen sie später in Ihrem Code verwenden.Der Einfachheit halber enthält die AZD-Vorlage den direkten Link zur Seite „App-Einstellungen“ der App. Suchen Sie den Link, und öffnen Sie ihn auf einer neuen Browserregisterkarte.
Wenn Sie eine App-Einstellung hinzufügen, die eine gültige Oracle-, SQL Server-, PostgreSQL- oder MySQL-Verbindungszeichenfolge enthält, fügt App Service sie als JNDI-Datenquelle (Java Naming and Directory Interface) in der Datei context.xml des Tomcat-Servers hinzu.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
4. Überprüfen der JNDI-Datenquelle
In diesem Schritt verwenden Sie die SSH-Verbindung mit dem App-Container, um die JNDI-Datenquelle auf dem Tomcat-Server zu überprüfen. Im Prozess erfahren Sie, wie Sie auf die SSH-Shell für den Tomcat-Container zugreifen.
Suchen Sie in der AZD-Ausgabe die URL für die SSH-Sitzung, und navigieren Sie im Browser dorthin. Die Ausgabe sieht wie folgt aus:
Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
Führen Sie im SSH-Terminal
cat /usr/local/tomcat/conf/context.xml
aus. Sie sollten sehen, dass eine JNDI-Ressource namensjdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
hinzugefügt wurde. Sie verwenden diese Datenquelle später.
Hinweis
Nur Änderungen an Dateien in /home
können über den Neustart der App hinaus beibehalten werden. Wenn Sie z. B. /usr/local/tomcat/conf/server.xml
bearbeiten, bleiben die Änderungen über einen App-Neustart hinaus nicht erhalten.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
5. Ändern des Beispielcodes und erneutes Bereitstellen
Starten Sie im GitHub-Codespace eine neue Chatsitzung, indem Sie die Chatansicht und dann + auswählen.
Fragen Sie „@workspace Wie stellt die App eine Verbindung mit der Datenbank her?“ Copilot gibt Ihnen möglicherweise einige Erläuterungen über die
jdbc/MYSQLDS
-Datenquelle und wie sie konfiguriert wird.Frage: „@workspace Ich möchte die in persistence.xml definierte Datenquelle durch eine vorhandene JNDI-Datenquelle in Tomcat ersetzen, aber ich möchte sie dynamisch ausführen.“ Copilot gibt Ihnen möglicherweise einen Codevorschlag, ähnlich den Schritten in Option 2: ohne GitHub Copilot unten und sagt Ihnen sogar, dass die Änderung in der ContextListener-Klasse vorgenommen werden muss.
Öffnen Sie src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java im Explorer, und fügen Sie den Codevorschlag in der
contextInitialized
-Methode hinzu.GitHub Copilot gibt Ihnen nicht jedes Mal die gleiche Antwort. Möglicherweise müssen Sie andere Fragen stellen, um die Antwort zu optimieren. Tipps finden Sie unter Was kann ich mit GitHub Copilot in meinem Codespace machen?.
Führen Sie im Codespace-Terminal
azd deploy
aus.azd deploy
Tipp
Sie können auch immer nur azd up
verwenden. Damit wird azd package
, azd provision
und azd deploy
ausgeführt.
Um herauszufinden, wie die WAR-Datei verpackt ist, können Sie azd package --debug
selbst ausführen.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
6. Navigieren zur App
Suchen Sie in der AZD-Ausgabe die URL für Ihre App, und navigieren Sie im Browser dorthin. Die URL sieht in der AZD-Ausgabe wie folgt aus:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: https://<app-name>-<hash>.azurewebsites.net/
Fügen Sie der Liste einige Aufgaben hinzu.
Glückwunsch! Sie führen eine Web-App in Azure App Service mit sicherer Konnektivität zu Azure Database for MySQL aus.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
7. Streamen von Diagnoseprotokollen
Azure App Service kann Konsolenprotokolle erfassen, um Sie bei der Diagnose von Problemen mit Ihrer Anwendung zu unterstützen. Der Einfachheit halber sind für die AZD-Vorlage bereits die Protokollierung im lokalen Dateisystem sowie das Senden der Protokolle an einen Log Analytics-Arbeitsbereich aktiviert.
Die Beispielanwendung enthält standardmäßige Log4j-Protokollierungsanweisungen, um diese Funktion wie im folgenden Codeschnipsel dargestellt zu veranschaulichen.
@WebServlet(urlPatterns = "/")
public class ViewServlet extends HttpServlet {
private static Logger logger = LogManager.getLogger(ViewServlet.class.getName());
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("GET /");
EntityManagerFactory emf = (EntityManagerFactory) req.getServletContext().getAttribute("EMFactory");
Suchen Sie in der AZD-Ausgabe den Link zum Streamen von App Service-Protokollen, und navigieren Sie im Browser dorthin. Der Link sieht in der AZD-Ausgabe wie folgt aus:
Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream
Erfahren Sie mehr über die Protokollierung in Java-Apps in der Reihe unter Azure Monitor OpenTelemetry für .NET-, Node.js-, Python- und Java-Anwendungen aktivieren.
Treten Probleme auf? Sehen Sie sich den Abschnitt zur Problembehandlung an.
8. Bereinigen von Ressourcen
Führen Sie azd down
aus, und folgen Sie den Eingabeaufforderungen, um alle Azure-Ressourcen in der aktuellen Bereitstellungsumgebung zu löschen.
azd down
Problembehandlung
- Bei „mvn jetty:run“ werden zahlreiche Warnungen vom Typ „<Klasse> von mehreren Speicherorten gescannt“ angezeigt.
- Die Portalbereitstellungsansicht für Azure Database für Azure Database for MySQL – Flexibler Server zeigt einen Konfliktstatus.
- Die bereitgestellte Beispiel-App zeigt nicht die Aufgabenlisten-App an.
- Mir wird der Fehler „404: Seite nicht gefunden“ in der bereitgestellten Beispiel-App angezeigt.
Bei „mvn jetty:run“ werden zahlreiche Warnungen vom Typ „<Klasse> von mehreren Speicherorten gescannt“ angezeigt.
Sie können die Warnungen ignorieren. Das Maven Jetty-Plug-In zeigt die Warnungen, da die Datei pom.xml der App die Abhängigkeit für jakarta.servlet.jsp.jstl
enthält, die von Jetty bereits standardmäßig bereitgestellt wird. Sie benötigen die Abhängigkeit für Tomcat.
Die Portalbereitstellungsansicht für Azure Database für Azure Database for MySQL – Flexibler Server zeigt einen Konfliktstatus.
Je nach ausgewähltem Abonnement und ausgewählter Region wird möglicherweise der Bereitstellungsstatus für Azure Database for MySQL – Flexibler Server als Conflict
mit der folgenden Meldung in den Vorgangsdetails angezeigt:
InternalServerError: An unexpected error occured while processing the request.
Dieser Fehler wird höchstwahrscheinlich durch einen Grenzwert für Ihr Abonnement für die von Ihnen ausgewählte Region verursacht. Versuchen Sie, eine andere Region für Ihre Bereitstellung auszuwählen.
Die bereitgestellte Beispiel-App zeigt nicht die Aufgabenlisten-App an.
Wenn anstelle der Aufgabenlisten-App die Seite Hey, Java developers!
angezeigt wird, lädt App Service den aktualisierten Container höchstwahrscheinlich immer noch aus der neuesten Codebereitstellung. Warten Sie einige Minuten, und aktualisieren Sie die Seite.
Mir wird der Fehler „404: Seite nicht gefunden“ in der bereitgestellten Beispiel-App angezeigt.
Stellen Sie sicher, dass Sie den Code so geändert haben, dass die Datenquelle java:comp/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS
verwendet wird. Wenn Sie die Änderungen vorgenommen und den Code erneut bereitgestellt haben, lädt App Service höchstwahrscheinlich noch den aktualisierten Container. Warten Sie einige Minuten, und aktualisieren Sie die Seite.
Häufig gestellte Fragen
- Wie viel kostet diese Einrichtung?
- Wie stelle ich mit anderen Tools eine Verbindung mit dem MySQL-Server her, der sich hinter dem virtuellen Netzwerk befindet?
- Wie funktioniert die lokale App-Entwicklung mit GitHub Actions?
- Ich habe keine Berechtigungen zum Erstellen einer benutzerseitig zugewiesenen Identität.
- Was kann ich mit GitHub Copilot in meinem Codespace machen?
Wie viel kostet diese Einrichtung?
Die Preise für die erstellte Ressourcen sind wie folgt:
- Der App Service-Plan wird im Tarif Basic erstellt und kann hoch- oder herunterskaliert werden. Informationen dazu finden Sie unter App Service – Preise.
- Der flexible MySQL-Server wird auf B1ms-Ebene erstellt und kann nach oben oder unten skaliert werden. Mit einem kostenlosen Azure-Konto ist die B1ms-Stufe für 12 Monate bis zu den monatlichen Grenzwerten kostenlos. Azure Database for MySQL: Preise
- Die Azure Cache for Redis wird in der Ebene Basic mit der minimalen Cachegröße erstellt. Diese Ebene ist mit geringen Kosten verbunden. Sie können sie auf leistungsstärkere Ebenen für eine höhere Verfügbarkeit, für Clustering und andere Features hochskalieren. Siehe Azure Cache for Redis: Preise.
- Das virtuelle Netzwerk hat keine Gebühr, es sei denn, Sie konfigurieren zusätzliche Funktionen, z. B. Peering. Siehe Azure Virtual Network Preise.
- Die private DNS-Zone verursacht eine kleine Gebühr. Siehe Azure DNS-Preise.
Wie stelle ich mit anderen Tools eine Verbindung mit dem MySQL-Server her, der sich hinter dem virtuellen Netzwerk befindet?
- Der Tomcat-Container verfügt derzeit nicht auch über das
mysql-client
-Terminal. Sie müssen es manuell installieren, wenn Sie es verwenden möchten. Denken Sie daran, dass installierte Komponenten nicht über App-Neustarts hinweg beibehalten werden. - Um eine Verbindung mit einem Desktoptool wie MySQL Workbench herzustellen, muss sich Ihr Computer innerhalb des virtuellen Netzwerks befinden. Beispielsweise könnte es eine Azure-VM in einem der Subnetze oder ein Computer in einem lokalen Netzwerk mit einer Standort-zu-Standort-VPN-Verbindung mit dem virtuellen Azure-Netzwerk sein.
- Sie können Azure Cloud Shell auch in das virtuelle Netzwerk integrieren.
Wie funktioniert die lokale App-Entwicklung mit GitHub Actions?
Nehmen Sie die automatisch generierte Workflowdatei von App Service als Beispiel; jede git push
startet eine neue Build- und Bereitstellungsausführung. Aus einem lokalen Klon des GitHub-Repositorys können Sie die gewünschten Updates vornehmen und zu GitHub pushen. Zum Beispiel:
git add .
git commit -m "<some-message>"
git push origin main
Ich habe keine Berechtigungen zum Erstellen einer benutzerseitig zugewiesenen Identität.
Siehe Einrichten der Bereitstellung von GitHub Actions über das Bereitstellungscenter.
Was kann ich mit GitHub Copilot in meinem Codespace machen?
Möglicherweise haben Sie bemerkt, dass die GitHub Copilot-Chatansicht bereits verfügbar war, als Sie den Codespace erstellt haben. Zur Vereinfachung können Sie die GitHub Copilot-Chaterweiterung in die Containerdefinition einfügen (siehe .devcontainer/devcontainer.json). Sie benötigen jedoch ein GitHub Copilot-Konto (kostenlose 30-Tage-Testversion verfügbar).
Einige Tipps für die Unterhaltung mit GitHub Copilot:
- In einer einzelnen Chatsitzung bauen die Fragen und Antworten aufeinander auf, und Sie können Ihre Fragen anpassen, um die Antworten zu optimieren.
- Standardmäßig hat GitHub Copilot keinen Zugriff auf Dateien in Ihrem Repository. Um Fragen zu einer Datei zu stellen, öffnen Sie die Datei zuerst im Editor.
- Damit GitHub Copilot beim Vorbereiten der Antworten Zugriff auf alle Dateien im Repository hat, beginnen Sie Ihre Frage mit
@workspace
. Weitere Informationen finden Sie unter Use the @workspace agent. - Innerhalb der Chatsitzung kann GitHub Copilot Änderungen vorschlagen und (mit
@workspace
) auch angeben, wo die Änderungen vorgenommen werden sollen. Copilot darf jedoch die Änderungen nicht für Sie vornehmen. Sie müssen entscheiden, ob Sie die vorgeschlagenen Änderungen hinzufügen und testen.
Im Folgenden finden Sie einige weitere Aussagen, mit denen Sie die Antwort optimieren können:
- Änderen Sie diesen Code so, dass als Datenquelle „jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS“ verwendet wird.
- Einige Importe im Code verwenden Javax, aber ich habe eine Jakarta-App.
- Dieser Code soll nur ausgeführt werden, wenn die Umgebungsvariable AZURE_MYSQL_CONNECTIONSTRING festgelegt ist.
- Ich möchte, dass dieser Code nur in Azure App Service und nicht lokal ausgeführt wird.
Nächste Schritte
Im Entwicklerhandbuch finden Sie weitere Informationen zum Ausführen von Java-Apps in App Service.
Erfahren Sie, wie Sie Ihre App mit einer benutzerdefinierten Domäne und einem Zertifikat schützen.