자습서: 암호 없는 연결을 사용하여 Java JBoss EAP App Service에서 MySQL 데이터베이스에 연결
Azure App Service는 Azure에서 확장성 뛰어난 자체 패치 웹 호스팅 서비스를 제공합니다. 또한 Azure Database for MySQL 및 기타 Azure 서비스에 대한 액세스를 보호하기 위한 턴키 솔루션인 관리 ID를 앱에 제공합니다. App Service의 관리 ID는 환경 변수의 자격 증명과 같은 비밀을 앱에서 제거하여 앱의 보안을 보다 강화합니다.
이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.
- MySQL 데이터베이스를 만듭니다.
- WAR 패키지를 사용하여 Azure App Service에 샘플 JBoss EAP 앱을 배포합니다.
- MySQL 데이터베이스에서 Microsoft Entra 인증을 사용하도록 Spring Boot 웹 애플리케이션을 구성합니다.
- 서비스 커넥터를 사용하여 관리 ID로 MySQL 데이터베이스에 연결합니다.
Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.
필수 조건
샘플 앱 복제 및 리포지토리 준비
터미널에서 다음 명령을 실행하여 샘플 리포지토리를 복제하고 샘플 앱 환경을 설정합니다.
git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
Azure Database for MySQL 만들기
다음 단계에 따라 구독에 Azure Database for MySQL 리소스를 만듭니다. Spring Boot 앱이 실행되는 경우 이 데이터베이스에 연결되고 데이터를 저장하므로 애플리케이션을 실행하는 위치에 상관없이 애플리케이션 상태가 유지됩니다.
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 MySQL 서버를 만듭니다. 서버는 관리자 계정으로 생성되지만 Microsoft Entra 관리자 계정을 사용하여 관리 작업을 수행할 예정이므로 사용되지 않습니다.
export MYSQL_ADMIN_USER=azureuser # MySQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database. export MYSQL_ADMIN_PASSWORD=<admin-password> export MYSQL_HOST=<mysql-host-name> # Create a MySQL server. az mysql flexible-server create \ --name $MYSQL_HOST \ --resource-group $RESOURCE_GROUP \ --location $LOCATION \ --admin-user $MYSQL_ADMIN_USER \ --admin-password $MYSQL_ADMIN_PASSWORD \ --public-access 0.0.0.0 \ --tier Burstable \ --sku-name Standard_B1ms \ --storage-size 32
애플리케이션용 데이터베이스를 만듭니다.
export DATABASE_NAME=checklist az mysql flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $MYSQL_HOST \ --database-name $DATABASE_NAME
App Service 만들기
Linux에서 Azure App Service 리소스를 만듭니다. JBoss EAP를 사용하려면 프리미엄 SKU가 필요합니다.
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 P1V3 \
--is-linux
# Create an App Service resource.
az webapp create \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
--plan $APPSERVICE_PLAN \
--runtime "JBOSSEAP:7-java8"
ID 연결을 사용하여 MySQL 데이터베이스 연결
다음으로 서비스 커넥터를 사용하여 데이터베이스를 연결합니다.
Azure CLI용 서비스 커넥터 암호 없는 확장을 설치합니다.
az extension add --name serviceconnector-passwordless --upgrade
다음 명령을 사용하여 Microsoft Entra 인증에 대한 사용자 할당 관리 ID를 만듭니다. 자세한 내용은 Azure Database for MySQL - 유연한 서버에 대한 Microsoft Entra 인증 설정을 참조하세요.
export USER_IDENTITY_NAME=<your-user-assigned-managed-identity-name> export IDENTITY_RESOURCE_ID=$(az identity create \ --name $USER_IDENTITY_NAME \ --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
전역 관리자 또는 권한 있는 역할 관리자에게 새 사용자 할당 ID에 다음 권한을 부여하도록 요청합니다.
Application.Read.ALL
GroupMember.Read.All
User.Read.All
자세한 내용은 Active Directory 인증의 권한 섹션을 참조하세요.Service Connector를 사용하여 시스템 할당 관리 ID를 사용하여 MySQL 데이터베이스에 앱을 연결합니다. 이렇게 연결하려면 az webapp connection create 명령을 실행합니다.
az webapp connection create mysql-flexible \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --target-resource-group $RESOURCE_GROUP \ --server $MYSQL_HOST \ --database $DATABASE_NAME \ --system-identity mysql-identity-id=$IDENTITY_RESOURCE_ID \ --client-type java
이 서비스 커넥터 명령은 백그라운드에서 다음 작업을 수행합니다.
Azure App Service에서 호스트하는 앱
$APPSERVICE_NAME
에 시스템이 할당한 관리 ID를 사용하도록 설정합니다.Microsoft Entra 관리자를 현재 로그인한 사용자로 설정합니다.
1단계에서 시스템이 할당한 관리 ID의 데이터베이스 사용자를 추가하고 이 사용자에게 데이터베이스
$DATABASE_NAME
의 모든 권한을 부여합니다. 이전 명령 출력에 있는 연결 문자열에서 사용자 이름을 가져올 수 있습니다.AZURE_MYSQL_CONNECTIONSTRING
앱에서 연결 문자열을 앱 설정에 추가합니다.참고 항목
The subscription is not registered to use Microsoft.ServiceLinker
오류 메시지가 표시되면az provider register --namespace Microsoft.ServiceLinker
명령을 실행하여 서비스 커넥터 리소스 공급자를 등록한 다음, 연결 명령을 다시 실행합니다.
애플리케이션 배포
다음 단계를 수행하여 데이터베이스에서 데이터를 준비하고 애플리케이션을 배포합니다.
데이터베이스 스키마 만들기
현재 IP 주소에서 연결을 허용하도록 방화벽을 엽니다.
# Create a temporary firewall rule to allow connections from your current machine to the MySQL server export MY_IP=$(curl http://whatismyip.akamai.com) az mysql flexible-server firewall-rule create \ --resource-group $RESOURCE_GROUP \ --name $MYSQL_HOST \ --rule-name AllowCurrentMachineToConnect \ --start-ip-address ${MY_IP} \ --end-ip-address ${MY_IP}
데이터베이스에 연결하고 테이블을 만듭니다.
export DATABASE_FQDN=${MYSQL_HOST}.mysql.database.azure.com export CURRENT_USER=$(az account show --query user.name --output tsv) export RDBMS_ACCESS_TOKEN=$(az account get-access-token \ --resource-type oss-rdbms \ --output tsv \ --query accessToken) mysql -h "${DATABASE_FQDN}" --user "${CURRENT_USER}" --enable-cleartext-plugin --password="$RDBMS_ACCESS_TOKEN" < azure/init-db.sql
임시 방화벽 규칙을 제거합니다.
az mysql flexible-server firewall-rule delete \ --resource-group $RESOURCE_GROUP \ --name $MYSQL_HOST \ --rule-name AllowCurrentMachineToConnect
애플리케이션 배포
앱 설정에서 연결 문자열을 업데이트합니다.
서비스 커넥터에서 생성된 연결 문자열을 가져와 암호 없는 인증 플러그 인을 추가합니다. 이 연결 문자열은 시작 스크립트에서 참조됩니다.
export PASSWORDLESS_URL=$(\ az webapp config appsettings list \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ | jq -c '.[] \ | select ( .name == "AZURE_MYSQL_CONNECTIONSTRING" ) \ | .value' \ | sed 's/"//g') # Create a new environment variable with the connection string including the passwordless authentication plugin export PASSWORDLESS_URL=${PASSWORDLESS_URL}'&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin' az webapp config appsettings set \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --settings "AZURE_MYSQL_CONNECTIONSTRING_PASSWORDLESS=${PASSWORDLESS_URL}"
샘플 앱에는 WAR 파일을 생성할 수 있는 pom.xml 파일이 포함되어 있습니다. 다음 명령을 실행하여 앱을 빌드합니다.
mvn clean package -DskipTests
WAR 및 시작 스크립트를 앱 서비스에 배포합니다.
az webapp deploy \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --src-path target/ROOT.war \ --type war az webapp deploy \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --src-path src/main/webapp/WEB-INF/createMySQLDataSource.sh \ --type startup
샘플 웹앱 테스트
다음 명령을 실행하여 애플리케이션을 테스트합니다.
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 앱을 실행하는 방법에 대해 자세히 알아봅니다.