자습서: 관리 ID를 사용하여 비밀 없이 Java Tomcat App Service에서 PostgreSQL Database에 연결

Azure App Service는 Azure에서 확장성 뛰어난 자체 패치 웹 호스팅 서비스를 제공합니다. 또한 Azure Database for PostgreSQL 및 기타 Azure 서비스에 대한 액세스를 보호하기 위한 턴키 솔루션인 관리 ID를 앱에 제공합니다. App Service의 관리 ID는 환경 변수의 자격 증명과 같은 비밀을 앱에서 제거하여 앱의 보안을 보다 강화합니다. 이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • PostgreSQL 데이터베이스를 만듭니다.
  • WAR 패키징을 사용하여 Tomcat에서 Azure App Service에 샘플 앱을 배포합니다.
  • PostgreSQL 데이터베이스에서 Microsoft Entra 인증을 사용하도록 Tomcat 웹 애플리케이션을 구성합니다.
  • 서비스 커넥터를 사용하여 관리 ID로 PostgreSQL Database에 연결합니다.

Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.

필수 조건

샘플 앱 복제 및 리포지토리 준비

터미널에서 다음 명령을 실행하여 샘플 리포지토리를 복제하고 샘플 앱 환경을 설정합니다.

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

PostgreSQL용 Azure Database 만들기

구독에서 Azure Database for Postgres를 만들려면 다음 단계를 따릅니다. Tomcat 앱이 실행되는 경우 이 데이터베이스에 연결되고 데이터를 저장하므로 애플리케이션을 실행하는 위치에 상관없이 애플리케이션 상태가 유지됩니다.

  1. Azure CLI에 로그인하고 둘 이상의 로그인 자격 증명에 연결된 경우 필요에 따라 구독을 설정합니다.

    az login
    az account set --subscription <subscription-ID>
    
  2. Azure 리소스 그룹을 만들고 리소스 그룹 이름을 입력합니다.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Azure Database for PostgreSQL 서버를 만듭니다. 서버는 관리자 계정으로 생성되지만 Microsoft Entra 관리자 계정을 사용하여 관리 작업을 수행할 예정이므로 사용되지 않습니다.

    export POSTGRESQL_ADMIN_USER=azureuser
    # PostgreSQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database.
    export POSTGRESQL_ADMIN_PASSWORD=<admin-password>
    export 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-access 0.0.0.0 \
        --sku-name Standard_D2s_v3
    
  4. 애플리케이션용 데이터베이스를 만듭니다.

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

App Service에 애플리케이션 배포

WAR 파일을 빌드하고 WAR 패키징을 사용하여 Tomcat에 Azure App Service를 배포하려면 다음 단계를 수행합니다.

  1. 샘플 앱에는 WAR 파일을 생성할 수 있는 pom.xml 파일이 포함되어 있습니다. 다음 명령을 실행하여 앱을 빌드합니다.

    mvn clean package -f pom.xml
    
  2. Tomcat 9.0을 사용하여 Linux에서 Azure App Service 리소스를 만듭니다.

    export APPSERVICE_PLAN=<app-service-plan>
    export 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:10.0-java11"
    
  3. App Service에 WAR 패키지를 배포합니다.

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

ID 연결을 사용하여 Postgres 데이터베이스 연결

다음으로 서비스 커넥터를 사용하여 데이터베이스를 연결합니다.

Azure CLI용 서비스 커넥터 암호 없는 확장을 설치합니다.

az extension add --name serviceconnector-passwordless --upgrade

그런 다음, 서비스 커넥터를 사용하여 시스템이 할당한 관리 ID를 사용하여 앱을 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 \
    --client-type java

이 명령은 웹앱과 PostgreSQL 서버 간에 연결을 만들고 시스템이 할당한 관리 ID를 통해 인증을 관리합니다.

다음으로 앱 설정을 업데이트하고 연결 문자열에 플러그 인을 추가합니다.

export AZURE_POSTGRESQL_CONNECTIONSTRING=$(\
    az webapp config appsettings list \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
    | jq -c -r '.[] \
    | select ( .name == "AZURE_POSTGRESQL_CONNECTIONSTRING" ) \
    | .value')

az webapp config appsettings set \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --settings 'CATALINA_OPTS=-DdbUrl="'"${AZURE_POSTGRESQL_CONNECTIONSTRING}"'&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin"'

샘플 웹앱 테스트

다음 명령을 실행하여 애플리케이션을 테스트합니다.

export WEBAPP_URL=$(az webapp show \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --query defaultHostName \
    --output tsv)

# Create a list
curl -X POST -H "Content-Type: application/json" -d '{"name": "list1","date": "2022-03-21T00:00:00","description": "Sample checklist"}' https://${WEBAPP_URL}/checklist

# Create few items on the list 1
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/checklist/1/item

# Get all lists
curl https://${WEBAPP_URL}/checklist

# Get list 1
curl https://${WEBAPP_URL}/checklist/1

리소스 정리

이전 단계에서는 리소스 그룹에서 Azure 리소스를 만들었습니다. 나중에 이러한 리소스가 필요하지 않을 것 같으면 Cloud Shell에서 다음 명령을 실행하여 리소스 그룹을 삭제합니다.

az group delete --name myResourceGroup

이 명령을 실행하는 데 1분 정도 걸릴 수 있습니다.

다음 단계

개발자 가이드에서 App Service on Linux의 Java 앱을 실행하는 방법에 대해 자세히 알아봅니다.

사용자 지정 도메인 및 인증서를 사용하여 앱을 보호하는 방법을 알아봅니다.