Azure 인프라 프로비저닝(Provision Azure Infrastructure)

Azure 인프라 프로비저닝(Provision Azure Infrastructure)

Confident AI가 실행되는 클라우드 인프라를 프로비저닝해요: 비공개 AKS 클러스터, PostgreSQL Flexible Server, Blob 컨테이너 두 개가 있는 Storage 계정, 그리고 그걸 묶는 비공개 네트워킹. 완료되면 실행 중인 클러스터와 다음 페이지의 Helm 차트에 넣을 출력값들이 생겨요.

출처: 문서

본문

azurerm provider가 구독을 명시적으로 설정하길 요구해요. 구독과 리전을 한 번 설정하세요:

az account set --subscription "<your-subscription>"
export ARM_SUBSCRIPTION_ID=$(az account show --query id -o tsv)
export LOCATION=centralus

리소스 그룹과 네트워크 생성 (선택)

AKS용 서브넷과 Microsoft.DBforPostgreSQL/flexibleServers에 위임된 별도 서브넷이 있는 리소스 그룹과 VNet을 이미 갖고 있다면 이 단계는 건너뛰세요. 다음 단계에서 기존 ID를 사용하세요.

AKS에는 고유한 서브넷이 필요하고, PostgreSQL Flexible Server에는 위임된 별도 서브넷이 필요해요. 블록을 순서대로 실행하세요.

리소스 그룹을 만들어요:

az group create --name confident-prod-rg --location $LOCATION

AKS 서브넷이 있는 VNet을 만들어요:

az network vnet create \
  --resource-group confident-prod-rg --name confident-prod-vnet \
  --address-prefixes 10.40.0.0/16 \
  --subnet-name aks --subnet-prefixes 10.40.0.0/20

ClickHouse는 이 모듈이 만드는 IPv4 전용 AKS 클러스터에서 깔끔하게 실행돼요: 차트가 오퍼레이터 파드를 IPv4(0.0.0.0)로 청취하도록 고정해서, 주소 패밀리 오류 없이 듀얼 스택 설정이 필요 없어요. 듀얼 스택 VNet만으로는 바뀌지 않아요. 클러스터 자체가 듀얼 스택으로 생성되지 않는 한 노드는 IPv4 전용으로 유지돼요.

PostgreSQL Flexible Server에 위임된 두 번째 서브넷을 추가해요. 다른 것을 담을 수 없어요:

az network vnet subnet create \
  --resource-group confident-prod-rg --vnet-name confident-prod-vnet \
  --name postgres --address-prefixes 10.40.16.0/28 \
  --delegations Microsoft.DBforPostgreSQL/flexibleServers

Terraform 설정에 붙여 넣을 네트워크 ID를 출력해요:

echo "confident_virtual_network_id = \"$(az network vnet show -g confident-prod-rg -n confident-prod-vnet --query id -o tsv)\""
echo "confident_aks_subnet_id      = \"$(az network vnet subnet show -g confident-prod-rg --vnet-name confident-prod-vnet -n aks --query id -o tsv)\""
echo "confident_database_subnet_id = \"$(az network vnet subnet show -g confident-prod-rg --vnet-name confident-prod-vnet -n postgres --query id -o tsv)\""

코드 샌드박스 이미지 미러링 (필수)

코드 기반 및 트랜스포머 지표는 여러분이 소유한 Azure Container Registry에서 confident-code-sandbox-azure 이미지를 가져오는 샌드박스형 Azure Function에서 실행돼요. 공개 이미지를 ACR로 미러링해요. 모듈은 리포지토리 이름 confident-code-sandbox를 기대하므로 그렇게 태그해요.

ACR을 만들고 Docker를 로그인해요 (이름은 전역적으로 고유하고 소문자여야 해요):

az acr create --resource-group confident-prod-rg --name <youracr> --sku Basic
az acr login --name <youracr>

공개 이미지를 가져와 ACR로 푸시해요:

docker pull confidentai/confident-code-sandbox-azure:latest
docker tag confidentai/confident-code-sandbox-azure:latest <youracr>.azurecr.io/confident-code-sandbox:latest
docker push <youracr>.azurecr.io/confident-code-sandbox:latest

Terraform 설정 작성

공개 모듈을 참조하는 main.tf를 만들고, 앞선 단계들의 ID를 채워요. 각 변수의 역할:

  • 리소스 그룹과 네트워크: confident_resource_group_name, confident_azure_region, 그리고 네트워크 단계의 네트워크 ID.
  • 네이밍: confident_environment와 confident_environment_code가 prod 네이밍 컨벤션을 모든 리소스에 적용해요.
  • 접근: confident_public_aks는 클러스터 API를 머신에 노출해요. 비공개 전용 엔드포인트를 원하면 false로.
  • 관리형 서비스: confident_create_key_vault와 confident_managed_redis_enabled가 권장 시크릿 스토어와 Redis를 켜고, confident_redis_private_endpoint_subnet_id는 Redis의 비공개 엔드포인트를 배치해요 (aks 서브넷이 동작해요).
  • 코드 실행기: confident_acr_login_server는 미러링한 이미지를 담은 ACR이에요. Function이 비공개 ACR에서 가져올 수 없다면 confident_acr_admin_username과 confident_acr_admin_password도 설정하세요.
provider "azurerm" {
  features {}
}

module "confident_ai" {
  source  = "confident-ai/confident-ai/azurerm"
  version = "~> 0.1"

  confident_resource_group_name = "confident-prod-rg"
  confident_azure_region        = "centralus"

  confident_virtual_network_id = "/subscriptions/.../virtualNetworks/confident-prod-vnet"
  confident_aks_subnet_id      = "/subscriptions/.../subnets/aks"
  confident_database_subnet_id = "/subscriptions/.../subnets/postgres"

  confident_environment      = "prod"
  confident_environment_code = "p"

  confident_public_aks = true

  confident_create_key_vault                 = true
  confident_managed_redis_enabled            = true
  confident_redis_private_endpoint_subnet_id = "/subscriptions/.../subnets/aks"

  confident_code_executor_enabled = true
  confident_acr_login_server      = "<youracr>.azurecr.io"
}

output "helm_values" {
  value     = module.confident_ai.helm_values
  sensitive = true
}

리포지토리 안에서 작업하고 싶다면 terraform-azurerm-confident-ai를 클론해 module 블록 대신 terraform.tfvars 파일에 같은 변수를 넣으세요.

원격 상태 구성 (선택)

이걸 건너뛰면 로컬 상태를 사용해요. 팀이나 실제 환경이라면 상태를 Storage 계정에 두세요.

terraform {
  backend "azurerm" {
    resource_group_name  = "confident-prod-rg"
    storage_account_name = "confidenttfstate"
    container_name       = "tfstate"
    key                  = "confident-ai/azure.tfstate"
  }
}

적용(Apply)

terraform init
terraform plan
terraform apply

AKS 클러스터와 Flexible Server를 만드는 데는 대략 15-20분이 걸려요.

클러스터 연결

eval "$(terraform output -raw configure_kubectl)"
kubectl get nodes

AKS에는 기본 스토리지 클래스(managed-csi)가 있어서, 클러스터 내부 ClickHouse와 Redis 디스크가 바로 동작해요.

출력값 읽기

다음 페이지의 Helm 차트가 이 값들을 필요로 해요. terraform output helm_values가 바로 붙여 넣을 수 있는 스니펫을 출력하거나, 개별로 읽어요. 각 줄의 주석은 그것이 넣어줄 Helm 값을 나타내요:

terraform output -raw database_url                 # secrets.data.DATABASE_URL
terraform output -raw storage_connection_string    # secrets.data.AZURE_STORAGE_CONNECTION_STRING
terraform output storage_account_name              # storage.azure.storageAccountName
terraform output test_cases_container              # storage.testCasesBucket
terraform output payloads_container                # storage.payloadsBucket
terraform output -raw code_executor_function_url   # codeExecutor.azure.functionUrl (append /api/execute)

관리형 시크릿과 Redis (권장)

위의 모듈 블록이 둘 다 프로비저닝해요. Deploy 페이지가 External Secrets Operator를 설치하고, 페더레이션 자격 증명 한 단계를 완료하고, 차트에 연결해요:

  • Key Vault + External Secrets Operator (confident_create_key_vault = true): Terraform이 볼트와 ESO용 관리 아이덴티티를 만들어요.
  • Azure Managed Redis (confident_managed_redis_enabled = true): 클러스터 내부 대신 관리형 Redis로, 이름 붙인 서브넷의 비공개 엔드포인트로 접근해요. terraform output -raw redis_url이 redis.externalUrl 값을 줘요.

더 간단한 구성이 좋다면 둘 다 false로 두어 시크릿을 Kubernetes Secret에 담고 Redis를 클러스터에서 실행하세요. Deploy 페이지의 더 간단한 옵션을 참고하세요.

입력 참조(Inputs reference)

가장 자주 설정할 변수들이에요. 완전하고 항상 최신인 목록은 Terraform Registry의 모듈 입력을 참고하세요.

필수

Variable 설명
confident_resource_group_name 기존 리소스 그룹.
confident_virtual_network_id 기존 VNet id (PostgreSQL 비공개 DNS 연결용).
confident_aks_subnet_id AKS 노드용 기존 서브넷.
confident_database_subnet_id Microsoft.DBforPostgreSQL/flexibleServers에 위임된 기존 서브넷.

자주 설정 (선택, 프로덕션 기본값 포함)

Variable 기본값 설명
confident_azure_region centralus 클러스터와 데이터 플레인 리전.
confident_environment / confident_environment_code stage / s 리소스에 적용되는 네이밍 컨벤션 (prod / p 사용).
confident_public_aks false 클러스터 API 엔드포인트 노출.
confident_node_vm_size / confident_node_group_desired_size Standard_D8s_v5 / 4 노드 풀 크기.
confident_code_executor_enabled / confident_acr_login_server true / "" 코드 실행기 Function과 그 이미지를 담은 ACR 로그인 서버.
confident_create_key_vault false Key Vault와 ESO용 관리 아이덴티티.
confident_managed_redis_enabled / confident_redis_private_endpoint_subnet_id false / "" Azure Managed Redis와 그 비공개 엔드포인트 서브넷.

다음 단계

Helm으로 배포

Terraform 출력값으로 앱을 설치하고 HTTPS로 노출.

더 알아보기