데이터 API 작성기를 애플리케이션 스택의 일부로 Azure Container Apps와 같은 Azure 서비스에 신속하게 배포할 수 있습니다. 이 자습서에서는 Azure CLI를 사용하여 Azure에 Data API Builder를 배포할 때 일반적인 작업을 자동화합니다. 먼저 데이터 API 작성기를 사용하여 컨테이너 이미지를 빌드하고 Azure Container Registry에 저장합니다. 그런 다음, 지원 Azure SQL 데이터베이스를 사용하여 Azure Container Apps에 컨테이너 이미지를 배포합니다. 전체 자습서는 관리 ID를 사용하여 각 구성 요소에 인증합니다.
이 자습서에서는 다음을 수행합니다.
- 역할 기반 액세스 제어 권한을 사용하여 관리 ID 만들기
- 샘플 AdventureWorksLT 데이터 세트를 사용하여 Azure SQL 배포
- Azure Container Registry에서 컨테이너 이미지 스테이징
- 데이터 API 작성기 컨테이너 이미지를 사용하여 Azure Container App 배포
Azure 구독이 없는 경우, 시작하기 전에 무료 계정을 만드십시오.
필수 조건
- Azure 구독
- Azure Cloud Shell
- Azure Cloud Shell은 브라우저를 통해 사용할 수 있는 대화형 셸 환경입니다. 이 셸 및 미리 설치된 명령을 사용하여 로컬 환경에 아무것도 설치하지 않고도 이 문서의 코드를 실행합니다. Azure Cloud Shell을 시작하려면 다음을 수행합니다.
- 이 문서의 코드 또는 명령 블록에 있는 사용해 보세요를 선택하세요. Try를 선택하면 코드나 명령이 Cloud Shell에 자동으로 복사되지 않습니다.
- Cloud https://shell.azure.com으로 이동하거나 선택합니다.
- Azure Portal의 메뉴 모음에서 Cloud Shell 선택(https://portal.azure.com)
- Azure Cloud Shell은 브라우저를 통해 사용할 수 있는 대화형 셸 환경입니다. 이 셸 및 미리 설치된 명령을 사용하여 로컬 환경에 아무것도 설치하지 않고도 이 문서의 코드를 실행합니다. Azure Cloud Shell을 시작하려면 다음을 수행합니다.
컨테이너 앱 만들기
먼저 시스템 할당 관리 ID를 사용하여 Azure Container Apps 인스턴스를 만듭니다. 이 ID는 결국 Azure SQL 및 Azure Container Registry에 액세스할 수 있는 역할 기반 액세스 제어 권한을 부여합니다.
이 자습서의 뒷부분에서 여러 리소스 이름에 사용할 범용
SUFFIX변수를 만듭니다.let SUFFIX=$RANDOM*$RANDOM이 자습서에서
LOCATION사용하도록 선택한 Azure 지역을 사용하여 변수를 만듭니다.LOCATION="<azure-region>"비고
예를 들어 미국 서부 지역에 배포하려는 경우 이 스크립트를 사용합니다.
LOCATION="westus"현재 구독의 지원되는 지역 목록의 경우
az account list-locationsaz account list-locations --query "[].{Name:displayName,Slug:name}" --output table자세한 내용은 Azure 지역을 참조하세요.
리소스 그룹 이름으로 명명된
RESOURCE_GROUP_NAME변수를 만듭니다. 이 자습서에서는 저희가msdocs-dab-*을(를) 권장합니다. 이 자습서에서는 이 값을 여러 번 사용합니다.RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"를 사용하여 새 리소스 그룹을 만듭니다
az group create.az group create \ --name $RESOURCE_GROUP_NAME \ --location $LOCATION \ --tag "source=msdocs-dab-tutorial"Azure Container Apps 인스턴스에서
API_CONTAINER_NAME및CONTAINER_ENV_NAME로 고유한 이름의 변수를 생성합니다. 자습서 전체에서 이러한 변수를 사용합니다.API_CONTAINER_NAME="api$SUFFIX" CONTAINER_ENV_NAME="env$SUFFIX"새 Azure Container Apps 환경을 만드는 데 사용합니다
az containerapp env create.az containerapp env create \ --resource-group $RESOURCE_GROUP_NAME \ --name $CONTAINER_ENV_NAME \ --logs-destination none \ --location $LOCATIONmcr.microsoft.com/azure-databases/data-api-builderDAB 컨테이너 이미지와az containerapp create명령을 사용하여 새 컨테이너 앱을 만듭니다. 이 컨테이너 앱은 성공적으로 실행되지만 데이터베이스에 연결되지 않습니다.az containerapp create \ --resource-group $RESOURCE_GROUP_NAME \ --environment $CONTAINER_ENV_NAME \ --name $API_CONTAINER_NAME \ --image "mcr.microsoft.com/azure-databases/data-api-builder" \ --ingress "external" \ --target-port "5000" \ --system-assigned를 사용하여 관리된 신원의
az identity show식별자를 가져와 해당 값을MANAGED_IDENTITY_PRINCIPAL_ID라는 변수에 저장합니다.MANAGED_IDENTITY_PRINCIPAL_ID=$( \ az containerapp show \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --query "identity.principalId" \ --output "tsv" \ )팁 (조언)
이 명령의 출력은 항상 확인할 수 있습니다.
echo $MANAGED_IDENTITY_PRINCIPAL_ID
권한 할당
이제 시스템 할당 관리 ID 권한을 할당하여 Azure SQL 및 Azure Container Registry에서 데이터를 읽습니다. 또한 Azure Container Registry에 쓸 ID 권한을 할당합니다.
리소스 그룹의 식별자를 저장할 변수를 만듭니다
RESOURCE_GROUP_ID. 를 사용하여az group show식별자를 가져옵니다. 이 자습서에서는 이 변수를 여러 번 사용합니다.RESOURCE_GROUP_ID=$( \ az group show \ --name $RESOURCE_GROUP_NAME \ --query "id" \ --output "tsv" \ )팁 (조언)
이 명령의 출력은 항상 확인할 수 있습니다.
echo $RESOURCE_GROUP_IDAzure Container Registry에 컨테이너를 푸시할 수 있도록 계정에
az role assignment create역할을 할당하는 데 사용합니다.CURRENT_USER_PRINCIPAL_ID=$( \ az ad signed-in-user show \ --query "id" \ --output "tsv" \ ) # AcrPush az role assignment create \ --assignee $CURRENT_USER_PRINCIPAL_ID \ --role "8311e382-0749-4cb8-b61a-304f252e45ec" \ --scope $RESOURCE_GROUP_IDAcrPull 역할을 다시 사용하여
az role assignment create관리 ID에 할당합니다. 이 할당을 사용하면 관리 ID가 Azure Container Registry에서 컨테이너 이미지를 끌어올 수 있습니다. 관리 ID는 결국 Azure Container Apps 인스턴스에 할당됩니다.# AcrPull az role assignment create \ --assignee $MANAGED_IDENTITY_PRINCIPAL_ID \ --role "7f951dda-4ed3-4680-a7ca-43fe172d538d" \ --scope $RESOURCE_GROUP_ID
데이터베이스 배포
다음으로, Azure SQL 서비스에 새 서버 및 데이터베이스를 배포합니다. 데이터베이스는 AdventureWorksLT 샘플 데이터 세트를 사용합니다.
Azure SQL Server 인스턴스에 대해 고유하게 생성된 이름으로 명명
SQL_SERVER_NAME된 변수를 만듭니다. 이 변수는 이 섹션의 뒷부분에서 사용합니다.SQL_SERVER_NAME="srvr$SUFFIX"를 사용하여 새 Azure SQL Server 리소스를 만듭니다
az sql server create. 관리 ID를 이 서버의 관리자로 구성합니다.az sql server create \ --resource-group $RESOURCE_GROUP_NAME \ --name $SQL_SERVER_NAME \ --location $LOCATION \ --enable-ad-only-auth \ --external-admin-principal-type "User" \ --external-admin-name $API_CONTAINER_NAME \ --external-admin-sid $MANAGED_IDENTITY_PRINCIPAL_IDAzure 서비스에서 액세스를 허용하는 방화벽 규칙을 만드는 데 사용합니다
az sql server firewall-rule create.az sql server firewall-rule create \ --resource-group $RESOURCE_GROUP_NAME \ --server $SQL_SERVER_NAME \ --name "AllowAzure" \ --start-ip-address "0.0.0.0" \ --end-ip-address "0.0.0.0"Azure SQL 서버 named
az sql db create내에서 데이터베이스를 생성하려면adventureworks을(를) 사용하십시오. 샘플 데이터를 사용하도록 데이터베이스를 구성합니다AdventureWorksLT.az sql db create \ --resource-group $RESOURCE_GROUP_NAME \ --server $SQL_SERVER_NAME \ --name "adventureworks" \ --sample-name "AdventureWorksLT"Azure SQL Server 인스턴스에서 데이터베이스에 대한 연결 문자열로
SQL_CONNECTION_STRING명명된adventureworks변수를 만듭니다. 를 사용하여 서버의az sql server show을 사용하여 연결 문자열을 생성합니다. 이 변수는 이 자습서의 뒷부분에서 사용합니다.SQL_SERVER_ENDPOINT=$( \ az sql server show \ --resource-group $RESOURCE_GROUP_NAME \ --name $SQL_SERVER_NAME \ --query "fullyQualifiedDomainName" \ --output "tsv" \ ) SQL_CONNECTION_STRING="Server=$SQL_SERVER_ENDPOINT;Database=adventureworks;Encrypt=true;Authentication=Active Directory Default;"팁 (조언)
이 명령의 출력은 항상 확인할 수 있습니다.
echo $SQL_CONNECTION_STRING
컨테이너 이미지 만들기
다음으로 Dockerfile을 사용하여 컨테이너 이미지를 빌드합니다. 그런 다음, 해당 컨테이너 이미지를 새로 만든 Azure Container Registry 인스턴스에 배포합니다.
Azure Container Registry 인스턴스에 대해 고유하게 생성된 이름으로 명명
CONTAINER_REGISTRY_NAME된 변수를 만듭니다. 이 변수는 이 섹션의 뒷부분에서 사용합니다.CONTAINER_REGISTRY_NAME="reg$SUFFIX"를 사용하여 새 Azure Container Registry 인스턴스를
az acr create만듭니다.az acr create \ --resource-group $RESOURCE_GROUP_NAME \ --name $CONTAINER_REGISTRY_NAME \ --sku "Standard" \ --location $LOCATION \ --admin-enabled falseDockerfile라는 이름의 다단계 Dockerfile을 만듭니다. 파일에서 다음 단계를 구현합니다.mcr.microsoft.com/dotnet/sdk컨테이너 이미지를 빌드 단계의 기반으로 사용DAB CLI를 설치합니다.
환경 변수를 연결 문자열로 사용하여
mssqlSQL 데이터베이스 연결(DATABASE_CONNECTION_STRING)에 대한 구성 파일을 만듭니다.Product엔터티를SalesLT.Product테이블에 매핑하여 만듭니다.구성 파일을 최종
mcr.microsoft.com/azure-databases/data-api-builder컨테이너 이미지에 복사합니다.
FROM mcr.microsoft.com/dotnet/sdk:8.0-cbl-mariner2.0 AS build WORKDIR /config RUN dotnet new tool-manifest RUN dotnet tool install Microsoft.DataApiBuilder RUN dotnet tool run dab -- init --database-type "mssql" --connection-string "@env('DATABASE_CONNECTION_STRING')" RUN dotnet tool run dab -- add Product --source "SalesLT.Product" --permissions "anonymous:read" FROM mcr.microsoft.com/azure-databases/data-api-builder COPY --from=build /config /Appaz acr build를 사용하여 Dockerfile을 Azure Container Registry 작업으로 빌드하세요.az acr build \ --registry $CONTAINER_REGISTRY_NAME \ --image adventureworkslt-dab:latest \ --image adventureworkslt-dab:{{.Run.ID}} \ --file Dockerfile \ .컨테이너 레지스트리의 엔드포인트를 가져와서 라는
az acr show변수에 저장하는 데 사용합니다CONTAINER_REGISTRY_LOGIN_SERVER.CONTAINER_REGISTRY_LOGIN_SERVER=$( \ az acr show \ --resource-group $RESOURCE_GROUP_NAME \ --name $CONTAINER_REGISTRY_NAME \ --query "loginServer" \ --output "tsv" \ )팁 (조언)
이 명령의 출력은 항상 확인할 수 있습니다.
echo $CONTAINER_REGISTRY_LOGIN_SERVER
컨테이너 이미지 배포
마지막으로 새 사용자 지정 컨테이너 이미지 및 자격 증명으로 Azure Container App을 업데이트합니다. 실행 중인 애플리케이션을 테스트하여 데이터베이스에 대한 연결의 유효성을 검사합니다.
를 사용하여
az containerapp registry set컨테이너 레지스트리를 사용하도록 컨테이너 앱을 구성합니다.az containerapp registry set \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --server $CONTAINER_REGISTRY_LOGIN_SERVER \ --identity "system"az containerapp secret set을(를) 사용하여 Azure SQL 연결 문자열로 비밀의 이름을conn-string으로 만드세요.az containerapp secret set \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --secrets conn-string="$SQL_CONNECTION_STRING"중요합니다
이 연결 문자열에는 사용자 이름 또는 암호가 포함되지 않습니다. 연결 문자열은 관리 ID를 사용하여 Azure SQL 데이터베이스에 액세스합니다. 이렇게 하면 호스트에서 연결 문자열을 비밀로 안전하게 사용할 수 있습니다.
를 사용하여
az containerapp update새 사용자 지정 컨테이너 이미지로 컨테이너 앱을 업데이트합니다. 환경 변수를 이전에 만든 시크릿에서 읽을 수 있도록DATABASE_CONNECTION_STRING을(를) 설정합니다.az containerapp update \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --image "$CONTAINER_REGISTRY_LOGIN_SERVER/adventureworkslt-dab:latest" \ --set-env-vars DATABASE_CONNECTION_STRING=secretref:conn-string를 사용하여
az containerapp show실행 중인 컨테이너 앱에서 최신 수정 버전의 정규화된 도메인 이름을 검색합니다. 해당 값을 변수APPLICATION_URL에 저장합니다.APPLICATION_URL=$( \ az containerapp show \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --query "properties.latestRevisionFqdn" \ --output "tsv" \ )팁 (조언)
이 명령의 출력은 항상 확인할 수 있습니다.
echo $APPLICATION_URLURL에 접속하여,
ProductREST API를 테스트합니다.echo "https://$APPLICATION_URL/api/Product"경고
배포에는 최대 1분이 걸릴 수 있습니다. 성공적인 응답이 표시되지 않으면 브라우저를 기다렸다가 새로 고칩니다.
자원을 정리하세요
샘플 애플리케이션 또는 리소스가 더 이상 필요하지 않은 경우 해당 배포 및 모든 리소스를 제거합니다.
az group delete \
--name $RESOURCE_GROUP_NAME