다음을 통해 공유


자습서: Azure Cosmos DB for NoSQL, 관리 ID 및 Bicep을 통한 AKS를 사용하여 ASP.NET 웹 애플리케이션 배포

적용 대상: NoSQL

이 자습서에서는 Azure Cosmos DB for NoSQL에 연결하는 AKS(Azure Kubernetes Service) 클러스터에 참조 ASP.NET 웹 애플리케이션을 배포합니다.

Azure Cosmos DB는 NoSQL 또는 관계형 데이터베이스를 사용한 최신 애플리케이션 개발을 위한 완전 관리형 분산 데이터베이스 플랫폼입니다.

AKS는 클러스터를 빠르게 배포하고 관리할 수 있도록 하는 관리되는 Kubernetes Service입니다.

Important

  • 이 문서에는 최신 버전의 Azure CLI가 필요합니다. 자세한 내용은 Azure CLI 설치를 참조하세요. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.
  • 또한 이 문서에는 Azure CLI 내에 최신 버전의 Bicep CLI가 필요합니다. 자세한 내용은 Bicep 도구 설치를 참조하세요.
  • Azure Cloud Shell이 아닌 로컬에서 이 자습서의 명령을 실행하는 경우 관리자 계정을 사용해야 합니다.

필수 조건

ASP.NET 웹 애플리케이션을 컴파일하고 컨테이너 이미지를 만들려면 다음 도구가 필요합니다.

개요

이 자습서에서는 코드형 인프라(IaC) 방식을 사용하여 리소스를 Azure에 배포합니다. Azure Resource Manager 템플릿과 동일한 기능을 제공하는 새로운 선언적 언어인 Bicep을 사용합니다. 그러나 Bicep에는 더 간결하고 사용하기 쉬운 구문이 포함되어 있습니다.

Bicep 모듈은 대상 구독 범위 내에서 다음 Azure 리소스를 배포합니다.

이 자습서에서는 Azure Cosmos DB 보안에 대해 다음과 같은 모범 사례를 사용합니다.

이 자습서의 단계에서는 Azure Cosmos DB for NoSQL을 사용합니다. 그러나 동일한 개념을 Azure Cosmos DB for MongoDB에 적용할 수 있습니다.

Bicep 모듈 다운로드

azure-samples/cosmos-aks-samples GitHub 리포지토리의 Bicep 폴더에서 Bicep 모듈을 다운로드하거나 복제합니다.

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Bicep/

Azure 구독에 연결

az sign in을 사용하여 기본 Azure 구독에 연결합니다.

az login

선택적으로 여러 구독이 있는 경우 특정 구독의 이름 또는 ID와 함께 az account set를 사용하여 활성 구독을 설정합니다.

az account set \
  --subscription <subscription-id>

배포 매개 변수 초기화

다음 예에서 JSON을 사용하여 param.json 파일을 만듭니다. {resource group name}, {Azure Cosmos DB account name}{Azure Container Registry instance name} 자리 표시자를 고유한 값으로 바꿉니다.

Important

다음 코드에서 사용하는 모든 리소스 이름은 Azure 리소스에 대한 명명 규칙 및 제한 사항을 준수해야 합니다. 또한 자리 표시자 값이 일관되게 바뀌고 param.json의 값과 일치하는지 확인합니다.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "value": "{resource group name}"
    },    
    "cosmosName" :{
      "value": "{Azure Cosmos DB account name}"
    },
    "acrName" :{
      "value": "{Azure Container Registry instance name}"
    }
  }
}

Bicep 배포 만들기

다음 명령을 사용하여 셸 변수를 설정합니다. {deployment name}{location} 자리 표시자를 고유한 값으로 바꿉니다.

deploymentName='{deployment name}'  # Name of the deployment
location='{location}' # Location for deploying the resources

Bicep 폴더 내에서 az deployment sub create를 사용하여 현재 구독 범위에 템플릿을 배포합니다.

az deployment sub create \
  --name $deploymentName \
  --location $location \
  --template-file main.bicep \
  --parameters @param.json

배포 중에 콘솔은 배포가 계속 실행 중임을 나타내는 메시지를 출력합니다.

 / Running ..

배포에는 20~30분이 소요될 수 있습니다. 프로비전이 완료되면 콘솔은 프로비전 상태가 Succeeded인 JSON을 출력합니다.

      }
    ],
    "provisioningState": "Succeeded",
    "templateHash": "0000000000000000",
    "templateLink": null,
    "timestamp": "2022-01-01T00:00:00.000000+00:00",
    "validatedResources": null
  },
  "tags": null,
  "type": "Microsoft.Resources/deployments"
}

리소스 그룹에서 배포 상태를 볼 수도 있습니다.

Azure Portal에서 리소스 그룹의 배포 상태 스크린샷.

참고 항목

AKS 클러스터를 생성하면 AKS 리소스를 저장하는 두 번째 리소스 그룹이 자동으로 만들어집니다. 자세한 내용은 AKS를 통해 두 개의 리소스 그룹이 생성되는 이유는 무엇인가요?를 참조하세요.

다음 명령을 사용하여 Azure Container Registry 인스턴스를 AKS와 연결합니다. {Azure Container Registry instance name}{resource group name} 자리 표시자를 고유한 값으로 바꿉니다.

acrName='{Azure Container Registry instance name}'
rgName='{resource group name}'
aksName=$rgName'aks'

az aks update를 실행하여 기존 Azure Container Registry 리소스를 AKS 클러스터에 연결합니다.

az aks update \
  --resource-group $rgName \
  --name $aksName \
  --attach-acr $acrName

AKS 클러스터에 연결

Kubernetes 클러스터를 관리하려면 Kubernetes 명령줄 클라이언트인 kubectl을 사용합니다. Azure Cloud Shell을 사용하는 경우 kubectl이 이미 설치되어 있습니다. kubectl를 로컬로 설치하려면 az aks install-cli를 사용합니다.

az aks install-cli

Kubernetes 클러스터에 연결하도록 kubectl을 구성하려면 az aks get-credentials을 사용합니다. 이 명령은 자격 증명을 다운로드하고 Kubernetes CLI가 해당 자격 증명을 사용하도록 구성합니다.

az aks get-credentials \
  --resource-group $rgName \
  --name $aksName

AKS Pod를 Azure Key Vault에 연결

Microsoft Entra Pod 관리 ID는 AKS 기본 형식을 사용하여 Azure 리소스에 대한 관리 ID와 Microsoft Entra ID의 ID를 Pod와 연결합니다. 이러한 ID를 사용하여 비밀 저장소 CSI(Container Storage Interface) 드라이버용 Azure Key Vault 공급자에 대한 액세스 권한을 부여합니다.

다음 명령을 사용하여 테넌트 ID(homeTenantId)의 값을 찾습니다.

az account show

다음 YAML 템플릿을 사용하여 secretproviderclass.yml 파일을 만듭니다. {Tenant Id}{resource group name} 자리 표시자를 고유한 값으로 바꿉니다. 또한 {resource group name}의 값이 param.json의 값과 일치하는지 확인합니다.

# This is a SecretProviderClass example that uses aad-pod-identity to access the key vault
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-kvname-podid
spec:
  provider: azure
  parameters:
    usePodIdentity: "true"               
    keyvaultName: "{resource group name}kv"       # Replace resource group name. Bicep generates the key vault name.
    tenantId: "{Tenant Id}"              # The tenant ID of your account. Use the 'homeTenantId' attribute value from  the 'az account show' command output.

SecretProviderClass를 AKS 클러스터에 적용

YAML을 사용하여 비밀 저장소 CSI 드라이버를 설치하려면 kubectl apply를 사용합니다.

kubectl apply \
  --filename secretproviderclass.yml

ASP.NET 웹 애플리케이션 빌드

azure-samples/cosmos-aks-samples GitHub 리포지토리의 Application 폴더에서 웹 애플리케이션의 소스 코드를 다운로드하거나 복제합니다.

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Application/

Visual Studio Code에서 애플리케이션 폴더를 엽니다. F5 키 또는 디버그: 디버깅 시작 명령을 사용하여 애플리케이션을 실행합니다.

Docker 컨테이너 이미지를 Azure Container Registry로 푸시

  1. Visual Studio Code의 탐색기 탭에서 컨테이너 이미지를 만들려면 Dockerfile을 마우스 오른쪽 단추로 클릭한 다음 이미지 빌드를 선택합니다.

    이미지 빌드 옵션이 선택된 Visual Studio Code의 바로 가기 메뉴 스크린샷.

  2. 이미지에 태그를 지정할 이름과 버전을 묻는 프롬프트에 todo:latest라는 이름을 입력합니다.

  3. Docker 창을 사용하여 빌드된 이미지를 Azure Container Registry로 푸시합니다. 이미지 노드에서 빌드된 이미지를 찾을 수 있습니다. todo 노드를 열고 latest를 마우스 오른쪽 단추로 클릭한 다음 푸시를 선택합니다.

    푸시 옵션이 선택된 Visual Studio Code의 바로 가기 메뉴 스크린샷.

  4. 프롬프트에서 Azure 구독, Azure Container Registry 리소스 및 이미지 태그를 선택합니다. 이미지 태그 형식은 {acrname}.azurecr.io/todo:latest여야 합니다.

  5. Visual Studio Code가 컨테이너 이미지를 Azure Container Registry로 푸시할 때까지 기다립니다.

배포 YAML 준비

다음 YAML 템플릿을 사용하여 akstododeploy.yml 파일을 만듭니다. {ACR name}, {Image name}, {Version}{resource group name} 자리 표시자를 고유한 값으로 바꿉니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: todo
  labels:
    aadpodidbinding: "cosmostodo-apppodidentity"
    app: todo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: todo
  template:
    metadata:
      labels:
        app: todo
        aadpodidbinding: "cosmostodo-apppodidentity"
    spec:
      containers:
      - name: mycontainer
        image: "{ACR name}/{Image name}:{Version}"   # Update per your environment; for example, myacrname.azurecr.io/todo:latest. Do not add https:// in ACR Name.
        ports:
        - containerPort: 80
        env:
        - name: KeyVaultName
          value: "{resource group name}kv"       # Replace resource group name. Key Vault name is generated by Bicep.
      nodeSelector:
        kubernetes.io/os: linux
      volumes:
        - name: secrets-store01-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "azure-kvname-podid"       
---
    
kind: Service
apiVersion: v1
metadata:
  name: todo
spec:
  selector:
    app: todo
    aadpodidbinding: "cosmostodo-apppodidentity"    
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

배포 YAML 적용

kubectl apply를 다시 사용하여 애플리케이션 Pod를 배포하고 부하 분산 장치를 통해 Pod를 노출합니다.

kubectl apply \
  --filename akstododeploy.yml \
  --namespace 'my-app'

애플리케이션 테스트

애플리케이션이 실행되면 애플리케이션 프런트 엔드를 인터넷에 공개하는 Kubernetes 서비스가 만들어집니다. 이 프로세스를 완료하는 데 몇 분이 걸릴 수 있습니다.

부하 분산 장치가 노출하는 외부 IP를 보려면 kubectl get을 사용합니다.

kubectl get services \
  --namespace "my-app"

애플리케이션에 액세스하려면 브라우저에서 출력으로 받은 IP 주소를 엽니다.

리소스 정리

Azure 요금이 청구되지 않도록 하려면 클러스터가 더 이상 필요하지 않을 때 불필요한 리소스를 정리합니다. az group deleteaz deployment sub delete를 사용하여 각각 리소스 그룹 및 구독 배포를 삭제합니다.

az group delete \
  --resource-group $rgName 
  --yes

az deployment sub delete \
  --name $deploymentName