You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Tutorial: Build a Tomcat web app with Azure App Service on Linux and MySQL
15
15
16
-
This tutorial shows how to build, configure, and deploy a secure Tomcat application in Azure App Service that connects to a MySQL database (using [Azure Database for MySQL](/azure/mysql/)). Azure App Service is a highly scalable, self-patching, web-hosting service that can easily deploy apps on Windows or Linux. When you're finished, you'll have a Tomcat app running on [Azure App Service on Linux](overview.md).
16
+
This tutorial shows how to build, configure, and deploy a secure Tomcat application in Azure App Service that connects to a MySQL database (using [Azure Database for MySQL](/azure/mysql/)). Azure App Service is a highly scalable, self-patching, web-hosting service that can easily deploy apps on Windows or Linux. When you're finished, you have a Tomcat app running on [Azure App Service on Linux](overview.md).
17
17
18
18
:::image type="content" source="./media/tutorial-java-tomcat-mysql-app/azure-portal-browse-app-2.png" alt-text="Screenshot of Tomcat application storing data in MySQL.":::
19
19
@@ -142,7 +142,7 @@ Sign in to the [Azure portal](https://portal.azure.com/) and follow these steps
142
142
1. *Name*: **msdocs-tomcat-mysql-XYZ**, where *XYZ* is any three random characters.
143
143
1. *Runtime stack*: **Java 17**.
144
144
1. *Java web server stack*: **Apache Tomcat 10.1**.
145
-
1. **MySQL - Flexible Server** is selected for you by default as the database engine. If not, select it. Azure Database for MySQL is a fully managed MySQL database as a service on Azure, compatible with the latest community editions.
145
+
1. *Engine*: **MySQL - Flexible Server** is selected for you by default as the database engine. If not, select it. Azure Database for MySQL - Flexible Server is a fully managed MySQL database as a service on Azure, compatible with the latest community editions.
146
146
1. *Hosting plan*: **Basic**. When you're ready, you can [scale up](manage-scale-up.md) to a production pricing tier.
147
147
1. Select **Review + create**.
148
148
1. After validation completes, select **Create**.
@@ -171,12 +171,12 @@ Having issues? Check the [Troubleshooting section](#troubleshooting).
171
171
172
172
## 3. Secure connection secrets
173
173
174
-
The creation wizard generated the connectivity string for you already as an [app setting](configure-common.md#configure-app-settings). However, the security best practice is to keep secrets out of App Service completely. You'll move your secrets to a key vault and change your app setting to a [Key Vault reference](app-service-key-vault-references.md) with the help of Service Connectors.
174
+
The creation wizard generated the database connectivity string for you already as an [app setting](configure-common.md#configure-app-settings). However, the security best practice is to keep secrets out of App Service completely. You move your secrets to a key vault and change your app setting to a [Key Vault reference](app-service-key-vault-references.md) with the help of Service Connectors.
175
175
176
176
:::row:::
177
177
:::column span="2":::
178
-
**Step 1:** In the App Service page:
179
-
1. In the left menu, select **Settings > Environment variables**.
178
+
**Step 1: Retrieve the existing connection string**
179
+
1. In the left menu of the App Service page, select **Settings > Environment variables**.
180
180
1. Select **AZURE_MYSQL_CONNECTIONSTRING**. It contains a JDBC connection string. If you add an app setting that contains a valid Oracle, SQL Server, PostgreSQL, or MySQL connection string, App Service injects it as a Java Naming and Directory Interface (JNDI) data source in the Tomcat server's *context.xml* file.
181
181
1. In **Add/Edit application setting**, in the **Value** field, find the *password=* part at the end of the string.
182
182
1. Copy the password string after *Password=* for use later.
@@ -188,25 +188,25 @@ The creation wizard generated the connectivity string for you already as an [app
188
188
:::row-end:::
189
189
:::row:::
190
190
:::column span="2":::
191
-
**Step 2:**Create a key vault for secure management of secrets.
191
+
**Step 2:Create a key vault for secure management of secrets**
192
192
1. In the top search bar, type "*key vault*", then select **Marketplace** > **Key Vault**.
193
193
1. In **Resource Group**, select **msdocs-tomcat-mysql-tutorial**.
194
194
1. In **Key vault name**, type a name that consists of only letters and numbers.
195
-
1. In **Region**, set it to the sample location as the resource group.
195
+
1. In **Region**, set it to the same location as the resource group.
196
196
:::column-end:::
197
197
:::column:::
198
198
:::image type="content" source="./media/tutorial-java-tomcat-mysql-app/azure-portal-secure-connection-secrets-2.png" alt-text="A screenshot showing how to create a key vault." lightbox="./media/tutorial-java-tomcat-mysql-app/azure-portal-secure-connection-secrets-2.png":::
199
199
:::column-end:::
200
200
:::row-end:::
201
201
:::row:::
202
202
:::column span="2":::
203
-
**Step 3:**
203
+
**Step 3: Secure the key vault with a Private Endpoint**
204
204
1. Select the **Networking** tab.
205
205
1. Unselect **Enable public access**.
206
206
1. Select **Create a private endpoint**.
207
207
1. In **Resource Group**, select **msdocs-tomcat-mysql-tutorial**.
208
-
1. In **Key vault name**, type a name that consists of only letters and numbers.
209
-
1. In **Region**, set it to the sample location as the resource group.
208
+
1. In **Name**, type a name for the private endpoint that consists of only letters and numbers.
209
+
1. In **Region**, set it to the same location as the resource group.
210
210
1. In the dialog, in **Location**, select the same location as your App Service app.
211
211
1. In **Resource Group**, select **msdocs-tomcat-mysql-tutorial**.
212
212
1. In **Name**, type **msdocs-tomcat-mysql-XYZVaultEndpoint**.
@@ -221,7 +221,7 @@ The creation wizard generated the connectivity string for you already as an [app
221
221
:::row-end:::
222
222
:::row:::
223
223
:::column span="2":::
224
-
**Step 4:**
224
+
**Step 4: Configure the Service Connector**
225
225
1. In the top search bar, type *msdocs-tomcat-mysql*, then the App Service resource called **msdocs-tomcat-mysql-XYZ**.
226
226
1. In the App Service page, in the left menu, select **Settings > Service Connector**. There's already a connector, which the app creation wizard created for you.
227
227
1. Select checkbox next to the connector, then select **Edit**.
@@ -238,8 +238,8 @@ The creation wizard generated the connectivity string for you already as an [app
238
238
:::row-end:::
239
239
:::row:::
240
240
:::column span="2":::
241
-
**Step 5:** In the **Create connection**dialog for the Key Vault connection:
242
-
1. In **Key Vault**, select the key vault you created earlier.
241
+
**Step 5: Establish the Key Vault connection**
242
+
1. In the **Create connection** dialog for the Key Vault connection, in **Key Vault**, select the key vault you created earlier.
243
243
1. Select **Review + Create**. You should see that **System assigned managed identity** is set to **Selected**.
244
244
1. When validation completes, select **Create**.
245
245
:::column-end:::
@@ -249,8 +249,8 @@ The creation wizard generated the connectivity string for you already as an [app
249
249
:::row-end:::
250
250
:::row:::
251
251
:::column span="2":::
252
-
**Step 6:** You're back in the edit dialog for **defaultConnector**.
253
-
1. In the **Authentication** tab, wait for the key vault connector to be created. When it's finished, the **Key Vault Connection** dropdown automatically selects it.
252
+
**Step 6: Finalize the Service Connector configuration**
253
+
1. You're back in the edit dialog for **defaultConnector**. In the **Authentication** tab, wait for the key vault connector to be created. When it's finished, the **Key Vault Connection** dropdown automatically selects it.
254
254
1. Select **Next: Networking**.
255
255
1. Select **Save**. Wait until the **Update succeeded** notification appears.
256
256
:::column-end:::
@@ -260,15 +260,17 @@ The creation wizard generated the connectivity string for you already as an [app
260
260
:::row-end:::
261
261
:::row:::
262
262
:::column span="2":::
263
-
**Step 7:** To verify your changes:
264
-
1. From the left menu, select **Environment variables > Connection strings** again.
263
+
**Step 7: Verify the Key Vault integration**
264
+
1. From the left menu, select **Settings > Environment variables** again.
265
265
1. Next to **AZURE_MYSQL_CONNECTIONSTRING**, select **Show value**. The value should be `@Microsoft.KeyVault(...)`, which means that it's a [key vault reference](app-service-key-vault-references.md) because the secret is now managed in the key vault.
266
266
:::column-end:::
267
267
:::column:::
268
268
:::image type="content" source="./media/tutorial-java-tomcat-mysql-app/azure-portal-secure-connection-secrets-7.png" alt-text="A screenshot showing how to see the value of the MySQL environment variable in Azure." lightbox="./media/tutorial-java-tomcat-mysql-app/azure-portal-secure-connection-secrets-7.png":::
269
269
:::column-end:::
270
270
:::row-end:::
271
271
272
+
To summarize, the process involved retrieving the MySQL connection string from the App Service's environment variables, creating an Azure Key Vault for secure secret management with private access, and updating the service connector to store the password in the key vault. A secure connection between the App Service app and key vault was established using a system-assigned managed identity, and the setup was verified by confirming the connection string uses a Key Vault reference.
273
+
272
274
Having issues? Check the [Troubleshooting section](#troubleshooting).
273
275
274
276
## 4. Confirm JNDI data source
@@ -287,7 +289,7 @@ If you add an app setting that contains a valid JDBC connection string for Oracl
287
289
:::row-end:::
288
290
:::row:::
289
291
:::column span="2":::
290
-
**Step 2:** In the SSH terminal, run `cat /usr/local/tomcat/conf/context.xml`. You should see that a JNDI resource called `jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS` was added. You'll use this data source later.
292
+
**Step 2:** In the SSH terminal, run `cat /usr/local/tomcat/conf/context.xml`. You should see that a JNDI resource called `jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS` was added. You use this data source later.
291
293
:::column-end:::
292
294
:::column:::
293
295
:::image type="content" source="./media/tutorial-java-tomcat-mysql-app/azure-portal-check-config-in-ssh-2.png" alt-text="A screenshot showing the commands to run in the SSH shell and their output." lightbox="./media/tutorial-java-tomcat-mysql-app/azure-portal-check-config-in-ssh-2.png":::
@@ -447,7 +449,7 @@ Azure App Service captures all messages output to the console to help you diagno
447
449
:::column-end:::
448
450
:::row-end:::
449
451
450
-
Learn more about logging in Java apps in the series on [Enable Azure Monitor OpenTelemetry for .NET, Node.js, Python and Java applications](/azure/azure-monitor/app/opentelemetry-enable?tabs=java).
452
+
Learn more about logging in Java apps in the series on [Enable Azure Monitor OpenTelemetry for .NET, Node.js, Python, and Java applications](/azure/azure-monitor/app/opentelemetry-enable?tabs=java).
451
453
452
454
Having issues? Check the [Troubleshooting section](#troubleshooting).
453
455
@@ -521,7 +523,7 @@ The dev container already has the [Azure Developer CLI](/azure/developer/azure-d
521
523
azd up
522
524
```
523
525
524
-
The `azd up`command takes about 15 minutes to complete (the Redis cache takes the most time). It also compiles and deploys your application code, but you'll modify your code later to work with App Service. While it's running, the command provides messages about the provisioning and deployment process, including a link to the deployment in Azure. When it finishes, the command also displays a link to the deploy application.
526
+
The `azd up`command takes about 15 minutes to complete (the Redis cache takes the most time). It also compiles and deploys your application code, but you modify your code later to work with App Service. While it's running, the command provides messages about the provisioning and deployment process, including a link to the deployment in Azure. When it finishes, the command also displays a link to the deploy application.
525
527
526
528
This AZD template contains files (*azure.yaml* and the *infra* directory) that generate a secure-by-default architecture with the following Azure resources:
527
529
@@ -572,7 +574,7 @@ In this step, you use the SSH connection to the app container to verify the JNDI
572
574
Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
573
575
</pre>
574
576
575
-
1. In the SSH terminal, run `cat /usr/local/tomcat/conf/context.xml`. You should see that a JNDI resource called `jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS` was added. You'll use this data source later.
577
+
1. In the SSH terminal, run `cat /usr/local/tomcat/conf/context.xml`. You should see that a JNDI resource called `jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS` was added. You use this data source later.
576
578
577
579
:::image type="content" source="./media/tutorial-java-tomcat-mysql-app/azure-portal-check-config-in-ssh-2.png" alt-text="A screenshot showing the commands to run in the SSH shell and their output.":::
578
580
@@ -666,7 +668,7 @@ In the AZD output, find the link to stream App Service logs and navigate to it i
666
668
Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream
667
669
</pre>
668
670
669
-
Learn more about logging in Java apps in the series on [Enable Azure Monitor OpenTelemetry for .NET, Node.js, Python and Java applications](/azure/azure-monitor/app/opentelemetry-enable?tabs=java).
671
+
Learn more about logging in Java apps in the series on [Enable Azure Monitor OpenTelemetry for .NET, Node.js, Python, and Java applications](/azure/azure-monitor/app/opentelemetry-enable?tabs=java).
670
672
671
673
Having issues? Check the [Troubleshooting section](#troubleshooting).
0 commit comments