자습서: 관리 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 앱이 실행되는 경우 이 데이터베이스에 연결되고 데이터를 저장하므로 애플리케이션을 실행하는 위치에 상관없이 애플리케이션 상태가 유지됩니다.
Azure CLI에 로그인하고 둘 이상의 로그인 자격 증명에 연결된 경우 필요에 따라 구독을 설정합니다.
az login az account set --subscription <subscription-ID>
Azure 리소스 그룹을 만들고 리소스 그룹 이름을 입력합니다.
export RESOURCE_GROUP=<resource-group-name> export LOCATION=eastus az group create --name $RESOURCE_GROUP --location $LOCATION
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
애플리케이션용 데이터베이스를 만듭니다.
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를 배포하려면 다음 단계를 수행합니다.
샘플 앱에는 WAR 파일을 생성할 수 있는 pom.xml 파일이 포함되어 있습니다. 다음 명령을 실행하여 앱을 빌드합니다.
mvn clean package -f pom.xml
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"
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 앱을 실행하는 방법에 대해 자세히 알아봅니다.
사용자 지정 도메인 및 인증서를 사용하여 앱을 보호하는 방법을 알아봅니다.