자습서: Azure App Service Java JBoss EAP에서 MySQL 데이터베이스에 연결

이 자습서에서는 관리 ID를 사용하여 Azure App Service의 Java JBoss EAP 앱을 Azure Database for MySQL 데이터베이스에 연결하는 방법에 대해 알아봅니다. App Service는 관리 ID를 사용하여 Azure Database for MySQL 및 기타 Azure 서비스에 대한 보안 액세스를 제공할 수 있습니다. 관리 ID는 환경 변수의 자격 증명과 같은 앱의 비밀을 사용할 필요가 없습니다.

이 자습서에서는 Azure CLI 명령을 사용하여 다음 작업을 완료합니다.

  • Azure Database for MySQL 서버와 데이터베이스를 생성합니다.
  • WAR 패키지를 사용하여 샘플 JBoss EAP 앱을 App Service에 배포합니다.
  • MySQL 데이터베이스에서 Microsoft Entra 인증을 사용하도록 Spring Boot 웹 애플리케이션을 구성합니다.
  • 관리 ID 인증을 사용하여 Service Connector를 사용하여 웹앱을 MySQL 데이터베이스에 연결합니다.

필수 조건

  • Microsoft Entra 역할 할당 권한과 Azure 리소스 쓰기 권한이 있는 Azure 구독, 그리고 튜토리얼에 필요한 충분한 App Service 지원 및 할당량을 갖추고 있으며 Service Connector를 지원하는 Azure 지역이 필요합니다.

  • Azure 구독에 등록된 Microsoft.ServiceLinkerMicrosoft.DBforMySQL 리소스 공급자입니다. az provider register -n Microsoft.[service] 실행하여 공급자를 등록할 수 있습니다.

  • 샘플 리포지토리에 액세스하고 복제하는 Git입니다.

  • Azure Cloud Shell 액세스하여 자습서 단계를 실행하거나 로컬로 실행하려는 경우 다음 필수 조건 및 단계를 수행합니다.

    • Java JDK 설치

    • Maven 설치됨

    • jq 설치

    • MySQL 클라이언트 가 설치됨

    • Azure CLI 2.46.0 이상이 설치되어 있습니다. 버전을 확인하려면 az --version을(를) 실행합니다. 업그레이드하려면 .를 실행합니다 az upgrade.

      로컬로 실행하는 경우:

      1. az login 사용하고 프롬프트에 따라 Azure 로그인합니다.
      2. 로그인 자격 증명에 연결된 Azure 구독이 두 개 이상 있는 경우 az account set --subscription <subscription-ID> 실행하여 올바른 구독을 선택합니다.

환경 설정

  1. 다음과 같은 Azure CLI 확장을 설치합니다.

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    
  2. 다음 명령을 실행하여 샘플 리포지토리를 복제하고 디렉터리를 샘플 앱 프로젝트 폴더로 변경합니다. 이 폴더에서 나머지 명령을 모두 실행합니다.

    git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
    cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
    
  3. <region> 플레이스홀더를 유효한 값으로 대체하여 자습서에 사용할 다음 환경 변수를 정의합니다. LOCATION 구독에 Azure 리소스를 만들기에 충분한 할당량이 있고 서비스에 대한 제한이 없는 Azure 지역이어야 합니다.

    LOCATION="<region>"
    RESOURCE_GROUP="mysql-mi-webapp"
    
  4. 모든 프로젝트 리소스를 포함할 Azure 리소스 그룹 만듭니다. 리소스 그룹 이름은 캐시되고 후속 명령에 자동으로 적용됩니다.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    

Azure Database for MySQL 만들기

해당 구독에서 Azure Database for MySQL 서버와 데이터베이스를 만듭니다. Spring Boot 앱은 이 데이터베이스에 연결하고 실행 시 데이터를 저장하여 애플리케이션을 실행하는 위치에 관계없이 애플리케이션 상태를 유지합니다.

  1. 다음 명령을 실행하여 Azure Database for MySQL 서버를 만듭니다. MYSQL_HOST 이름은 모든 Azure 고유해야 합니다.

    참고

    명령은 관리자 계정을 정의하지만 Microsoft Entra 관리자 계정이 모든 관리 작업을 수행하므로 계정이 사용되지 않습니다.

    export MYSQL_ADMIN_USER=azureuser
    export MYSQL_ADMIN_PASSWORD="AdminPassword1"
    export RAND_ID=$RANDOM
    export MYSQL_HOST="mysql-mi-$RAND_ID"
    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
    
  2. 사용할 애플리케이션의 이름을 지정 checklist 한 데이터베이스를 만듭니다.

    export DATABASE_NAME="checklist"
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    
  3. 현재 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}
    
  4. 데이터베이스에 연결하고 /azure/init-db.sql 샘플 프로젝트 파일에 지정된 대로 테이블을 만듭니다.

    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}" --password="$RDBMS_ACCESS_TOKEN" < azure/init-db.sql
    
  5. 임시 방화벽 규칙을 제거합니다.

    az mysql flexible-server firewall-rule delete \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect
    

App Service 리소스 만들기

Linux에서 App Service JBoss EAP 리소스를 만듭니다. JBoss EAP에는 프리미엄 sku 계층이 필요합니다.

# Create an App Service plan
export APPSERVICE_PLAN="mysql-mi-plan"
export APPSERVICE_NAME="mysql-mi-app"
az appservice plan create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_PLAN \
    --location $LOCATION \
    --sku P1V3 \
    --is-linux

# Create an App Service web app
az webapp create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --plan $APPSERVICE_PLAN \
    --runtime "JBOSSEAP:7-java8"

사용자 할당 관리 ID 만들기 및 구성

다음 명령을 사용하여 Microsoft Entra 인증에 사용할 Azure 사용자 할당 관리 ID를 만듭니다. 자세한 내용은 Azure Database for MySQL - 유연한 서버에 대한 Microsoft Entra 인증 설정을 참조하세요.

export USER_IDENTITY_NAME="my-user-assigned-identity"
export IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

새 사용자 할당 ID User.Read.AllGroupMember.Read.AllApplication.Read.All 권한을 부여합니다. 또는 해당 ID에 Microsoft Entra 기본 제공 역할인 디렉터리 읽기 권한자를 부여합니다.

Azure CLI Microsoft Entra 권한 또는 역할을 할당하는 데 지원되지 않습니다. Microsoft Entra 관리 센터, Microsoft Graph PowerShell 또는 Microsoft Graph API를 사용하여 할당을 만들 수 있습니다. 자세한 내용은 Microsoft Entra 역할 할당을 참조하세요.

참고

이러한 할당을 추가하려면 Microsoft Entra 테넌트에서 최소한 권한 있는 역할 관리자 역할 또는 해당 권한이 있어야 합니다. 이 역할이 없는 경우 전역 관리자 또는 권한 있는 역할 관리자 에게 권한을 부여하도록 요청합니다.

관리 ID를 사용하여 서비스 연결

Service Connector를 사용하여 관리 ID를 사용하여 App Service JBoss EAP 웹앱을 MySQL 데이터베이스에 연결합니다. 서비스 커넥터는 백그라운드에서 다음 작업을 수행합니다.

  • 현재 로그인한 사용자를 Microsoft Entra 데이터베이스 관리자로 설정합니다.
  • 앱에 대해 시스템 할당 관리 ID를 사용하도록 설정합니다.
  • 시스템 할당 관리 ID에 대한 데이터베이스 사용자를 추가하고 이 사용자에게 모든 데이터베이스 권한을 부여합니다.
  • 앱의 App Settings이라는 연결 문자열 추가합니다.

다음 az webapp connection create 명령을 사용하여 관리 ID를 사용하여 MySQL 데이터베이스에 앱을 연결합니다.

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

앱 빌드 및 배포

  1. 다음 코드를 실행하여 생성된 연결 문자열 Service Connector에 암호 없는 인증 플러그 인을 추가합니다. 앱 시작 스크립트는 이 연결 문자열 참조합니다.

    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}"
    
  2. 샘플 앱의 pom.xml 파일을 사용하여 WAR 파일을 생성하여 앱을 빌드합니다.

    mvn clean package -DskipTests
    
  3. WAR 파일 및 시작 스크립트를 App Service에 배포합니다.

    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
    

앱 테스트

  1. 다음 코드를 실행하여 일부 목록 항목이 포함된 목록을 만듭니다.

    export WEBAPP_URL=$(az webapp show \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --query defaultHostName \
        --output tsv)/$DATABASE_NAME
    
    # 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}
    
    # Create few items on the list 1
    curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/1/item
    curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/1/item
    curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/1/item
    
  2. 로컬로 작업하는 경우 다음 코드를 실행하여 앱을 봅니다.

    # Get all list items
    curl https://${WEBAPP_URL}
    
    # Get list item 1
    curl https://${WEBAPP_URL}/1
    

    Cloud Shell 로컬 브라우저를 열 수 없으므로 Cloud Shell 작업하는 경우 웹앱을 보는 가장 쉬운 방법은 앱의 Azure 포털 페이지 위쪽에 있는 Browse 또는 Default 도메인 링크를 선택하는 것입니다. 그런 다음 브라우저에서 URL의 끝에 /checklist 또는 /checklist/1을 추가합니다. 예를 들어 https://mysql-mi-app.azurewebsites.net/checklist와 같이 사용합니다.

리소스 정리

이 자습서를 완료하면 만든 리소스를 삭제하여 추가 요금을 방지할 수 있습니다. 리소스 그룹을 삭제하여 포함된 모든 리소스를 삭제합니다. 명령을 실행하기 전에 리소스가 더 이상 필요하지 않은지 확인합니다.

az group delete --name $RESOURCE_GROUP --no-wait

모든 리소스를 삭제하는 데 시간이 걸릴 수 있습니다. 인수 --no-wait 를 사용하면 명령이 즉시 반환됩니다.