자습서: 관리 ID를 사용하여 비밀 없이 Java Quarkus Container 앱에서 PostgreSQL Database에 연결
Azure Container Apps는 Azure Database for PostgreSQL 및 기타 Azure 서비스에 대한 액세스를 보호하기 위한 턴키 솔루션인 관리 ID를 앱에 제공합니다. Container Apps의 관리 ID는 환경 변수의 자격 증명과 같은 비밀을 앱에서 제거하여 앱의 보안을 보다 강화합니다.
이 자습서에서는 Azure에서 Java 컨테이너 웹앱을 빌드하고, 구성하고, 배포하고, 크기를 조정하는 프로세스를 단계별로 설명합니다. 이 자습서의 끝에는 Container Apps에서 실행되는 관리 ID를 사용하여 PostgreSQL 데이터베이스에 데이터를 저장하는 Quarkus 애플리케이션이 있습니다.
학습 내용:
- PostgreSQL 데이터베이스와 함께 Microsoft Entra ID를 사용하여 인증하도록 Quarkus 앱을 구성합니다.
- Azure Container Registry를 만들고 Java 앱 이미지를 레지스트리에 푸시합니다.
- Azure에서 컨테이너 앱을 만듭니다.
- Azure에서 PostgreSQL 데이터베이스를 만듭니다.
- 서비스 커넥터를 사용하여 관리 ID로 PostgreSQL 데이터베이스에 연결합니다.
Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.
1. 사전 요구 사항
2. 컨테이너 레지스트리 만들기
az group create 명령을 사용하여 리소스 그룹을 만듭니다. Azure 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다.
다음 예제에서는 미국 동부 Azure 지역에 myResourceGroup
이라는 리소스 그룹을 만듭니다.
RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"
az group create --name $RESOURCE_GROUP --location $LOCATION
az acr create 명령을 사용하여 Azure Container Registry 인스턴스를 만들고 az acr show 명령을 사용하여 해당 로그인 서버를 검색합니다. 레지스트리 이름은 Azure 내에서 고유해야 하며, 5-50자의 영숫자를 포함해야 합니다. 모든 문자는 소문자로 지정해야 합니다. 다음 예제에서는 mycontainerregistry007
이 사용되었습니다. 이를 고유한 값으로 업데이트합니다.
REGISTRY_NAME=mycontainerregistry007
az acr create \
--resource-group $RESOURCE_GROUP \
--name $REGISTRY_NAME \
--sku Basic
REGISTRY_SERVER=$(az acr show \
--name $REGISTRY_NAME \
--query 'loginServer' \
--output tsv | tr -d '\r')
3. 샘플 앱 복제 및 컨테이너 이미지 준비
이 자습서에서는 Azure Database for PostgreSQL에서 지원하는 Quarkus REST API를 호출하는 웹 UI가 있는 샘플 Fruits 목록 앱을 사용합니다. 앱의 코드는 GitHub에서 사용할 수 있습니다. Quarkus 및 PostgreSQL을 사용하여 Java 앱을 작성하는 방법에 대해 자세히 알아보려면 Panache가 있는 Quarkus 최대 절전 모드 가이드 및 Quarkus 데이터 원본 가이드를 참조하세요.
터미널에서 다음 명령을 실행하여 샘플 리포지토리를 복제하고 샘플 앱 환경을 설정합니다.
git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart
프로젝트 수정
프로젝트의 POM 파일에 필요한 종속성을 추가합니다.
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-extensions</artifactId> <version>1.1.20</version> </dependency>
Quarkus 앱 속성을 구성합니다.
Quarkus 구성은 src/main/resources/application.properties 파일에 있습니다. 편집기에서 이 파일을 열고 몇 가지 기본 속성을 관찰합니다.
%prod
접두사가 붙은 속성은 애플리케이션이 빌드되고 배포될 때(예: Azure App Service에 배포될 때)에만 사용됩니다. 애플리케이션이 로컬로 실행될 때%prod
속성은 무시됩니다. 마찬가지로%dev
속성은 Quarkus의 라이브 코딩/개발 모드에서 사용되며%test
속성은 지속적인 테스트 중에 사용됩니다.application.properties에서 기존 콘텐츠를 삭제하고 다음으로 대체하여 개발, 테스트 및 프로덕션 모드를 위해 데이터베이스를 구성합니다.
quarkus.hibernate-orm.database.generation=drop-and-create quarkus.datasource.db-kind=postgresql quarkus.datasource.jdbc.max-size=8 quarkus.datasource.jdbc.min-size=2 quarkus.hibernate-orm.log.sql=true quarkus.hibernate-orm.sql-load-script=import.sql quarkus.datasource.jdbc.acquisition-timeout = 10 %dev.quarkus.datasource.username=${CURRENT_USERNAME} %dev.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\ authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\ &sslmode=require %prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME} %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\ authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\ &sslmode=require %dev.quarkus.class-loading.parent-first-artifacts=com.azure:azure-core::jar,\ com.azure:azure-core-http-netty::jar,\ io.projectreactor.netty:reactor-netty-core::jar,\ io.projectreactor.netty:reactor-netty-http::jar,\ io.netty:netty-resolver-dns::jar,\ io.netty:netty-codec::jar,\ io.netty:netty-codec-http::jar,\ io.netty:netty-codec-http2::jar,\ io.netty:netty-handler::jar,\ io.netty:netty-resolver::jar,\ io.netty:netty-common::jar,\ io.netty:netty-transport::jar,\ io.netty:netty-buffer::jar,\ com.azure:azure-identity::jar,\ com.azure:azure-identity-extensions::jar,\ com.fasterxml.jackson.core:jackson-core::jar,\ com.fasterxml.jackson.core:jackson-annotations::jar,\ com.fasterxml.jackson.core:jackson-databind::jar,\ com.fasterxml.jackson.dataformat:jackson-dataformat-xml::jar,\ com.fasterxml.jackson.datatype:jackson-datatype-jsr310::jar,\ org.reactivestreams:reactive-streams::jar,\ io.projectreactor:reactor-core::jar,\ com.microsoft.azure:msal4j::jar,\ com.microsoft.azure:msal4j-persistence-extension::jar,\ org.codehaus.woodstox:stax2-api::jar,\ com.fasterxml.woodstox:woodstox-core::jar,\ com.nimbusds:oauth2-oidc-sdk::jar,\ com.nimbusds:content-type::jar,\ com.nimbusds:nimbus-jose-jwt::jar,\ net.minidev:json-smart::jar,\ net.minidev:accessors-smart::jar,\ io.netty:netty-transport-native-unix-common::jar,\ net.java.dev.jna:jna::jar
Docker 이미지를 빌드하고 컨테이너 레지스트리로 푸시
컨테이너 이미지를 빌드합니다.
다음 명령을 실행하여 Quarkus 앱 이미지를 빌드합니다. 레지스트리 로그인 서버의 정규화된 이름을 사용하여 태그를 지정해야 합니다.
CONTAINER_IMAGE=${REGISTRY_SERVER}/quarkus-postgres-passwordless-app:v1 mvn quarkus:add-extension -Dextensions="container-image-jib" mvn clean package -Dquarkus.container-image.build=true -Dquarkus.container-image.image=${CONTAINER_IMAGE}
레지스트리에 로그인합니다.
컨테이너 이미지를 푸시하기 전에 레지스트리에 로그인해야 합니다. 이렇게 하려면 [az acr login][az-acr-login] 명령을 사용합니다.
az acr login --name $REGISTRY_NAME
완료되면 이 명령은
Login Succeeded
메시지를 반환합니다.레지스트리에 이미지를 푸시합니다.
레지스트리 인스턴스에 이미지를 푸시하는 데 사용합니다
docker push
. 이 예제에서는quarkus-postgres-passwordless-app:v1
이미지를 포함하는quarkus-postgres-passwordless-app
리포지토리를 만듭니다.docker push $CONTAINER_IMAGE
4. Azure에서 컨테이너 앱 만들기
다음 명령을 실행하여 Container Apps 인스턴스를 만듭니다. 환경 변수의 값을 사용하려는 실제 이름과 위치로 바꿔야 합니다.
CONTAINERAPPS_ENVIRONMENT="my-environment" az containerapp env create \ --resource-group $RESOURCE_GROUP \ --name $CONTAINERAPPS_ENVIRONMENT \ --location $LOCATION
다음 명령을 실행하여 앱 이미지로 컨테이너 앱을 만듭니다.
APP_NAME=my-container-app az containerapp create \ --resource-group $RESOURCE_GROUP \ --name $APP_NAME \ --image $CONTAINER_IMAGE \ --environment $CONTAINERAPPS_ENVIRONMENT \ --registry-server $REGISTRY_SERVER \ --registry-identity system \ --ingress 'external' \ --target-port 8080 \ --min-replicas 1
참고 항목
이 옵션은
--registry-username
--registry-password
여전히 지원되지만 ID 시스템 사용이 더 안전하기 때문에 권장되지 않습니다.
5. ID 연결을 사용하여 PostgreSQL 데이터베이스 만들기 및 연결
다음으로, PostgreSQL 데이터베이스를 만들고 시스템 할당 관리 ID를 사용하여 PostgreSQL 데이터베이스에 연결하도록 컨테이너 앱을 구성합니다. Quarkus 앱은 이 데이터베이스에 연결하고 실행 시 데이터를 저장하여 애플리케이션을 실행하는 위치에 관계없이 애플리케이션 상태를 유지합니다.
데이터베이스 서비스를 만듭니다.
DB_SERVER_NAME='msdocs-quarkus-postgres-webapp-db' az postgres flexible-server create \ --resource-group $RESOURCE_GROUP \ --name $DB_SERVER_NAME \ --location $LOCATION \ --public-access None \ --sku-name Standard_B1ms \ --tier Burstable \ --active-directory-auth Enabled
참고 항목
이 옵션은
--admin-user
--admin-password
여전히 지원되지만 ID 시스템 사용이 더 안전하기 때문에 권장되지 않습니다.위의 Azure CLI 명령에는 다음 매개 변수가 사용됩니다.
- 리소스 그룹 → 웹앱을 만든 것과 동일한 리소스 그룹 이름(예:
msdocs-quarkus-postgres-webapp-rg/>)을 사용합니다. - name → PostgreSQL 데이터베이스 서버 이름입니다. 이 이름은 모든 Azure에서 고유해야 합니다(서버 엔드포인트는
https://<name>.postgres.database.azure.com
이 됨). 허용되는 문자는A
-Z
,0
-9
및-
입니다. 회사 이름과 서버 식별자를 조합하여 사용하는 것이 좋습니다. (msdocs-quarkus-postgres-webapp-db
) - location → 웹앱에 사용되는 동일한 위치를 사용합니다. 작동하지 않는 경우 다른 위치로 변경합니다.
- public-access → 방화벽 규칙 없이 퍼블릭 액세스 모드에서 서버를 설정하는
None
입니다. 규칙은 이후 단계에서 만들어집니다. - sku-name → 가격 책정 계층 및 컴퓨팅 구성의 이름입니다(예: .)
Standard_B1ms
. 자세한 내용은 Azure Database for PostgreSQL 가격 책정을 참조하세요. - 계층 → 서버의 컴퓨팅 계층입니다. 자세한 내용은 Azure Database for PostgreSQL 가격 책정을 참조하세요.
- Active-directory-auth →
Enabled
Microsoft Entra 인증을 사용하도록 설정합니다.
- 리소스 그룹 → 웹앱을 만든 것과 동일한 리소스 그룹 이름(예:
다음 명령을 사용하여 PostgreSQL 서비스 내에서 이름이
fruits
인 데이터베이스를 만듭니다.DB_NAME=fruits az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $DB_SERVER_NAME \ --database-name $DB_NAME
Azure CLI용 서비스 커넥터 암호 없는 확장을 설치합니다.
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
연결 명령을 사용하여 시스템 할당 관리 ID로 데이터베이스를 컨테이너 앱에 연결합니다.
az containerapp connection create postgres-flexible \ --resource-group $RESOURCE_GROUP \ --name $APP_NAME \ --target-resource-group $RESOURCE_GROUP \ --server $DB_SERVER_NAME \ --database $DB_NAME \ --system-identity \ --container $APP_NAME
6. 변경 내용 검토
다음 명령을 사용하여 애플리케이션 URL(FQDN)을 찾을 수 있습니다.
echo https://$(az containerapp show \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--query properties.configuration.ingress.fqdn \
--output tsv)
새 웹 페이지에 과일 목록이 표시되면 앱이 관리 ID를 사용하여 데이터베이스에 연결합니다. 이제 이전처럼 과일 목록을 편집할 수 있어야 합니다.
리소스 정리
이전 단계에서는 리소스 그룹에서 Azure 리소스를 만들었습니다. 나중에 이러한 리소스가 필요하지 않을 것 같으면 Cloud Shell에서 다음 명령을 실행하여 리소스 그룹을 삭제합니다.
az group delete --name myResourceGroup
이 명령을 실행하는 데 1분 정도 걸릴 수 있습니다.
다음 단계
개발자 가이드에 따라 Azure에서 Java 앱을 실행하는 방법에 대해 자세히 알아봅니다.