教程:使用托管标识从 Java Tomcat 应用服务连接到 PostgreSQL 数据库,而无需使用机密

Azure 应用服务在 Azure 中提供高度可缩放、自修补的 Web 托管服务。 它还为应用提供托管标识,这是一项统包解决方案,可以确保安全地访问 Azure Database for PostgreSQL 和其他 Azure 服务。 应用服务中的托管标识可以让应用更安全,因为不需在应用中存储机密,例如环境变量中的凭据。 在本教程中,您将学习如何执行以下操作:

  • 创建 PostgreSQL 数据库。
  • 使用 WAR 打包将示例应用部署到 Tomcat 上的 Azure 应用服务。
  • 配置 Spring Boot Web 应用程序,以将 Azure AD 身份验证与 PostgreSQL 数据库配合使用。
  • 使用服务连接器通过托管标识连接到 PostgreSQL 数据库。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

克隆示例应用并准备存储库

在终端中运行以下命令,以克隆示例存储库并设置示例应用环境。

git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/Tomcat/

创建用于 PostgreSQL 的 Azure 数据库

按照以下步骤在订阅中创建 Azure Database for Postgres。 Spring Boot 应用在运行时将连接到此数据库并存储自身的数据,不管你在哪个位置运行应用程序,它都会保存应用程序状态。

  1. 登录到 Azure CLI,(可选)如果有多个订阅连接到登录凭据,请设置订阅。

    az login
    az account set --subscription <subscription-ID>
    
  2. 创建 Azure 资源组并记下资源组名称。

    RESOURCE_GROUP=<resource-group-name>
    LOCATION=chinaeast2
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. 创建 Azure Database for PostgreSQL 服务器。 该服务器是使用管理员帐户创建的,但它不会被使用,因为我们将使用 Azure Active Directory (Azure AD) 管理员帐户来执行管理任务。

    POSTGRESQL_ADMIN_USER=azureuser
    # PostgreSQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database.
    POSTGRESQL_ADMIN_PASSWORD=<admin-password>
    POSTGRESQL_HOST=<postgresql-host-name>
    
    # Create a PostgreSQL server.
    az postgres flexible-server create \
        --resource-group $RESOURCE_GROUP \
        --name $POSTGRESQL_HOST \
        --location $LOCATION \
        --admin-user $POSTGRESQL_ADMIN_USER \
        --admin-password $POSTGRESQL_ADMIN_PASSWORD \
        --public-network-access 0.0.0.0 \
        --sku-name Standard_D2s_v3 
    
  4. 创建应用程序的数据库。

    DATABASE_NAME=checklist
    
    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $POSTGRESQL_HOST \
        --database-name $DATABASE_NAME
    

将应用程序部署到应用服务

按照以下步骤生成 WAR 文件,并使用 WAR 打包部署到 Tomcat 上的 Azure 应用服务。

  1. 示例应用包含可生成 WAR 文件的 pom.xml 文件。 运行以下命令以生成应用。

    mvn clean package -f pom.xml
    
  2. 使用 Tomcat 9.0 在 Linux 上创建 Azure 应用服务资源。

    APPSERVICE_PLAN=<app-service-plan>
    APPSERVICE_NAME=<app-service-name>
    # Create an App Service plan
    az appservice plan create \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_PLAN \
        --location $LOCATION \
        --sku B1 \
        --is-linux
    
    # Create an App Service resource.
    az webapp create \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --plan $APPSERVICE_PLAN \
        --runtime "TOMCAT:9.0-jre8" 
    
  3. 将 WAR 包部署到应用服务。

    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path target/app.war \
        --type war
    

使用标识连接性连接 Postgres 数据库

注意

适用于 PostgreSQL 灵活服务器的 Azure Active Directory 身份验证目前为预览版。

接下来,使用服务连接器将应用连接到具有系统分配的托管标识的 Postgres 数据库。

为此,请运行 az webapp connection create 命令。

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --system-identity

此命令在 Web 应用与 PostgreSQL 服务器之间创建连接,并通过系统分配的托管标识管理身份验证。

查看示例 Web 应用

运行以下命令,在浏览器中打开已部署的 Web 应用。

az webapp browse \
    --resource-group $RESOURCE_GROUP \
    --name MyWebapp \
    --name $APPSERVICE_NAME

清理资源

在前面的步骤中,你在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在本地 Azure CLI 中运行以下命令删除资源组:

az group delete --name myResourceGroup

此命令可能需要花费一点时间运行。

后续步骤

在开发人员指南中详细了解在 Linux 上的应用服务中运行 Java 应用。

了解如何使用自定义域和证书保护应用。