콘텐츠로 이동

배포와 온보딩(Deploy and Onboard)

이 가이드를 사용해 Azure 구독에 FDAI를 프로비저닝하고 첫 온보딩을 완료해 관측을 시작할 준비를 합니다. 이 문서는 구체적인 배포 인벤토리, 부트스트랩 순서, 배포판과 설치 환경의 책임 분리를 정의하는 기준 원본입니다. 배포 수명 주기(CI/CD, 점진적 전달, 롤백, DR)는 deployment-ko.md에서 다룹니다. 이 문서는 Azure 구독을 대상으로 합니다. 비-Azure 공급자는 추후 검토 대상입니다 (구현 Focus). 모든 식별자는 generic-scope.instructions.md에 따른 합성 값입니다.

Day-zero 서비스 계층과 수량은 최소 Azure 리소스 인벤토리에서 결정되어 있습니다. 배포 소유자는 배포 전에 지역, 할당량, 보존, 복제본 상한, 운영 계층 재정의를 확인합니다. 실행 엔진은 infra/의 terraform apply로 결정되어 있습니다. 운영자 진입점은 fdaictl provision azure입니다. 이 명령은 정확한 계획을 로컬에서 조정하고 비공개 데이터 플레인 적용을 대상 VNet 내부의 Managed Host에서 실행합니다. 대상 환경 배포에는 GitHub Actions를 사용하지 않습니다. 설치형 배포 CLI와 배포 아티팩트를 참조하세요. 대화형 소스 설치는 번호가 있는 단계, 범위가 제한된 세부 정보, 경과 시간 활동 신호를 추가 전용으로 기록합니다. 터미널을 지우거나 공급자 완료를 추정하지 않으며 표시 진행률을 배포 준비 상태로 취급하지 않습니다.

제품을 독립적으로 기동하려면 공급업체의 Release Hub 루트 또는 고객의 Lifecycle Hub 루트를 사용하세요. 각 루트는 자신의 UI/API, 비공개 PostgreSQL과 지원 자원만 소유하며 별도 state를 사용합니다. 상대 Hub의 입력은 필요하지 않습니다. 기본 로컬 백엔드는 명시한 영속 비공개 경로에서 기존 로컬 state를 보존하며, 별도로 검토한 원격 백엔드는 선택 사항입니다. Lifecycle Hub 이미지는 채택 정책이 opa를 실행하므로 digest로 고정한 OPA_IMAGE 빌드 인자가 필요하며, Release Hub 이미지에는 포함되지 않습니다. Lifecycle Hub catalog 설정에는 access, check_interval_seconds, adoption 객체가 추가되고, auto 모드에는 귀속되고 만료되는 authorized_by와 authorization_expires_at이 필요합니다. Release Hub에는 auth.public_catalog_export와 timestamp_renewal_check_seconds가 추가됩니다. 새 필드는 모두 선택 사항이며 설정하지 않으면 실행 JSON에서 생략되므로 이전 이미지도 설정을 파싱합니다. 자동 카탈로그 채택을 참고하세요. 서명된 카탈로그 역할은 선택 입력을 둘 더 추가합니다. Lifecycle Hub catalog.trust 객체(mode = "tuf", root_key_ids, root_threshold)가 release_public_key를 대체하고, Release Hub catalog_roles 객체는 서로 다른 snapshot 키와 timestamp 키 비밀 버전을 추가합니다. 오프라인에서 서명한 root는 install-catalog-root 작업으로 설치합니다. 서명된 카탈로그 역할을 참고하세요. Lifecycle Hub 작업 Job은 bind-catalog와 rebind-catalog도 수락합니다. 요청 비밀 대신 귀속되는 actor와 reason을 받으며, 재바인딩은 리비전 하한을 유지합니다. 로그인과 카탈로그 연결은 기동의 전제조건이 아닙니다. Entra 앱 등록 없이 migration, 상태/준비 검사와 정적 UI를 제공하며, 인증을 설정하기 전까지 관리 API는 사용할 수 없습니다. 익명 관리 기능을 제공하거나 새로운 FDAI 설치 경로를 추가하는 것이 아닙니다. 고정 이미지, state 보존 및 기본 Terraform/Azure CLI 실행과 범위가 제한된 읽기 전용 데이터베이스 복구 비교는 단일 제품 절차를 따르세요. 이 비교는 쿼리의 접속 대상 재정의를 차단하며 권한을 부여하거나 전체 데이터베이스 동등성을 입증하지 않습니다. 비공개 관측 환경, 증적 보존, 독립적인 보안 설정 및 정리 결과 확인이라는 전제조건도 유지됩니다.

이미 실행 중인 Hub를 업그레이드할 때는 app_image로 승인된 기존 서비스 이미지 digest를 유지하고, image로 새 마이그레이션 후보를 지정합니다. 기존 앱과 마이그레이션 Job은 활성화 상태로 유지합니다. 수동 마이그레이션 성공과 독립적인 스키마 확인을 마친 뒤, 별도로 검토하고 봉인한 활성화 계획에서 app_image=null을 지정합니다. 이 입력을 생략하면 기존 단일 이미지 기동 방식이 유지됩니다. 선택적 resource_group_name으로 기본 리소스 그룹 이름을 재정의하고 custom_domain으로 공개 HTTPS 서브도메인·Azure DNS 레코드·런타임 origin·상태 검사 Host 헤더를 일치시킬 수 있습니다. Hub는 설정된 origin 호스트만 받아들이므로 사용자 지정 도메인을 설정하면 기본 Container App 호스트네임은 400으로 응답합니다. custom_domain.redirect_default_hostname=true를 설정하면 redirect_hosts를 읽는 Hub 이미지가 그 호스트네임의 GET과 HEAD를 고정된 origin으로 308 리디렉션하고 나머지는 거부합니다. 이전 이미지에서는 설정하지 마세요. 전체 Job 검증과 실행 전 전체 변경 없음 계획도 유지하며, 상태 소유권, 인증이나 승인 절차를 우회하지 않습니다.

Hub 관리형 AKS 인계에서는 enable_document_ingestion=true로 공용 Azure 선행 조건을 만들면서 enable_document_ingestion_workloads=false로 인제스트 API, 워커, 마이그레이션 Container Apps를 생략할 수 있습니다. 소스·오프라인 Container Apps 배포의 기본값은 계속 true입니다. 검토한 정확한 계획에서만 이 분리를 사용하며, Hub 소유권이나 적용 권한을 부여하지 않습니다. 기존 설치에서는 별도 remote state key를 사용하는 infra/hub-stewardship-prerequisites에서 이 계획을 실행합니다. 이 루트는 공용 플랫폼 리소스를 조회하고 애플리케이션 워크로드를 소유하지 않으므로, 보존된 소스 워크로드 state를 묵시적으로 다시 계획할 수 없습니다. 운영 VNet이 기존 Blob 비공개 DNS 영역에 이미 연결되어 있으면 문서 스토리지 엔드포인트는 애플리케이션 영역과의 연결을 유지합니다. 루트는 겹치는 VNet 연결을 다시 만드는 대신 동일한 비공개 IP의 관리형 A 레코드를 운영 영역에 게시합니다.

선택적 Lifecycle Hub operator_auth.development_recovery 입력으로 개인 키를 사용할 수 없는 개발 설치 신원 하나를 복구할 수 있습니다. 정확한 full-authority-development 설치, 범위, Owner, 이전 및 대체 공개 키, 사유와 승인 구간에만 사용합니다. Release Hub는 이 입력을 수락하지 않습니다. Lifecycle Hub는 계속 대체 키 소유 증명, 열린 Plan과 기존 구성 신뢰가 없음, 추가 전용 감사와 첫 바인딩에 한정된 single-Owner 승인을 요구합니다. 복구와 키 등록을 확인한 뒤 이 입력을 제거하세요. 프로덕션 또는 일반 등록 키 교체 설정이 아닙니다.

원격 개발 Agent를 연결할 때는 Lifecycle Hub 루트의 operator_auth.agent_principals에 명시적인 연결 정보를 지정합니다. 각 항목은 하나의 설치, Entra 개체와 클라이언트를 식별합니다. Release Hub는 Agent 연결을 허용하지 않습니다. 목록을 생략하면 기존 인증 동작을 유지합니다. Terraform은 Agent.Access, 페더레이션 자격 증명이나 Kubernetes 권한을 부여하지 않습니다. 승인된 범위에서 별도로 설정하세요. 해당 네임스페이스로 제한된 RBAC, 영속 상태 볼륨, 등록과 독립적인 결과 확인은 Hub 운영자 안내서를 따르세요. 이 설정만으로 운영자 권한이나 release 적용 권한이 생기지는 않습니다. Agent 상태 볼륨은 영역 중복(zone-redundant) 디스크 클래스를 사용하므로 다른 영역으로 옮겨진 Pod도 볼륨을 연결할 수 있습니다.

기존 두 Hub 검증 구성은 기존 state 소유자를 위해 그대로 보존합니다. 해당 안내는 별도 네트워크, 자체 관리 ID와 키, 명시적 migration, Entra 운영자/서비스 경계와 독립적인 카탈로그 pin 승인을 유지합니다. 어느 독립 제품의 전제조건도 아니며 FDAI 설치기를 대체하지 않습니다. 로컬 컨테이너/정적 Terraform 근거로는 Azure 네트워크와 RBAC 격리, Entra/MI, 레지스트리 아키텍처, 복제본 영속성이나 배포 성공을 입증할 수 없습니다. 이 검증에는 승인된 실제 실행 범위가 필요합니다. Agent 적용과 전체 FDAI 설치는 제외됩니다.

운영 배포자 권한 경계는 운영 배포 강화에서 소유합니다.

  • 아래 인벤토리의 모든 서비스를 사용할 수 있는지 확인한 지역.
  • 확인된 할당량 여유(AKS 노드 제품군 및 지역 vCPU, Event Hubs 처리량 단위, PostgreSQL vCore, Key Vault 작업).
  • Diagnostic Settings 목적지 (Log Analytics workspace) - 신규 또는 기존; 소유권 TBD.
  • 단계별 비공개 네트워크 구성. 기본 배포는 API Server VNet Integration, 워크로드 및 API 서버 전용 서브넷, 인증되고 제한된 공개 관리 접근을 포함한 AKS Standard를 만듭니다. 구독 정책이 첫 효과부터 요구하지 않는 한 VNet 피어링, 비공개 엔드포인트, 비공개 DNS 또는 비공개 클러스터 모드는 요구하지 않습니다. 기본 Console 상태 검사가 통과하면 /provisioning에서 이러한 변경의 별도 정확한 계획을 요청할 수 있습니다. 보호된 실행기는 공개 경로를 비활성화하기 전에 피어링, 경로, DNS, TLS, 신원, 비공개 엔드포인트와 레지스트리 접근을 구성하고 검증합니다. 브라우저는 Terraform을 실행하거나 배포 자격 증명을 받지 않습니다. 정책으로 잠긴 테넌트는 기본 배포 중 적합한 내부 호스트와 정확한 비공개 계획을 사용하며 정책을 약화하지 않습니다.

독립 실행하는 infra/bootstrap은 기존 상태 계정과 애플리케이션 그룹을 요구합니다. 아래 별도 Genesis 루트는 로컬에서 애플리케이션 데이터 플레인 작업을 수행하지 않고 생성 순환 의존성을 없앱니다. 새 데이터베이스는 보호된 입력으로 관리자 암호를 제공하거나 Terraform 영속 생성을 명시적으로 선택합니다. 기존 서버에서 생성을 켜는 것은 별도 승인이 필요한 자격 증명 변경입니다. 참조 계획은 Terraform >= 1.9와 호환되며 루트 연결은 별도로 검사합니다.

  • 배포자 신원: 역할 할당에는 User Access Administrator가 필요하며 Contributor만으로는 부족합니다.
  • 상태 저장소: 독립 Bootstrap은 infra/bootstrap/create-state-account.sh로 만든 기존 계정을 읽습니다. AzureRM 조회가 계정 키를 읽을 수 있으므로 로컬 상태는 비밀을 포함한 자료로 보호합니다.
  • 애플리케이션 리소스 그룹: 독립 Bootstrap은 실행기 역할을 할당하기 전에 그룹이 존재해야 합니다.
  • 실행기 입력: SSH 공개 키, 여유 할당량, Log Analytics 대상을 제공합니다. 변경 허용 Genesis는 공급자나 정책을 변경하기 전에 prepare-genesis-access-tools.sh를 실행해 Azure 리소스를 만들지 않고 안정적인 Bastion 및 Microsoft Entra SSH CLI 확장을 고정합니다. 로컬 CLI를 미리 준비하거나 복구할 때만 직접 실행하며 검사 모드는 읽기 전용입니다. 연결된 Bootstrap은 정확한 Marketplace Ubuntu 버전을 사용합니다. 오프라인 Bootstrap은 별도로 검증된 사전 준비 이미지를 선택할 수 있습니다.

Genesis 기반 계층 루트는 ARM으로 두 리소스 그룹, 비공개 상태 계정, tfstate 및 deployment-plans 컨테이너와 블롭 보호를 관리합니다. 계정 키 조회 없이 기존 Bootstrap의 네트워크, 배포 신원, 실행기를 재사용합니다. 선택적 Standard Bastion 서브넷에는 Azure가 요구하는 전체 인바운드 및 아웃바운드 Network Security Group 규칙을 연결하며, 필수 플랫폼 규칙이 하나라도 없으면 터널 생성을 차단합니다. 새 플랫폼 상태에서는 foundation_resource_group_context_digest로 참조 전용 소유권을 선택하고 기반 계층 태그와 지역을 확인합니다. 검증된 공개 개발 실패 상태는 고급 삭제 없는 채택 경로로만 비어 있는 Foundation 관리 애플리케이션 백엔드에 들어갈 수 있습니다. 이 경로는 리소스 그룹 소유자 주소 두 개를 제거하고 원래 상태를 유지하며, 강제하지 않는 push 한 번 전에 claim을 기록하고 readback을 검증하며, 모든 삭제 또는 교체 계획을 승인 전에 차단합니다. fdaictl provision plan --stage foundation은 로컬 backend를 사용하는 비공개 모의 실행입니다. 정확한 상태 이전 아카이브에서만 서명된 AzureRM backend 예제를 활성화해 검증된 호스트에 전달합니다. Genesis는 Terraform 아카이브와 실행 파일 다이제스트를 각각 인증하고, 호환되는 호스트 VM SKU와 정확한 Marketplace Ubuntu 버전을 선택하며, 체크섬으로 고정된 도구 체인을 직접 설치합니다. 아티팩트 오프라인 배포는 별도로 검증된 사전 준비 이미지를 대신 사용할 수 있습니다. 같은 상위 지원 파일이 없는 이전의 보존된 이행 claim은 새로운 foundation-state 승인 후 검토된 구성의 정확한 파일만 복원할 수 있습니다. 별도 현재 소스 검증기는 Terraform 입력 트리 밖에 남아 복구 오버레이를 검증하고 백엔드 이행을 반복하지 않은 채 verify를 재개합니다. 새 권한 레코드는 정규화된 Terraform 출력과 함께 정확한 backend blob 바이트를 결속합니다. 정리 후에는 현재 검증된 관찰기 코드를 소유자 전용 Bastion 전송 및 다이제스트 재확인 경로로 실행하고, Managed Identity Azure CLI 권한으로 보호된 상태 blob을 직접 읽은 뒤 제거하며, 삭제된 Terraform 작업 트리나 provider 미러를 다시 만들지 않은 채 권한 증거에 결속된 blob 다이제스트를 다시 확인합니다. 기존의 완결된 증적은 새 다이제스트를 만들어 내지 않고 최초 변경 없음 근거를 유지합니다. 기반 계층 적용, Bastion 등록, 검증된 상태 이전에는 정확한 승인이 필요하며, 애플리케이션 배포와 준비 상태는 Genesis 원장에 미완료로 남아 있습니다.

Azure Policy가 인벤토리 일부를 거부하는 테넌트에서는 계획이 수렴하기 전에 예외 또는 대응하는 capability-mode 토글이 필요합니다 (deployment-preflight-ko.md). Upstream은 공급자 없이 실행되는 참조 계획으로 토글 계약을 검증합니다. 실제 리소스 모듈에 출력을 연결하고 기존 리소스 ID를 공급하는 책임은 배포 또는 fork에 있습니다.

ops/허브 러너 (private-everything 테난트)

섹션 제목: “ops/허브 러너 (private-everything 테난트)”

일부 테넌트는 Key Vault와 저장소를 포함한 모든 데이터 서비스에 비공개 접근을 강제합니다. 따라서 노트북에서는 Terraform 원격 상태 백엔드에도 접근할 수 없습니다. infra/bootstrap 계층은 배포를 지원하며 앱을 다시 빌드해도 유지되는 허브를 구성합니다:

Ops 계층은 기본적으로 GitHub와 Azure 관리 및 신원 평면에 연결되는 아웃바운드 경로 하나를 만듭니다. 승인된 경로가 있는 폐쇄망은 enable_public_egress = false로 설정합니다. 또한 runner_bootstrap_mode = "offline"을 설정하면 초기화 과정은 정확한 관리 이미지 또는 숫자형 갤러리 버전 ID 하나를 요구하고 Marketplace 선택, cloud-init, GitHub 등록을 비활성화합니다.

  • 앱 RG 와 분리된 ops 리소스 그룹 + 허브 VNet(rg-fdai-ops-<region_short> / vnet-fdai-ops-...), 러너 서브넷과 private-endpoint 서브넷 포함;
  • 비공개로 잠긴 terraform remote-state 저장소 계정, ops VNet에 링크된 privatelink.blob.core.windows.net 블롭 비공개 엔드포인트로 프론트;
  • 현재 및 후보 실행기 VM과 수명 주기가 분리된 안정적인 배포용 사용자 할당 Managed Identity(UAMI). Bootstrap은 정확한 역할 매니페스트를 소유하며 client ID와 principal ID를 별도로 출력합니다.
  • 공개 IP 없이 지속형 Standard_D8ds_v5(로컬 SSD가 있는 8 vCPU이며, 지역에 v5가 없으면 Standard_D8ads_v5 또는 Standard_D8ds_v4)와 Local ResourceDisk 임시 OS에서 실행기 자리 1-5개를 등록하는 자체 호스팅 배포 실행기 VM. VM-side Bash가 자리 경로를 확장하며, 할당 해제는 차단되고 예약 drift는 관리형 OS 디스크나 배치 변경을 거부합니다. 자리는 안정적인 UAMI를 공유합니다. 계획과 읽기 전용 검사는 서비스별 잠금을 사용하고 적용과 상태 이행은 환경별 단일 writer 잠금을 공유합니다. 플랫폼 및 시나리오 Terraform은 deployer 역할을 해당 principal에 고정하고 인증된 principal이 다르면 중단합니다. UAMI는 앱 RG에 Contributor + User Access Administrator, ops RG에 Network Contributor, 상태 계정에 Storage Blob Data Contributor, 구독에 Reader + EventGrid Contributor + Cognitive Services Contributor를 보유합니다. 조건부 Role Based Access Control Administrator 할당은 서비스 주체에 Reader, Monitoring Reader, Cost Management Reader만 할당할 수 있습니다. 이행 중에는 현재 VM에 시스템 신원과 UAMI를 함께 연결하지만 승격된 VM에는 UAMI만 남고 workflow는 신원을 암묵적으로 선택하지 않습니다. 각 실행은 Azure CLI 계정 캐시를 지우고 구성된 UAMI client ID로 로그인한 뒤 저장소, 계획, 적용 전에 저장소에 설정된 exact 구독, 테넌트 및 ARM token oid를 증명합니다. 검토된 블루/그린 전환에서는 VM과 네트워크 인터페이스를 Bootstrap 상태로 가져오기 전에 runner_vm_name을 설정하여 기존 후보의 GitHub 등록을 유지할 수 있습니다. Bootstrap은 명시적으로 검토한 교체 전까지 채택한 이미지 참조를 보존합니다. 예약 점검은 모든 루트를 강제합니다. 수동 runner 범위는 보호된 호스트의 SSH 입력 복구, 실제 디스크 인벤토리, UserAssigned-only 신원, 구성된 UAMI 1개, 빈 구조화 드리프트 작업을 포함해 실행기 저장소와 Bootstrap 상태만 검증합니다. 전체 범위는 Bootstrap과 플랫폼의 정확한 직접 역할 및 일회용 시나리오 상태의 부재 또는 빈 상태도 요구합니다. 체크아웃 전 실행기는 이전 방식으로 생성된 infra/None 캐시 경로만 제거합니다. 루트 소유 작업의 잔여물이 정확한 커밋의 깨끗한 작업 트리 확인을 막지 않게 하기 위해서입니다. 해당 단계는 Azure CLI 구성을 RUNNER_TEMP 아래에 만들고 후속 단계용 GITHUB_ENV로 내보냅니다. 배포 작업의 기본 경로가 infra/이므로 새 자리에는 아직 저장소 디렉터리가 없으며 이전 체크아웃 잔여물에 의존하지 않습니다. 앱 구성은 spoke VNet을 ops 허브에 (양방향) 피어링하고 비공개 DNS 영역을 extra_vnet_links 경계로 ops VNet에 링크해, 러너가 앱 Key Vault를 비공개로 해석하게 합니다. 러너가 terraform 적용 주체이므로 기존 kv_officer_self 부여가 러너를 앱 금고의 Key Vault Secrets Officer로 만듭니다 - 적용 중 DSN 시크릿을 씁니다. 대상 환경 배포는 standalone 로컬 조정기와 Bastion으로 연결할 수 있는 Managed Host에서 실행합니다. 기존 deploy-dev workflow는 저장소 자동화 근거로 유지하지만 대상 환경 배포 진입점으로 지원하지 않습니다. GitHub 라벨 일치는 AND 조건이므로 해당 풀을 사용할 수 없으면 작업이 느린 관리형 디스크 실행기로 자동 전환되지 않고 큐에서 대기합니다. 저장소 작업 흐름은 검토된 원격 액션만 허용하고 정확한 Node 24 호환 릴리스 참조에 고정합니다. 컨테이너 공급망 액션은 변경할 수 없는 커밋 SHA를 사용합니다. CI 계약은 알 수 없는 액션과 일치하지 않는 참조를 차단합니다. Terraform 고정본 테스트는 선언된 >= 1.9 하한에서 허용되는 구문만 사용하고 모의 client-config object ID를 deploy principal에 고정합니다. Plan-only 보존은 범위와 역할이 바뀌지 않고 principal_id만 유일한 역할 교체 경로이며 함께 교체하는 Operator UAMI가 위치, 리소스 그룹, 태그를 유지하면서 이름만 바꿀 때 Operator API OpenAI User 역할 교체를 허용합니다. 같은 검토 복사본은 안정 실행기 UAMI로 향하는 정확한 역할 principal 또는 범위 이행, 측정 기능이 비활성화된 이전 indexed 측정 Job 두 개의 삭제 전용 제거, 검토된 embedding 제품군 및 SKU 교체만 허용합니다. 측정 Job 제거는 정확한 관리형 리소스 종류, 이름, 인덱스, 이전 객체, null 결과, 교체 경로 부재를 모두 충족해야 합니다. 프로바이더가 계산하는 필드의 인코딩은 권한을 부여하지 않으며 보존은 apply를 승인하지 않습니다. 보호된 배포 workflow는 반복 검증, 대상 파생, 상태 보존 및 효과 게시를 집중 helper에 두고 모든 종료에서 렌더링한 계획을 제거하며, 개발 전용 identity 이행을 상태가 소유한 검토된 deployer 역할, stable-principal readback, 교체된 principal의 할당 0건으로 제한합니다. 역할 교체와 짝을 이루고 local user를 끄며 구성된 blob 및 container 보존 기간을 유지하는 in-place storage 보안 선행 조건만 함께 허용합니다. 상태에 없는 역할 주소는 대상으로 삼지 않으며 Console, Entra, 데이터베이스, 상태 검사 및 canary 작업은 포함하지 않습니다. 중단된 apply 뒤 복구 계획을 만들기 전 storage 및 Foundry 소유 리소스 상태는 역할 주소가 없어도 기능 활성화를 복원하며, 소유자가 남아 있는데 scope를 구할 수 없으면 실패합니다. Workflow는 의도한 각 범위에서 기존 stable 할당이 정확히 1개일 때만 가져오고, 중복이나 다른 상태 주소가 이미 추적하는 assignment ID는 거부합니다. Identity 모드에서는 operational-history handoff용 중복 주소를 다시 가져오지 않습니다. 권한 있는 workflow는 먼저 보호된 main에서 공유 source 검증기를 checkout합니다. 이 검증기는 대상 커밋 코드를 실행하기 전에 대상 커밋이 조상 커밋이 아니거나 workflow 제어가 다르면 차단합니다. 추가 배포 도구가 필요한 workflow는 runner 임시 저장소에만 설치하고 exact release와 SHA-256 digest를 pin한 뒤 사용 전에 검증합니다. Exact CI 버전이 파싱과 계획 assertion을 검증합니다. 업그레이드는 액션 런타임 메타데이터를 검증하며, 자체 호스팅 실행기 설치는 고정된 하한 버전이 아니라 항상 GitHub Actions 실행기의 최신 공개 릴리스를 해석해 설치합니다. 비공개 networking이 활성화되면 PostgreSQL 공개 접근과 broad Azure-services firewall을 비활성화합니다. Dev는 approved 비공개 엔드포인트를 사용하고 운영은 delegated-subnet 모드를 계속 선택할 수 있습니다. Protected 요청은 commit_sha를 명시적으로 체크아웃하고 git rev-parse HEAD와 비교합니다. 따라서 전달과 실행 사이에 release 커밋이 main을 이동해도 계획 또는 적용 코드가 바뀌지 않습니다. 배포 작업은 infra/에서 실행되므로, 저장소 루트 스크립트를 호출하는 단계는 ../scripts/로 접근하거나 working 디렉터리를 재정의합니다. 접두사 없는 scripts/... 경로는 infra/ 아래로 해석되어 Terraform이 검사할 결과를 만들기도 전에 실행기에서 127로 종료됩니다. Protected 실행기는 Terraform 계획 이후 scripts/deployment/azure/run_live_preflight.py를 직접 호출합니다. 이 독립 실행형 읽기 전용 진입점은 런타임 서비스 wheel이나 별도 배포되는 fdaictl 패키지에 의존하지 않고 Azure Policy, Compute 할당량, 실행기 RBAC 및 값을 읽지 않는 Key Vault 시크릿 메타데이터를 검사합니다. 매핑, 자격 증명, 카테고리 또는 프로브 결과가 없으면 계획 산출물을 저장하기 전에 실패 시 차단됩니다. 워크플로를 검토 가능한 크기로 유지하기 위해 보호된 계획 메타데이터와 적용 증적은 전용 저장소 모듈에서 생성합니다. YAML은 봉인된 입력과 명시적인 출력 경로만 해당 생성기에 전달합니다. 전체 계획 변환 결과와 값 없는 요약은 현재 UID가 소유한 mode-0700 임시 디렉터리를 사용하며 메타데이터 생성기가 반환된 후 제거됩니다. Exact 적용은 요약 스키마, 다이제스트, 작업 및 리소스 형식 합계, 비파괴 플래그, 필수 적용 후 관측 목록을 검증합니다. plan-runtime-* 및 plan-observability-*만 create, update, delete가 0인 terraform_data 상태 교체 하나를 포함할 수 있으며 다른 모든 파괴적 요약은 거부합니다. 두 필드가 모두 없는 기존 v1 메타데이터는 제한된 만료 시점까지 유효하지만 부분 요약 근거는 거부합니다. Protected 계획은 binary Terraform 계획, 범위가 제한된 preflight 근거, 함수 출처 보관을 각각 별도 SHA-256 다이제스트와 함께 저장합니다. Exact 적용은 모든 산출물을 download하고 검증합니다. Peer 증적은 인증된 실행기 신원과 범위가 제한된 시간 초과로 허용 목록에 있는 isolated 백엔드 블롭을 각각 직접 download하여 상태 바이트를 변경하지 않으면서 반복 프로바이더 initialization을 제거합니다. 서비스 롤백은 변경할 수 없는 스냅샷에 없는 post-apply 시크릿 이름만 제거한 뒤 exact Key Vault 참조를 복원합니다. Independent-service Container App 계획은 lowercase plan-time 개정 번호 접미사도 saved Terraform 계획에 봉인하므로 out-of-band 검증된 이미지 롤백 이후 desired Terraform 이미지가 변경되지 않은 상태에서도 exact 적용이 fresh 개정 번호를 생성합니다. 가드는 exact 이미지 갱신 옆에서 해당 범위가 제한된 접미사만 허용하며 적용 증적을 기록하려면 상태가 attested 이미지를 실행하는 새 개정 번호를 계속 요구합니다. 구성된 경우 이력 계획은 전용 의사 결정 근거 계정, 비공개 엔드포인트 및 읽기 전용 신원 부여를 대상으로 하며, 별도 워크플로는 보호된 main의 first-parent 근거만 검증하고 게시 전에 증명한 뒤 런타임이 읽기만 할 수 있는 불변 저장소에 수렴 가능한 기록을 씁니다. 새 계획 저장 전 실행기는 24시간이 지난 허용 목록에 있는 계획, 메타데이터, 출처, preflight, 점유, 증적 블롭만 선택합니다. 1001개 미만을 검사하고 워커 8개로 최대 1000개를 삭제하며 선택이 불완전하거나 삭제가 하나라도 실패하면 계획을 중지합니다. 개발 operations 게이트웨이를 선택하면 Terraform은 해당 함수, 코어, Operator API, 인제스트, 선택된 경우 isolated 실행기, operational canary, 인벤토리 조정 작업, realtime 인벤토리 발행기 및 해당 의존성 그래프를 대상합니다. 이렇게 하면 관련 없는 런타임 리소스 변경은 계획에서 제외하면서 작업 이미지와 필수 shared 런타임 구성을 수렴 상태로 유지합니다. Provider-schema Job은 루트 Terraform 리소스 azurerm_container_app_job.provider_schema[0]에서 소유합니다. 결정적 리소스 ID는 기존 Container Apps 환경과 인벤토리 신원을 연결하고, 읽기 전용 신원 조회는 클라이언트 ID를 제공하며, moved 블록은 이전 compute 모듈 주소의 상태를 보존합니다. 따라서 provider 전용 대상은 compute 모듈의 광범위한 플랫폼 의존성 그래프를 상속하지 않습니다. 이전 저장소 자동화의 provider-schema 모드는 공개 배포 CLI에 등록되지 않습니다. 넓은 게이트웨이 대상 대신 표준 Core 프로필에는 plan-provider-*와 apply-provider-*, Cost Governance Core 프로필에는 plan-provider-cost-*와 apply-provider-cost-*를 유지합니다. 하위 유형은 변경 가능한 입력을 추가하지 않고 맥락에 결속된 런타임 이미지 프로필과 일치해야 합니다. 두 형식 모두 Job 주소 하나와 증명된 정확한 Core 이미지 개정 번호만 허용하고, 혼합 대상을 거부하며, 적용 후 같은 대상으로 변경 없음 계획을 요구합니다. 계획과 적용은 해당 이미지가 롤백 보존이 활성화된 정상 프로비저닝 상태의 활성 Core 개정 번호인지 확인합니다. 계획은 정제된 불변 기준선을 저장하고, 적용은 이를 검증한 뒤 변경 전에 실제 기준선을 다시 관측합니다. 범위가 제한된 검증기는 Job을 한 번 시작하고 Core 기준선, 소스 개정 번호, 영속 세대, Heimdall 인계, 일치하는 Forseti 결정과 Saga 감사 근거를 보존합니다. Job은 새 관측을 강제하므로 주기 또는 실패 재시도 간격으로 명시적 검증을 건너뛸 수 없습니다. 수락한 완전한 스냅샷은 최신성 시각을 갱신하고 오래된 증적은 거부합니다. 검증 전용 재개는 Terraform을 다시 적용하지 않고 정확한 불변 근거를 재사용하거나 Job 검증만 반복합니다. 변경 없는 스키마는 검토를 해당 없음으로 기록합니다. 보존된 호환성 상태 읽기 기능은 봉인된 이미지 프로필과 다이제스트, 최신 정상 Core 기준선, 영속 출처와 세대, 완전한 검토 체인 또는 명시적인 해당 없음 결과를 검증합니다. 적용 상태에는 정확한 계획 ID와 다이제스트도 필요합니다. 대상 집합에는 활성 Terraform moved 블록의 출처 및 대상 주소가 모두 포함됩니다. 작업 흐름 계약 테스트는 이 주소를 동기화하여 상태 이행 때문에 protected 계획이 무효화되지 않도록 합니다. 여기에는 baseline-regression 및 pattern-growth 작업의 인덱스 없는 대상 주소가 포함됩니다. for_each 키 이름 변경에는 명시적인 moved 블록을 사용합니다. 따라서 Terraform은 기존 리소스를 삭제한 후 새로 만들도록 계획하지 않고 현재 리소스를 그대로 보존합니다. 대상이 지정된 계획에는 해당 for_each 이동의 리소스 컬렉션 주소가 포함됩니다. 따라서 Terraform은 키가 지정된 두 인스턴스를 함께 평가할 수 있으며 AI 계정과 역할 컬렉션도 함께 대상으로 지정하므로 네트워크 및 권한 확인 설정이 하나의 적용에서 수렴합니다. Terraform은 호스트와 배포 저장소에 읽기 담당 managed 신원을 사용하며 작업 흐름은 publish 전에 Flex-generated exact shared-key 재정의를 제거합니다. 해당 신원에는 호스트용 Storage Blob Data Owner와 멱등성용 기여자 권한 부여를 별도로 부여합니다. 함수 site_config는 Application Insights를 단독 관리하며 Easy Auth는 게이트웨이 principal 검사 전에 코어 실행기 managed 신원 클라이언트만 허용합니다. Operator API 배포는 저장소 Variable의 non-secret 관리자와 모든 non-autonomous 에이전트 담당 체계 연결도 요구하며 Container App precondition이 불완전한 지도를 거부합니다. Exact 적용이 수렴하면 작업 흐름이 검증된 출처를 official Flex One Deploy 액션으로 원격 빌드하고 범위가 제한된 트리거 sync 후 두 함수 트리거를 확인합니다. 변경할 수 없는 점유 뒤 신원 또는 상태 검사가 실패하면 검증 재개가 점유를 검증하고 Terraform 적용을 건너뛰며 convergence와 post-apply 검사를 다시 수행합니다. 보호된 Console 게시는 정확한 적용에서 저장소 Variable로 동기화한 비밀이 아닌 Static Web App 호스트 이름과 리소스 id를 사용합니다. 해당 결속이 없을 때만 같은 정확한 Terraform 상태 출력으로 대체하며 임의 리소스 검색은 수행하지 않습니다. 보호된 Console 게시는 결합된 Console 및 Manual Studio 정적 아티팩트만 업데이트합니다. Bot 소유 catalog 갱신은 정확한 Core image를 승격하고 schema migration과 PostgreSQL 변환 결과 검증을 실행하는 별도 보호 작업이며 정적 게시를 차단하지 않습니다. Health acceptance는 적용 증적을 기록하기 전에 코어 Container App의 최신 개정 번호가 항상 Provisioned와 Healthy인지 확인합니다. 선택된 Operator API 및 인제스트 개정 번호도 healthy여야 하며 shared 유입 /healthz 응답은 고정된 성공 페이로드를 반환해야 합니다. 런타임을 계획하지 않는 design-mocks-only 적용만 예외입니다. Protected-plan 삭제 게이트는 broad PostgreSQL Azure-services firewall 경로를 닫거나, 검토된 분리 이전 인제스트 권한 부여를 삭제하면서 모든 exact API 또는 워커 successor를 같은 계획에서 pure-create하는 범위가 제한된 security retirement만 허용합니다. 또한 계획 JSON이 정확한 주소, 계정, 모델 계열, 기존 SKU/용량, 목표 SKU/용량, 교체 작업과 일치할 때만 검토된 t1.embedding 이행을 허용합니다. 모델 연결 전용 계획은 상위 모듈이 아니라 Azure OpenAI 기능 배포 컬렉션을 대상으로 지정합니다. 따라서 범위 및 파괴적 변경 가드를 실행하기 전에 기존 계정과 역할 할당 리소스는 계획 그래프 밖에 남습니다. Workflow는 봉인한 resolver 산출물의 해시를 계산하기 전에 이를 정본화합니다. 리소스 변경이 없는 복구 계획은 이 정본 다이제스트가 증명된 활성 Core 모델 다이제스트와 다를 때만 수락하며, 적용 후에는 모델별 프로바이더 readback을 계속 요구합니다. 모델 삭제 전용 변경, 값이 달라진 교체, 누락되거나 생성이 아닌 successor, 그 밖의 모든 삭제는 계속 차단됩니다. infra/bootstrap/README.md. 예약 실행 구동기는 Terraform이 관리합니다. SCHEDULER_TICK_CRON_EXPRESSION 및 ANALYZER_TICK_CRON_EXPRESSION은 기존 작업을 설정하고, forecast_tick_cron_expression과 forecast_targets_json은 예측 작업을 명시적으로 선택하고 FDAI_FORECAST_TARGETS_JSON을 주입합니다. 예측 작업은 원시 틱만 게시하며 Huginn이 이를 Heimdall의 평가 및 종결을 위해 정규화합니다. automation_blueprint_cron_expression은 자동화 청사진 작업을 명시적으로 선택합니다. 이 작업은 스케줄러 ID와 상태 저장소 비밀을 재사용하며, 각 실행은 inert 후보를 제안하거나 대기 중인 검토 제안을 적용하기만 합니다. 각 대상 항목은 target_kind를 지정하고 저장소가 관리하는 기간, 신뢰수준, 샘플 하한, 적합도 하한과 일치합니다. Core는 예측 대상을 사용하지 않을 때도 이 정책을 로드하므로 정책이 없거나 형식이 잘못되면 관리되지 않는 대상 경로를 남기지 않고 시작을 차단합니다. 인벤토리 조정 작업은 코어와 같은 필수 non-secret 런타임 구성을 상속해 복구 변경분 전달 과정에서 부분 구성 없이 타입이 지정된 Event 버스 발행기를 시작할 수 있게 합니다. 스케줄러 및 analyzer 작업은 해당 작업에 연결된 user-assigned 신원의 클라이언트 id를 FDAI_MI_CLIENT_ID로 설정하므로 Azure Monitor 및 Event Hubs 토큰 획득에서 암묵적 신원 선택을 사용하지 않습니다. 이전 방식 범용 OOB 작업은 탐색 항목 지점이 소유할 때까지 범위가 제한된 inert 호환성 리소스입니다. 공개 기여자 bootstrap은 배포 소유 image가 생길 때까지 이를 생략하며, 구현된 recurring 작업은 dedicated 작업이 담당합니다. 공유 인벤토리 보강 builder는 예약 배포와 명시적으로 활성화한 로컬 새로 고침에 같은 구독 검색 경로를 제공합니다. 배포된 인벤토리 작업은 전용 Managed Identity의 구독 범위 Reader, Azure Kubernetes Service Cluster User Role 및 Azure Kubernetes Service RBAC Reader로 이를 기본 활성화합니다. 각 틱은 현재 및 이후 생성된 클러스터를 찾고 실행 형식 접근 프로필을 메모리에서 최소화하며 kubeconfig를 보관하지 않습니다. 명시적 fleet 또는 기존 연결은 범위를 좁히며 이 읽기 전용 역할은 Core, Operator 또는 Thor에 연결하지 않습니다. 같은 ID의 Reader 역할로 구독 역할 할당과 PIM 일정 인스턴스를 읽지만, 게스트와 그룹을 통해 연결된 주체를 판단하려면 테넌트 관리자 동의를 받은 Microsoft Graph 애플리케이션 권한 User.Read.All과 GroupMember.Read.All도 필요합니다. Operator API 디렉터리 동의와 마찬가지로 Terraform은 이 권한을 부여하지 않습니다. 관리자가 부여하기 전까지 모든 구독의 role_assignments 속성은 관측되지 않은 상태로 남으며, 이 속성을 읽는 규칙은 통과하지 않고 판단을 보류합니다. 관리 ID 역할 할당은 전체 계층 읽기만이 숨겨진 권한이 없음을 증명하므로 테넌트 루트 관리 그룹의 Reader도 필요하며, 구독 범위 Reader만으로는 관측되지 않은 상태로 남습니다. Public-network 프로파일에서 운영자가 realtime-inventory Event Grid 구독을 out-of-band로 복구한 경우 Terraform은 결정론적 구독을 가져오고 다음 protected 적용에서 Event 허브 대상, 전달 신원, 이벤트 필터 및 재시도 정책을 수렴시킵니다. Private-networking 프로파일은 지원되지 않는 Event Grid-to-private-Event-Hubs 경로를 만들지 않습니다. 대신 VNet-integrated 인벤토리 작업은 각 조정 후 범위가 제한된 Activity Log 복구 delta를 기본 Event 버스로 전달하며 topic-scoped 데이터 발신자 역할과 영속 멱등성 커서를 사용합니다. 비활성화된 변경 가속기는 선택적 수집 정책 항목을 읽지 않으며 해당 원본의 커서 접두사나 오래된 커서 기한도 추가하지 않습니다. 빈 cron은 해당 작업을 비활성화합니다. 기존 스케줄러 또는 analyzer 작업은 계획 전에 안전하게 가져오고 이후 이미지와 구성 변경은 같은 계획 및 적용 경로로 수렴합니다. Analyzer 작업은 기본 1분 관찰 모드 예약으로 fdai.delivery.analyzer_tick_cli를 실행하며, 발견 건마다 리소스, 신호, tick 창에서 파생된 키를 가진 정본 Event 하나를 게시합니다. FDAI_INVENTORY_DSN이 설정되면 FDAI_ANALYZER_TARGETS와 영속 인벤토리 projection의 지원 리소스를 병합하고, 병합된 집합의 중복을 제거한 뒤 프로바이더 I/O 전에 FDAI_ANALYZER_MAX_DISCOVERED_TARGETS를 적용합니다. 지원하지 않는 리소스 타입은 추측하지 않고 제외합니다. Projection을 읽을 수 없으면 coverage를 조용히 줄이지 않고 tick을 실패시켜 Job이 재시도됩니다. 인벤토리 DSN이 없으면 명시적 대상 전용 경로를 유지하고, 두 출처 모두 대상이 없으면 tick은 0으로 종료하는 정상 no-op입니다. Analyzer cron을 명시적으로 빈 문자열로 설정하면 작업이 비활성화됩니다.

제한된 egress 환경의 인벤토리 디스커버리

섹션 제목: “제한된 egress 환경의 인벤토리 디스커버리”

Preflight, 출처 우선순위, 커버리지 및 stale 유지 계약은 제한된 네트워크의 Azure 인벤토리에서 소유합니다.

다음 고객 독립적 도구를 사용해 두 배포 경로를 반복 실행할 수 있습니다.

  • fdai-up.sh는 az login 후 사용하는 단일 명령 소스 배포입니다. 어떤 clone이든 키 없이 배포하며, 무결성 서명 키가 없으면 영속 30일 Trial을, 사용할 수 있는 secrets/integrity-signing-key.pem이 있으면 전체 설치 사용권을 선택합니다. 독립적인 준비, 읽기 전용 검색, 공급자 요청, 정책 프로브 작업에는 범위가 제한된 병렬 실행을 사용합니다. Genesis 검사는 배포하는 정확한 커밋의 깨끗한 checkout만 허용하며 CI 결과를 조회하거나 GitHub CLI를 요구하지 않습니다. 명령 실행이 표시하는 각 계획을 승인하고 Foundation과 tenant 구성을 완료하며 수동 Managed Host에서 적용한 뒤 변경 없음 계획을 요구합니다. 승인, 적용, 정리, 상태, 인계 경계는 계속 직렬로 수행합니다. GitHub 저장소 구성과 workflow dispatch는 이 경로에 포함되지 않습니다. 모드 인자가 없으면 어느 작업 디렉터리에서든 자기 checkout을 배포하고, Azure 호출 전에 secrets/integrity-signing-key.pem으로 사용권을 선택하며, Azure CLI 세션이 없으면 az login을 시작하고, 키트를 빌드하거나 서명하지 않습니다. 폐기된 --signing-key 옵션은 거부합니다.
  • check-signing-key.py는 빌드나 배포가 개인 키를 사용하기 전에 후보 키를 식별합니다. 패키징된 루트의 지문, 후보가 충족하는 역할, 빌드가 요구하는 소유자 전용 보관 상태를 보고합니다. 키 자체는 출력하지 않으므로 키를 보유했을 수 있는 어느 머신에서든 안전하게 실행할 수 있습니다. --scan secrets는 clone에 전체 사용권을 선택하는 업스트림 integrity 키가 있는지 보여 줍니다. 개발 프로필은 오프라인 패키지의 완전 키트와 번들 역할에 서명자 하나를 고정하며, 라이선싱은 무결성 키를 사용합니다.
  • genesis-up.sh는 하위 수준 15단계 기반 계층 경로를 유지합니다. 점유가 있으면 검증만 재개하며 기반 계층 완료만으로 준비 상태를 주장하지 않습니다.
  • verify-azure-context.sh는 변경 전에 Azure CLI와 azd 진입점을 승인된 구독 및 테넌트 쌍에 연결하며, Genesis는 활성 CLI 선택을 바꾸지 않고 정확한 구독 결합 ARM 위치 엔드포인트로 지역 가용성을 확인하고 정책 프로브 정리는 다중 값 TSV를 순서가 있는 줄로 파싱한 뒤 부재를 증명합니다.
  • azd-up.sh는 Core 전용 dev 진단 도구입니다. 설치 경로가 아니며 공개 설치 프로그램은 이 상태를 채택하지 않습니다. provider lock을 검증하고 확인된 principal을 전달하며 소유자 전용 계획을 저장합니다. 실패한 적용은 정리된 후속 소스가 refresh-only 재확인과 별도 종료 증적을 기록할 때까지 차단되며 이전 계획은 다시 적용하지 않습니다. 정책으로 비공개가 된 기존 Key Vault는 Managed Host를 사용하는 fdai-up.sh 경로로 보냅니다. 각 적용은 대화형 터미널에 정확한 SHA-256 입력, 생성 후 20분 이내 계획, 변경되지 않은 소스 및 행위자 결합, 해결되지 않은 이전 시도 없음이 필요합니다. 비공개, 공유, 스테이징 또는 운영 배포 경로로 사용하지 않습니다. Linux x64 또는 ARM64에서 azd가 없으면 sudo 없이 SHA-256으로 고정된 공식 1.34.0 아카이브를 ~/.local/bin에 설치합니다. 기존 실행 파일은 재사용하고 업그레이드하지 않습니다. 다운로드, checksum 또는 경로 실패는 프로비저닝 전에 중단하며 wrapper 자신의 PATH만 변경합니다.
  • onboard.sh와 set-gh-actions-config.sh는 기존 저장소 자동화 도구입니다. 공개 대상 환경 배포에서는 호출하지 않습니다.
  • register-runner.sh는 기존 run-command 복구 도구입니다. Genesis는 대신 Bastion을 통한 SSH 표준 입력으로만 등록 자료를 전달합니다.
  • check-runner-storage-posture.sh는 크기와 임시 배치를 확인하고, teardown-env.sh는 환경 destroy를 보호합니다. 두 도구 모두 ops 허브나 상태 계정을 변경하지 않고 안전하지 않은 실행기 저장소 또는 할당 해제를 차단합니다.
  • check-runner-terraform.sh는 공유 login-deploy-identity.sh 도우미 안에서 첫 Azure 호출 전에 실행됩니다. 실행기의 Terraform이 검증된 1.16.1보다 오래되었으면 보호된 워크플로를 거부합니다. Genesis 이미지 실행기는 이제 Terraform 1.16.1을 고정해 이 기준을 충족하며, 이전 이미지로 만들어진 등록된 실행기는 러너 이미지 plan과 apply를 다시 실행해야 올라간 고정 버전을 반영합니다.

환경별 상한은 운영 배포 강화에서 소유합니다.

  • 카탈로그 + 포크 리포에 범위된 설치된 GitHub App 또는 서비스 커넥션을 가진 GitOps 호스트 (GitHub 또는 Azure DevOps 조직).
  • 사람 승인(hil 경로)을 위한 그룹-연결 팀이 있는 Teams 테넌트. Teams가 기본 A1 채널입니다. 자세한 내용은 channels-and-notifications-ko.md를 참조하세요.
  • FDAI Slack 앱이 설치되고 필수 Slack userId ↔ Entra OID 매핑 저장소가 프로비저닝된 Slack 워크스페이스; P1 Slack A1 채널에 필요 (채널별 Slack 필수 조건).
  • 서명 + 증명 저장을 지원하는 컨테이너 레지스트리 (ACR 또는 외부 레지스트리).
  • OpenTelemetry 백엔드: Log Analytics workspace에 Application Insights를 바인딩합니다. 포크는 텔레메트리 프로바이더 계약을 통해 백엔드를 교체할 수 있지만 Azure day-zero 인벤토리에서는 이 선택을 열어 두지 않습니다.
  • infra/의 IaC(project-structure-ko.md 참조)가 시작점입니다. 모든 환경은 동일한 코드에서 환경별 매개 변수와 격리된 상태를 사용해 동일한 방식으로 프로비저닝됩니다. Terraform은 기본 Event Hub 이름을 event_bus_topics로, 보조 단계, 승인 및 인벤토리 수신 이름을 event_bus_auxiliary_topics로 제공합니다. 이를 통해 로컬 런타임 준비 과정에서 프로비저닝된 토픽에만 연결하도록 합니다.
  • 진입 명령: fdaictl provision azure는 infra/의 HCL 모듈을 사용하는 Terraform 실행을 조정합니다. 환경별 값은 소스 제어 외부에서 관리합니다. 소스 모드에서 독립 실행형 조정기는 소스 스냅샷 고정 -> 대상 검사 -> Foundation 계획 및 적용 -> 배포 레지스트리에서 이미지 빌드 -> 애플리케이션 계획 및 적용 -> 프로비저닝 후 검사 순서로 실행합니다. --offline-kit을 사용하면 먼저 서명된 패키지를 검증합니다. 기존 오프라인 설치의 작업 디렉터리에서 최신 패키지로 명령을 다시 실행하면 유지된 리비전을 기준으로 Foundation 작업을 계속 진행합니다(오프라인 키트 업그레이드). Terraform은 계속해서 실행 엔진이자 인프라의 단일 기준 정보원으로 사용됩니다.
  • 테넌트 배포 전송 방식은 항상 manual입니다. 현재 활성화된 Azure 사용자가 정확한 실행 계획을 승인하고, 관리형 호스트가 별도의 워크로드 ID를 사용해 해당 계획을 실행합니다. 저장소 변수, 저장소 비밀, GitHub Environment, workflow dispatch, GitHub runner는 이 과정에 참여하지 않습니다.
  • 동일한 서명된 이미지를 dev → staging → prod 순서로 승격합니다. 환경별로 이미지를 다시 빌드하지 않습니다(deployment-ko.md).

리소스 명명 규약(Resource Naming Convention)

섹션 제목: “리소스 명명 규약(Resource Naming Convention)”

리소스 명명 및 태깅 계약은 배포 리소스 규약이 소유합니다. 이 집중 문서는 CAF 접두사, 결정론적 길이 처리, fdai: 태그 네임스페이스, 배포 공급 태그, fdai:managed=true 소유권 경계를 정의합니다. 이 제목은 기존 링크의 안정적인 대상으로 유지합니다.

Azure 리소스 인벤토리 (최소 세트)

섹션 제목: “Azure 리소스 인벤토리 (최소 세트)”

인벤토리는 비용 효율을 우선해 의도적으로 최소화했습니다. 아래의 모든 선택은 이 문서 끝의 비용 효율 원칙을 따릅니다. 인벤토리는 csp-neutrality-ko.md에 정의된 네 가지 CSP 중립 계약(이벤트 버스, 런타임, 시크릿, 워크로드 신원)에서 도출하며, 현재 각 계약의 구현은 Azure입니다. 구체적인 계층 값, 정확한 이름, 지역, 앱별 복제본 상한은 배포별로 조정하되 전체 구조는 일관되게 유지합니다.

#리소스티어목적노트
1AKS Standard 클러스터승인된 프로파일에 따라 크기를 정한 시스템 및 사용자 노드 풀신규 설치의 기본 컴퓨팅 호스트API Server VNet Integration, 워크로드 신원, Azure Policy, 관리형 Key Vault CSI, 워크로드 및 API 서버 전용 서브넷이 기본 프로파일에 포함됩니다.
2Kubernetes 워크로드 (5개 독립 서비스)측정 결과로 확장 구성을 바꾸기 전까지 장기 실행 기본 서비스마다 replica 2개Core, Operator, 수집, 처리, 실행 소유권 분리typed Deployment, Service, ServiceAccount, HPA, PDB 및 NetworkPolicy 리소스가 미리 빌드하고 서명한 이미지 digest를 사용합니다. Isolated Executor만 효과 권한을 보유합니다.
3Kubernetes CronJob프로파일로 제한한 일정과 동시 실행예약 probe, 정확한 범위의 WARA 관찰 모드 평가 및 out-of-band 변경 감지각 작업은 전용 워크로드 신원과 제한된 이력, 재시도 및 active deadline을 사용합니다.
4Event Hubs 이름 공간 샤드Standard 2개 (각 1 TU, auto-inflate off)Kafka-와이어 이벤트 버스 (:9093 엔드포인트)기본은 통제된 유입, DLQ, 사람 승인 및 단계를 소유합니다. Operational은 canary + DLQ, 전용 synthetic 시작 round-trip, raw 인벤토리, 실행기 명령 + DLQ 및 실행기 증적 개체를 소유합니다. Core는 배포 구성을 통해 operational 초기화 엔드포인트와 시작 토픽을 받습니다.
5Event Grid 인벤토리 system 토픽 + 구독 + Diagnostic Settingsglobal 구독 이벤트 전달 / Log AnalyticsResource 쓰기/삭제를 fdai.inventory.raw로 보내고 플랫폼 진단을 workspace로 보냄Terraform은 Azure 정본 lowercase 타입으로 tracked 토픽 하나를 adopt하고 send-only 인벤토리 UAMI를 할당하며 dedicated system-topic 구독 API를 사용합니다. 발견이 모호하면 계획을 차단합니다.
6PostgreSQL Flexible ServerDev: Burstable B1ms, HA 비활성, 7일 백업; prod: zone-redundant HA, 35일 geo 백업감사 + KPI + 패턴 라이브러리 + pgvector T1 임베딩, 단일 저장Terraform은 vector와 pg_trgm을 허용 목록하고 운영은 ZoneRedundant HA를 요구하며, 로컬 Compose는 별도 bind-mounted initializer 없이 같은 Alembic-owned vector 확장을 사용합니다.
7Key VaultStandard관리형 Key Vault CSI 공급자 + 워크로드 신원으로 동기화하는 시크릿 백엔드 - 시크릿 계약 구현Premium(HSM)은 필요하지 않으며 앱은 시크릿 SDK를 호출하지 않습니다.
8User-assigned Managed Identity-실행기와 별도 범위의 읽기 신원, 워크로드 아이덴티티 계약 구현실행기는 작업 허용 목록을 유지합니다. 인벤토리와 RCA는 서로 다른 읽기 전용 신원을 사용합니다. Split 서비스 hydration은 선택적 platform 출력이 없으면 비활성 기본값을 유지하고, 값이 있으면 platform이 내보낸 RCA reader만 허용합니다.
9Log Analytics workspace + Application InsightsPay-as-you-go, 기본 30일 보존traces / metrics / logs / audit-forwardappi-* 리소스가 workspace에 바인딩되며 보존은 배포 후 UI에서 설정 가능
10Container Registry (ACR)공개 기본 구성은 Basic, Private Link 또는 네트워크 격리 선택 시 Premium미리 빌드하고 서명한 이미지 + 출처테넌트 배포는 변경 없는 digest를 미러링하거나 반입하며 이미지를 빌드하지 않습니다.
11Azure OpenAI 계정 + Foundry 계정/project (명시적 선택, var.enable_llm)StandardT1 임베딩 + T2 mixed-model 배포 및 100K TPM의 전용 GPT-4.1-nano 웹 검색 프롬프트 에이전트프로비저닝에는 deployer 권한과 리전 계열 용량이 필요하며, 그렇지 않으면 해당 기능이 hil-only로 강등됩니다. dev-and-deploy-parity-ko.md § 배포자-스코프 LLM 프로비저닝을 참조하세요. Terraform은 OpenAI 기능이 하나 이상 해석될 때만 Azure OpenAI 계정을 만들며 파트너 전용 해석은 사용할 수 없는 OpenAI 계정 할당량을 요청하지 않고 Foundry를 유지합니다. Foundry project 호출자에는 Azure AI Developer를 부여합니다. 보호된 웹 검색 단계는 정확한 도메인 허용 목록과 실제 도구 준비 상태 확인을 유지합니다. 비공개 모드는 privatelink.services.ai.azure.com을 추가하며 테넌트 정책이 소유하는 거부 ACL 세부 정보는 Terraform이 보존합니다.
12ADLS Gen2 문서 계정 (명시적 선택, enable_document_ingestion)StorageV2 Standard ZRS, HNS비공개 격리 구역, 변경할 수 없는 통제된 버전, derived 묶음비공개 모드에서 Shared Key와 공개 접근 비활성화; soft 삭제 + 수명 주기; blob과 dfs 비공개 엔드포인트
13Case-history Blob 계정 (enable_case_history)StorageV2 Standard ZRS재생 및 통제된 Norns 분석용 내용 기반 주소를 가진 prediction/인시던트 사례 개정 번호Shared Key 비활성화, 비공개 컨테이너, versioning, 변경 피드, soft 삭제, 범위가 제한된 old-version 수명 주기, Defender scanner private-link 접근, 전용 case-history UAMI 데이터 역할, blob 비공개 엔드포인트. 실행기 MI에는 Blob 역할을 부여하지 않습니다.
14문서 수집 Deployment (명시적 선택)AKS의 공개 API + ClamAV를 포함한 내부 워커인증된 범위가 제한된 업로드 중계와 독립적으로 확장하는 안전성 검사, 추출, pgvector 인덱싱 및 수명 주기 이벤트API, 워커 및 마이그레이션 신원을 분리합니다. 워커만 Event Hubs와 OCR에 접근하며 런타임 신원에는 실행기 권한이 없습니다.
15운영 이력 archive + lifecycle CronJob (명시적 선택)비공개 versioned Blob 저장소 + 예약 AKS 작업checkpoint, archive, 검증, restore sample, hold, 저장소 압력 및 database gate 기반 purge 조정예약 실행은 인벤토리 신원을 사용하는 관찰 모드-only입니다. enforce와 certify는 외부 증적을 요구하며 certify만 database purge gate에 도달할 수 있습니다.
16Control-loop canary CronJob5분마다 실행fdai.control.canary에 멱등 이벤트 하나를 게시합니다.전용 워크로드 신원에는 ACR pull과 Event Hubs 전송만 있으며 Core는 별도 소비자 경로에서 no-op 감사를 기록합니다.
17개발 operations Function App (명시적 선택, enable_dev_operations_gateway)Flex Consumption FC1로컬 개발에서 비공개 리소스로 등록된 읽기, 쓰기, execute 연산을 중계합니다.dev 및 private-networking 전용이며 수명 주기 precondition으로 강제되고 infra/tests/dev_operations_gateway.tftest.hcl이 이를 검증합니다. Easy Auth 뒤에서 공개 인바운드 엔드포인트를 종단합니다. 개발자가 도달해야 하기 때문이며, 따라서 폐쇄망에서는 꺼둔 채로 둡니다. 전용 /27 서브넷, 비공개 AAD-only 배포 및 멱등성 저장소, Easy Auth, 분리된 읽기 담당/실행기 UAMI, 일회용 server-issued 변경 계획 증적을 사용합니다. 임의 URL, ARM 경로, 명령, 조회 표면은 제공하지 않습니다.
18OHL scale-out evidence VM Scale Set + proposal Job (명시적 선택, enable_ohl_scale_out_evidence_target)Uniform Standard_B1s, 용량 1, manual Consumption Job통제된 ops.scale-out 근거용으로 범위가 제한된 non-production target 및 normal-ingress 관찰 모드 proposaldev, 비공개 networking 및 operations gateway가 필요합니다. 배포는 region에서 사용할 수 있는 exact image version을 공급하고 변경 가능한 latest를 거부합니다. 전용 /27 subnet에는 public IP가 없습니다. Proposal UAMI에는 ACR pull과 primary Event Hub send만 있습니다. Protected provider staging은 검증된 rollback 전에 capacity를 2까지만 늘릴 수 있습니다.
보호된 history- 요청 모드는 운영 이력 및 의사 결정 근거 저장소, 해당 비공개 endpoint,
runner의 기존 Blob DNS 영역에 대한 계정별 태그 없는 A record, 읽기 전용 연결 및 독립 선언한 root Job만 대상으로 지정합니다. Job 종속성은 공용 접근이나 storage key 인증 없이 비공개 readback을 포함합니다. Exact apply는 bot-owned protected-operation workflow가 다시 전달하므로
FDAI 유지관리자는 별도 Environment approver로 남습니다. 안정적인 resource ID와 versionless Key Vault secret
URI는 관련 없는 compute drift를 제외합니다. 저장소에 바인딩된 deploy UAMI로 인계할 때는 동일 범위의
archive Storage Blob Data Owner 역할을 먼저 만들고 이전 역할을 제거합니다. 정확히 같은 역할 할당이
Terraform state 외부에 이미 있으면 계획 전용 조정 단계에서 저장소 범위, deploy UAMI principal 및 역할이
모두 일치하는지 확인한 후에만 가져옵니다. 범위가 제한된 적용 후 검증은 관련 없는 inventory image drift를
검사하지 않습니다. 다른 교체는 계속 차단하며 이후 계획이 리소스를 보존하도록 초기 계획 전에 ENABLE_OPERATIONAL_HISTORY=true를 설정합니다.
로컬 parity 프로필은 동일한 5개 service package를 loopback PostgreSQL과 Redpanda,
filesystem-backed 문서 object 및 ClamAV에 연결해 시작합니다. Plaintext Kafka는 loopback broker에서만
사용합니다. 배포 모듈은 service-owned managed identity와 service-specific PostgreSQL role을 사용하는
Event Hubs Kafka를 계속 요구합니다.
활성 로컬 런타임은 port 5432의 pgvector/pgvector:pg16을 사용합니다. 별도 volume을
가진 port 5433의 두 번째 로컬 pgvector/pgvector:pg16 cluster는 파괴적 migration 검증에만
사용합니다. Alembic이 관리하는 role이 PostgreSQL cluster-global이기 때문입니다. 로컬 런타임
준비는 전용 검증 DSN을 생성하고 detached 중앙 검증은 해당 DSN만 통합 테스트에 매핑합니다.
두 번째 cluster는 로컬 검증 의존성이며 위 Azure 리소스 인벤토리에는 포함되지 않습니다.
추가 신원/채널/콘솔 요소는 배포 또는 명시적 선택 기능이 소유합니다:
  • App 등록 × 3 - 오디언스 분리 (user-rbac-and-identity-ko.md#41-app-registrations): fdai-console-spa (SPA 사인인, PKCE), fdai-api (콘솔 + ChatOps 백엔드용 Web API 오디언스), fdai-approval-bot (Teams SSO). 어느 것도 실행기 신원을 보유하지 않습니다. 단계별 az 생성: ../runbooks/entra-app-registration-ko.md. 콘솔 적용 후 deploy 작업 흐름은 Terraform이 출력한 Static Web App 출처를 대상 테넌트의 SPA redirect URI에 안전하게 재시도 가능한 방식으로 동기화합니다. 테넌트가 일치하지 않거나 Graph 권한이 없으면, 사인인할 수 없는 콘솔을 배포하지 않도록 배포를 차단합니다.
  • Entra 보안 그룹 × 5 - aw-readers, aw-contributors, aw-approvers, aw-owners, aw-break-glass. 배포 소유이며 objectId는 구성으로 주입되고 시작 시 검증 (user-rbac-and-identity-ko.md#42-security-groups-slots).
  • Conditional 접근 정책 - aw-approvers/aw-owners에 phishing-resistant MFA, aw-owners에 compliant-device, aw-break-glass에 전용 하드웨어 토큰 + 사인인 알림. Entra ID P1에서 이용 가능 (user-rbac-and-identity-ko.md#43-conditional-access).
  • Azure Bot: 승인 봇은 배포 소유로 유지합니다. 독립 시스템 지식 서비스 root는 보호된 workflow를 통해 항상 UAMI, 비공개 Blob claim container 및 HTTPS endpoint를 만들며 Bot Framework는 F0 Bot과 Teams channel을 추가합니다. Outgoing Webhook은 Bot 또는 Graph resource를 추가하지 않고 endpoint bootstrap 후에만 Teams가 발급한 HMAC key를 Key Vault에서 결속합니다. 플랫폼 document_blob 진단 설정은 재사용하는 claim storage account에도 계속 적용됩니다.
  • 서명된 사람 승인 웹훅 - 운영은 CI 시크릿으로 URL과 32자 이상의 HMAC 시크릿을 제공합니다. Terraform은 둘 다 Key Vault에 저장하며, 코어는 URL과 시크릿을 읽고 Operator API에는 콜백 시크릿만 전달합니다. 그룹 연결 승인 팀과 채널은 Core와 Operator가 공유하는 별도 배포 슬롯이며 RBAC 그룹 id는 역할 배정에만 사용합니다.
  • Topic-scoped Event Hubs 역할 - 실행기는 이름 공간이 아니라 현재 프로비저닝된 각 허브 개체에 데이터 Owner를 받습니다. 인벤토리와 canary는 각자의 토픽에만 전송할 수 있습니다. Operator API 명령 신원은 제안, 사람 승인 결정, pantheon 객체 메시지를 전송하고 단계 토픽을 수신합니다. 문서 인제스트 API와 워커 신원은 fdai.pantheon.objects로만 전송할 수 있으며, 워커는 통제된 단계 명령을 위해 같은 토픽을 수신할 수도 있습니다.
  • Static Web Apps (Free 계층, 명시적 선택) - enable_console=true일 때 읽기 전용 콘솔을 호스팅합니다.
  • Design-mocks Static Web App (Free 계층, 명시적 선택) - enable_design_mocks=true일 때 격리된 정적 디자인 검토 아티팩트를 호스팅합니다. 아티팩트 빌더는 index.html, mocks/, examples/, 공유 에이전트 icon에서 허용된 브라우저 자산만 복사합니다. Static Web Apps 인증은 익명 요청을 Microsoft Entra ID로 리디렉션하고 초대된 reviewer 역할 구성원만 허용합니다. 보호된 exact-apply 작업 흐름은 Terraform 소유 리소스에서 배포 토큰을 읽고 마스킹한 다음 exact-version Static Web Apps CLI에 SWA_CLI_DEPLOYMENT_TOKEN 환경변수로만 전달합니다. 작업 흐름은 허용 목록 아티팩트를 게시하고 인증 리디렉션을 확인합니다. 토큰은 커밋하거나 저장소 시크릿으로 저장하지 않습니다. 이 경로는 module.design_mocks만 대상으로 하며, 해당 모듈 외부의 리소스 변경이 계획되면 차단하고 코어 canary와 다른 런타임 조정을 건너뜁니다.
  • 워크로드 신원 federation - CI/CD 단명 OIDC 토큰; 리소스 아님, 비용 없음.

enable_document_ingestion=true는 enable_llm=true, resolved t1.embedding 기능, 콘솔 API 대상, Entra RBAC 그룹 id 5개, 명시적인 인제스트 CORS 출처와 함께 설정합니다. Terraform은 다음 항목을 프로비저닝합니다.

  • 별도 API, 워커, 이행 UAMI와 역할 범위로 제한된 PostgreSQL DSN. API는 단계를 게시하지만 소비하지 않으며 워커만 단계 수신과 선택적 Document Intelligence OCR 권한을 가집니다.
  • HNS, documents와 derived 파일 시스템, 수명 주기 컨트롤, Shared Key 비활성화와 Terraform-owned Defender scanner private-link 접근을 적용한 StorageV2 계정
  • blob 및 dfs 비공개 엔드포인트. App VNet은 엔드포인트 영역에 링크하고, ops 실행기는 기존 central Blob 영역의 A 기록으로 Blob을 해석합니다. DFS 영역은 두 VNet에 링크합니다. 이 방식은 한 VNet을 같은 이름 공간의 중복 영역에 링크하지 않습니다.
  • 공개 인제스트 API Container App과 replica-local ClamAV를 포함한 내부 워커 앱. Initial 전환은 롤백용 exact 빈 이전 방식 sidecar 탐색만 스냅샷할 수 있고 새 개정 번호는 계속 strict 탐색 3개를 요구합니다.
  • 트래픽 전에 문서 메타데이터와 pgvector 스키마를 적용하는 수동 이행 작업

deploy-dev 작업 흐름은 deploy_document_ingestion 입력을 제공합니다. 기본 동작은 계획이며, 적용은 이행 작업을 실행합니다. 독립 서비스 적용도 Key Vault admin DSN을 마스킹하고 가지를 적용하며 트래픽 전에 PostgreSQL PGOPTIONS로 declared 역할을 강제합니다. 두 개정 번호를 검증한 뒤 ingestion_gateway_fqdn을 출력합니다. Console은 VITE_INGESTION_API_BASE_URL=https://<fqdn>으로 빌드합니다. 운영 게이트는 비공개 networking과 digest-pinned FDAI 및 ClamAV 이미지를 요구합니다.

문서 OCR은 별도의 보호된 작업을 사용합니다. preserve는 이전에 적용한 공급자와 Document Intelligence 리소스 상태를 유지합니다. use_local_retain은 Azure를 삭제하지 않고 워커를 로컬 kor+eng Tesseract로 전환하고, use_azure_provision은 비공개 Document Intelligence 계정을 프로비저닝하거나 유지하며, deprovision_use_local은 제거 전에 로컬 OCR을 선택합니다. 설정에서 시작한 plan-ocr-<proposal>-<digest> 요청은 Terraform 변수를 설정하기 전에 PostgreSQL의 최종 제안, 정책 및 계획 요청 기록과 대조합니다. 기본 동작은 계획이며 정확한 적용에는 보호된 환경의 별도 승인이 계속 필요합니다. 독립 실행형 모듈은 AzureRM ~> 4.14를 고정하며 커밋된 공급자 잠금 파일은 반복 가능한 모듈 테스트에서 확인한 공급자 릴리스를 기록합니다. Workflow는 OCR desired-state 축약을 집중 script에 위임하여 승인 또는 apply gate를 바꾸지 않으면서 보호된 Job을 검토된 line 및 step budget 안에 유지합니다.

공개 Static Web App은 ADLS에 직접 접근하지 않습니다. Storage 계정을 비공개로 유지하기 위해 인증된 게이트웨이를 통해 스트림합니다. 게이트웨이는 ADLS, Event Hubs, Azure OpenAI에 Managed Identity를 사용하며 연결 문자열 또는 Storage 계정 키를 만들지 않습니다.

첫날에 프로비저닝되지 않음 (측정된 필요가 정당화할 때 후속 단계로 연기):

  • Service Bus 이름 공간과 Event Grid 커스텀 토픽 - 이벤트 버스는 Event Hubs의 Kafka 엔드포인트 (csp-neutrality-ko.md § 이벤트버스 계약); 인벤토리 쓰기/삭제용 subscription-scoped Event Grid 구독은 기본 배포되지만 별도 custom 토픽은 만들지 않습니다.
  • 전용 vector 데이터베이스 (PostgreSQL 내부 pgvector가 초기 스케일에서 충분).
  • Front Door, 애플리케이션 게이트웨이, API 관리 (공개 인바운드 엔드포인트 없음; 콘솔은 읽기 전용 정적 호스팅).
  • DR용 secondary-region 리소스 (단계 4 - TBD; 구현 Focus 참조).

Compute 형태 (현재 Core와 5개 서비스 목표)

섹션 제목: “Compute 형태 (현재 Core와 5개 서비스 목표)”

현재 control-loop Core는 서명된 이미지와 Python 프로세스 하나로 배포됩니다. 5개 서비스 목표는 내부 Isolated 실행기를 추가하고 전환에서 Core의 실행기 역할을 제거합니다. Operator, 인제스트 API, 인제스트 워커는 별도이며 이전 토폴로지는 롤백 산출물입니다. 모든 게이트는 실행 계획에서 추적합니다.

  • 런타임: python -m fdai가 Kafka 소비자를 시작하고 라우팅, quality, risk, 감사 단계를 구성합니다. fdai-isolated-executor는 기본적으로 관찰 모드-only입니다. 명시적 전환은 고정된 Core 증적 소비자 그룹, versioned 명령/증적 전송 계층, 기존 guarded direct-API 실행기 및 전용 게이트웨이 호출자 신원을 사용합니다. 배포 venue와 RUNTIME_ENV는 독립적으로 유지합니다.
  • Health: Core는 내부 /live와 /ready, 인제스트 API는 /healthz, 내부 워커는 /live와 /ready를 사용합니다. Isolated 실행기도 FDAI_ISOLATED_EXECUTOR_HEALTH_PORT에서 내부 /live와 /ready 계약을 사용합니다.
  • Core 시작 왕복: 독립적인 Core는 synthetic 시작 기록을 publish하기 전에 고유 operational Event Hubs 소비자 그룹의 결합을 12초 동안 기다립니다. 탐색별 기한은 30초이고 단계 기한은 75초이므로 기본 시도 2회를 위한 범위가 제한된 headroom을 확보합니다. 배포는 이 순서가 보장된 값을 조정할 수 있지만 자신이 publish한 exact 기록을 consume하지 못하면 탐색은 준비된 상태가 되지 않습니다.
  • 복제본 하한: 기본값은 복제본 하나입니다. 검증된 Kafka scaler 없이 0으로 설정하면 Event Hubs 데이터로 깨어나지 않으므로 Terraform은 scale-to-zero를 주장하지 않습니다.
  • 분리 기준: 목표는 Core, Operator, 인제스트 API, 처리 워커, Isolated 실행기이며 권한 전환은 서비스 승격과 데이터 소유권의 모든 게이트를 따릅니다.
  • 신원 분리: Operator API 읽기/명령과 인제스트 API/워커/이행 principal을 분리합니다. 워커는 fdai.pantheon.objects에서 Saga/Muninn 객체만 수신하고 fdai.pipeline.stages로 단계 사실을 전송합니다. ingestion_cohost_worker=true는 두 범위를 API 신원으로 돌립니다.
  • 교차 테넌트 SharePoint: sharepoint_connector_enabled=true는 FDAI-native 커넥터를 활성화합니다. Azure 인제스트 UAMI가 Microsoft 365 테넌트에 등록된 애플리케이션에 federated assertion을 제공하고, 관리자 동의 후 이 애플리케이션이 Microsoft Graph 토큰을 발급합니다. 루트 조립은 대상 테넌트, 애플리케이션, 사이트, 드라이브, redirect 허용 목록, 서버 소유 문서 정책만 문서 인제스트 모듈로 전달하며 커넥터 상태를 직접 구성하지 않습니다. 보호된 서비스 workflow는 명시적인 sharepoint_connector_transition을 요구하고 정확한 활성화 또는 비활성화 환경 차이를 plan 번들에 봉인합니다. Power Platform은 배포하거나 호출하지 않습니다.
  • 실행기 배포와 전환: enable_isolated_executor=true는 내부 앱과 ACR pull, 명령 수신, 증적/DLQ 전송, state-secret 읽기만 가진 전용 UAMI를 프로비저닝합니다. 기본값은 false이며 private-runner 작업 흐름은 기본 plan-only를 유지합니다. 모델 검증 또는 격리 실행기 이미지 연결에 gh가 필요할 때 checksum이 고정된 GitHub CLI를 설치합니다. Terraform 초기화나 ACR 명령 전에 정확한 GHCR 주체 다이제스트를 해석하고 --bundle-from-oci, --source-digest로 선택한 출처 개정 번호, SLSA v1 조건식, 저장소의 container-supply-chain.yml 서명자를 사용해 레지스트리에 저장된 OCI 묶음만 검증합니다. GitHub API 묶음 대체 경로는 없으며 Docker 인증은 소유자 전용 권한의 임시 파일에만 보관하고 종료할 때 삭제하며, 검증이 실패하면 연결 값을 기록하지 않습니다. Embedded plan-metadata 코드를 syntax-check하고 ghcr.io/<owner>/<repo>/fdai-core-control-plane의 Core 산출물 증명을 검증합니다. ACR 가져오기 API가 요구하는 호스트 전용 ghcr.io 레지스트리 URI를 전송한 뒤 동일한 ACR 다이제스트를 연결하고 최신 개정 번호를 상태 검사에 포함합니다. 연결은 가져오기 전에 ACR 리소스 ID를 검증하고 레지스트리 조회, 가져오기 수락, 다이제스트 확인에 대해 내용이 없는 진행 상태를 내보냅니다. 실행 가능한 가짜 경계 검사는 자격 증명을 노출하지 않으면서 성공한 연결, 잘못된 ACR 신원, 가져오기 실패를 확인합니다. promote_runtime_image=true는 재구축 없이 검증된 다이제스트를 ACR fdai 저장소로 가져오기하지만 exact 적용은 승격을 거부하고 protected 계획만 사용하며 convergence에도 같은 런타임 다이제스트를 복원합니다. enable_isolated_executor_authority_cutover=true는 개발 operations 게이트웨이도 요구하며 Core의 게이트웨이 및 버티컬 효과 접근을 제거하고 isolated 신원을 승인하며 Core에는 전송 계층/읽기 접근만 유지합니다. verify_executor_effect=true는 non-interactive 실행기에서 명시적 pseudo-terminal을 통해 reversible NSG 룰 탐색을 실행하고 원격 exit 상태를 보존합니다. 중복 전달은 변경할 수 없는 액션 및 명령 신원을 유지하도록 하나의 issued-at 시각을 공유하고 정리는 새 범위가 제한된 기한을 받습니다. Azure Resource Manager에서 효과를 확인하고 중복 쓰기를 차단하며 오프셋과 최종 증적을 기록한 뒤 정리합니다. 900초가 지나면 실패합니다.
  • OHL evidence target: enable_ohl_scale_out_evidence_target=true는 dev에만 전용 Uniform VM Scale Set 하나와 manual proposal Job 하나를 추가합니다. 비공개 networking, development operations gateway, exact OHL_SCALE_OUT_EVIDENCE_IMAGE_VERSION, retry-stable OHL_SCALE_OUT_EVIDENCE_CAMPAIGN_ID, human OHL_SCALE_OUT_EVIDENCE_INITIATOR_PRINCIPAL_ID, non-secret OHL_SCALE_OUT_EVIDENCE_SSH_PUBLIC_KEY이 필요합니다. Protected platform workflow가 target, subnet, proposal UAMI 및 Job을 소유하며 evidence 실행 전에 service-deploy가 exact revision Core 및 Executor image를 독립적으로 rollout합니다. Job을 시작하면 normal ingress를 통해 관찰 모드 proposal 하나를 게시하며 provider-effect 권한은 없습니다.

프로비저닝은 IaC로 수행하지만 첫 실제 이벤트를 받기까지의 논리적 부트스트랩 순서는 지켜야 합니다. 앞 단계가 실패하면 중단하고 수행한 작업을 되돌립니다. 실패한 단계를 남겨 둔 채 다음 단계로 진행하지 않습니다.

부트스트랩 순서. 주요 단계는 전제조건 해결됨, IaC로 핵심 리소스 프로비저닝, 실행기 관리 ID 생성 및 범위 지정 역할 할당, 미리 빌드하고 서명한 이미지를 AKS에 shadow-only로 배포, 프로비저닝된 Postgres에 alembic upgrade head 실행, Diagnostic Settings 및 Kafka 토픽 전달기 연결, day-zero 규칙 세트로 규칙 카탈로그 시드, HIL 승인자 및 ChatOps 채널 등록, 배포 후 스모크 테스트 실행, 시스템이 준비됨; 첫 실제 이벤트 도착 가능입니다.

  • 첫 배포에서 관찰 모드-only: 어떤 규칙/액션도 절대 강제 적용 모드로 시작하지 않음. 승격은 별개의 행위 (rule-governance-ko.md).
  • 첫 컨트롤 루프 틱 전에 마이그레이션이 반드시 실행되어야 함. 워크로드 컨테이너는 시작 시 마이그레이션을 실행하지 않습니다(복제본 간 일관성 유지 + race 방지). CI는 격리된 서비스 데이터베이스에 서비스 소유 마이그레이션을 적용하기 전에 root rollback 검사를 실행하고, 이어서 해당 서비스 헤드에서 서비스 의존 검사를 실행합니다. alembic/versions/의 모든 tracked 이행은 downgrade()를 정의하지만 스키마와 데이터 rollback은 파괴적일 수 있으므로 백업과 복원 및 각 이행의 downgrade를 staging에서 예행 연습합니다. 보호된 경로는 연결 10초, database 잠금 5분, server statement 15분, 전체 migration 단계 20분의 deadline을 사용합니다. Database는 서비스 계획을 적용하기 전에 예산을 초과한 DDL을 취소하고 잠금을 해제합니다.
  • 권위 있는 카탈로그는 마이그레이션 후 정확히 검증된 Core 이미지에서 적재합니다. 구체화 Job은 큰 불변 프로젝션을 위해 PostgreSQL 문 제한 시간을 5분으로 설정합니다. 관리 평면의 사전 이미지 바인딩이나 사전 실행은 digest 고정 이미지와 최신 실행 성공을 readback으로 입증할 때만 허용합니다. 그런 다음 VNet runner는 성공을 보고하기 전에 리포지토리의 모든 예상 프로젝션을 PostgreSQL과 비교합니다. 보호된 모델 Settings workflow는 모델 projection을 새로 고치고 런타임 Settings 행이 없을 때만 생성하며, 기존 런타임 근거를 보존하고 읽기 전용 트랜잭션에서 환경에 결속된 두 행을 검증해 새 Console에서 설정 컨트롤을 표시할 수 있게 합니다. 런타임 Settings 구체화는 공유 RUNTIME_SETTING_SPECS의 모든 항목을 열거하며, 변환 결과를 한 설정 그룹으로 제한하지 않고 검증된 각 환경 값과 가용성 필드를 보존합니다. 운영 근거 발급이 활성화되어 있으면 제한 시간 안에서 검증기 준비 상태 엔드포인트도 한 번 읽으며, 응답이 없거나 형식이 잘못되면 모든 운영 근거 목적을 사용할 수 없는 상태로 둡니다.
  • Cost Governance 프로필과 배포 후 검사: plan-cost-*와 apply-cost-* 요청 식별자는 패키지 활성화 또는 작업 모드를 바꾸지 않고 정확한 다이제스트 고정 Cost Governance 이미지를 Core와 두 작업에 연결합니다. 배포 후 smoke 테스트와 합성 카나리는 operating-and-verification-ko.md에 계속 정의됩니다.

업스트림 저장소는 모든 것을 고객 비종속적으로 제공합니다. 다운스트림 배포판은 core/를 편집하지 않고 의존성 주입으로 기능을 제한하거나 확장할 수 있습니다. 배포는 소스 제어 밖에서 환경 값, 신원, 시크릿 참조, 승격 상태를 제공합니다. (generic-scope.instructions.md).

관심사업스트림 분포다운스트림 customization배포 구성
IaC 모듈Parameterized 모듈선택적 모듈 오버레이환경 tfvars, 상태, 시크릿 참조
프로바이더 어댑터프로토콜 및 Azure 구현DI를 통한 선택적 replacement엔드포인트 및 신원 연결
Rule 카탈로그범용 시드 및 스키마추가 룰 및 정책 오버레이배정, exemption, 승격 상태
사람 승인 및 RBAC역할 및 승인 계약선택적 채널 어댑터Entra 그룹, 채널 id, 승인자 연결
모델기능 레지스트리 및 해석기선택적 프로바이더 어댑터 또는 선호 설정 오버레이resolved 엔드포인트, 할당량, 지역, 신원
런타임 값 및 기능 라이선스검증된 키 스키마, 서명 토큰 계약, 패키지 공개 키 및 Trial 상한테넌트 값 없음, 선택적 조립 소유 검증기 또는 더 좁은 카탈로그환경 변수와 Key Vault 참조, 버전 없는 토큰 참조와 이미지 및 배포 다이제스트 포함, 비공개 키 없음

모든 값은 런타임에 환경 변수 또는 Key Vault 참조에서 가져옵니다. 이 저장소에 환경 값을 커밋하지 않습니다. 아래 목록은 배포에 필요한 키의 스키마이며, 전체 확장 카탈로그와 기본값은 인벤토리 PR에서 작성합니다.

Console은 Settings > Runtime policies에서 안전한 설정 하위 집합을 표시합니다. 읽기 담당은 환경 값, 영속 재정의 값, 유효 값을 비교할 수 있습니다. Owner는 개정 번호 및 감사 검사를 통해 문서화된 허용 목록만 변경할 수 있습니다. IRP, analyzer, 인벤토리 최신성 및 보존 틱 변경은 다음 이벤트 또는 작업 경계에서 동적으로 적용됩니다. 로깅 수준과 사례 보존 또는 삭제까지의 일수 변경은 headless 런타임 재시작이 필요합니다. 배포 신원, 전송 계층, 엔드포인트, 시크릿, 승격 및 test-only 키는 editable 표면에 포함되지 않습니다. Incident 자동 열기 설정도 시작 시 적용됩니다. 구체화 과정은 검증된 기본 최소 심각도 MEDIUM을 표시하며, 환경 값이나 감사를 거친 영속 재정의로 지원되는 다른 심각도를 선택할 수 있습니다. 유효 값은 Core를 다시 시작한 뒤에만 적용됩니다. 반복, 상관관계, 근거, 중복 제거, 후속 권한 조건은 이 설정과 독립적으로 유지됩니다.

키소스소유자노트
AZURE_TENANT_IDenv배포비-시크릿
AZURE_SUBSCRIPTION_IDenv배포비-시크릿
AZURE_RESOURCE_GROUPenv배포대상 리소스 그룹
KAFKA_BOOTSTRAP_SERVERSenv배포Event Hubs Kafka 엔드포인트 (<ns>.servicebus.windows.net:9093); 이벤트버스 계약 구현
FDAI_AUXILIARY_KAFKA_BOOTSTRAP_SERVERSenv배포Core의 canary 및 raw 인벤토리 소비자만 사용하는 operational Event Hubs Kafka 엔드포인트입니다. 설정하지 않으면 비-Azure 어댑터에서 기본 엔드포인트로 대체 경로합니다.
KAFKA_SECURITY_PROTOCOLenv배포Azure 에서 SASL_SSL; 다른 곳에서는 프로바이더별 값
KAFKA_SASL_MECHANISMenv배포Azure 에서 OAUTHBEARER
FDAI_STATE_STORE_DSN; FDAI_LICENSE_TOKEN / FDAI_LICENSE_IMAGE_DIGEST / FDAI_LICENSE_DEPLOYMENT_BINDING / FDAI_LICENSE_TOKEN_REVISIONKV 참조 + env업스트림 / 배포상태 저장소 값은 감사와 KPI용 PostgreSQL 연결 URI입니다. 라이선스 토큰은 Container Apps 기본 Key Vault 시크릿 참조로만 전달됩니다. 이미지와 배포 값은 서명된 점유와 비교하는 소문자 SHA-256 다이제스트이며, 토큰 개정 다이제스트는 갱신 시 새 Core 개정 번호를 강제하지만 권한 입력은 아닙니다. 배포되는 런타임은 입력이 없거나 잘못되거나 만료되거나 잘못 연결되면 읽기 전용으로 유지하고 세 Thor 작업 경로를 모두 차단합니다. 로컬 Git checkout은 고정된 소유자 전용 secrets/integrity-signing-key.pem이 패키지된 업스트림 무결성 공개 키와 암호학적으로 일치할 때만 토큰을 무시할 수 있으며, 배포 런타임은 이 경로를 열지 않습니다.
FDAI_APPROVAL_PROFILE_JSON보호된 GitHub 시크릿 또는 변수 -> env배포 / Mimir단독 운영자 프로덕션 승인 프로필 개정 하나를 위한 선택적 배포 시점 부트스트랩입니다. materialize_tfvars.py는 공유 approval_profile_policy_digest를 검증하고, 전권 개발 프로필과 함께 쓰는 값을 거부하며, 기본값은 미설정으로 유지합니다. Mimir가 승인 정책 개정을 활성화한 뒤에는 Core가 활성 정책 관리 포인터를 읽고 이 환경 값은 폴백으로만 취급합니다. 활성 포인터가 우선하며 불일치는 로그와 감사에 기록됩니다.
FDAI_CASE_HISTORY_CONTAINER_URL / FDAI_CASE_HISTORY_MI_CLIENT_ID / FDAI_CASE_HISTORY_RETENTION_DAYS / FDAI_CASE_HISTORY_DELETION_DAYS / FDAI_CASE_HISTORY_RETENTION_TICK_SECONDSenv업스트림 / 배포변경할 수 없는 사례 개정 번호용 비공개 Blob 컨테이너 URL, 전용 연결된 UAMI 클라이언트 id, active-retention/deletion-due 오프셋 및 제한된 Muninn 보존 cadence입니다. Azure는 활성 보존, 삭제 예정, 이전 Blob 버전 및 변경 피드의 기본값을 30일로 설정합니다. Terraform은 저장소와 신원 연결을 파생하고 deletion이 보존보다 이르지 않게 검증하며, 시작은 전용 신원 id가 없거나 실행기 신원과 같으면 실패합니다. 공개/key-auth 대체 경로는 사용하지 않습니다. 보존 틱 기본값은 86400이며 배포 재정의 값은 승인된 데이터 일정에 결속됩니다.
FDAI_OPERATOR_MEMORY_DSNKV 참조업스트림사람 승인 승인 운영자 기억 용 Postgres DSN. day-zero 는 FDAI_STATE_STORE_DSN 과 동일 소스 (단일 Flexible Server); 배포는 코어를 건드리지 않고 나중에 분리할 수 있습니다.
FDAI_T1_PATTERN_LIBRARY_DSNKV 참조업스트림pgvector 기반 T1 패턴 라이브러리 용 Postgres DSN. day-zero 동일 소스, 동일 배선.
FDAI_CHANGE_MI_CLIENT_ID / FDAI_RESILIENCE_MI_CLIENT_ID / FDAI_FINOPS_MI_CLIENT_IDenv배포Core 앱에 첨부된 세 버티컬별 user-assigned managed 신원의 클라이언트 id입니다. 전달 principal 식별에만 사용하며, 실행 권한 확인과 포크 소유 액션 whitelist가 선택된 신원의 실행 가능 여부를 계속 결정합니다.
FDAI_INVENTORY_DSNKV 참조업스트림Scheduled 인벤토리 수집기가 변경할 수 없는 후보를 단계하고 활성 그래프를 atomic 승격하는 데만 사용하는 PostgreSQL DSN.
FDAI_INVENTORY_SCOPES / FDAI_INVENTORY_RESOURCE_TYPESenv배포쉼표로 구분한 구독 범위와 선택적 CSP-중립 resource-type subset. 빈 범위는 시작을 차단합니다.
FDAI_INVENTORY_SOURCESenv업스트림Ordered 대체 경로 목록. 기본값은 arg,arm입니다. declarative는 고정본 경로와 SHA-256이 모두 있을 때만 허용합니다.
FDAI_INVENTORY_MANAGEMENT_ENDPOINT / FDAI_INVENTORY_MANAGEMENT_AUDIENCEenv배포검증된 HTTPS ARM 루트 및 OIDC 대상 쌍. 승인된 sovereign-cloud 또는 검증된 Resource 관리 Private Link 경로에서는 둘 다 재정의합니다.
FDAI_INVENTORY_FRESHNESS_SECONDSenv업스트림활성 스냅샷이 stale 상태가 되고 그래프 기반 자율성을 사람 검토로 낮추기 전의 최대 age입니다. 기본값은 86400입니다.
FDAI_INVENTORY_RECONCILIATION_INTERVAL_SECONDSenv업스트림정상 전체 스캔 간격이며 예약된 변환기가 선언하는 관측 상태 최신성 상한입니다. 기본값은 21600입니다.
FDAI_INVENTORY_CHANGE_MIN_INTERVAL_SECONDSenv업스트림변경으로 시작되는 두 조정 사이의 하한으로, 변경 폭주가 스캔 폭주로 번지는 것을 막습니다. 기본값은 120입니다.
FDAI_INVENTORY_PROGRESS_DEADLINE_SECONDSenv업스트림출처가 진행 배치 없이 실행될 수 있는 최대 시간입니다. 배치마다 마감을 다시 설정합니다. 기본값은 900입니다.
FDAI_INVENTORY_ATTEMPT_DEADLINE_SECONDSenv업스트림시도의 절대 상한입니다. 진행 마감 이상, 포기 구간보다 짧은 1740 이하여야 합니다. 기본값은 1500입니다.
FDAI_INVENTORY_ARG_REQUESTS_PER_SECONDenv업스트림스캔 하나의 모든 샤드가 공유하는 지속 Azure Resource Graph 예산입니다. 기본값은 3입니다.
FDAI_INVENTORY_LOOP_SECONDSenvdev-only로컬 --loop 틱 사이의 지연입니다. 배포 실행은 cron을 사용합니다. 기본값은 60입니다.
FDAI_ANALYZER_TARGETS / FDAI_ANALYZER_WINDOW_SECONDS / FDAI_ANALYZER_MAX_DISCOVERED_TARGETSenv배포 / 업스트림명시적 analyzer 대상, metric window 및 인벤토리 발견 상한입니다. 명시적 대상과 지원되는 인벤토리 대상을 결정론적으로 병합합니다. 잘못된 값이나 읽을 수 없는 구성된 projection은 차단되고, 완전히 해석된 대상 집합이 비어 있을 때만 정상 no-op입니다.
FDAI_TRACE_TOPOLOGIES_JSONenv배포작업 영역 기반 Application Insights 연속성 검사용 선택적이고 범위가 제한된 topology_ref, resource_ref, 순서가 있는 expected_hops 선언입니다. 보호된 배포 workflow는 TRACE_TOPOLOGIES_JSON repository variable을 Terraform으로 전달합니다. 값이 비어 있으면 이 검사만 비활성화하고 metric analyzer는 유지합니다.
KAFKA_TOPIC_EVENTSenv배포주 이벤트 ingest 토픽
KAFKA_TOPIC_DLQ_SUFFIXenv배포dead-letter 접미사 (기본 .dlq)
FDAI_EXECUTOR_COMMAND_TOPIC / FDAI_EXECUTOR_RECEIPT_TOPICenv업스트림 / 배포Isolated 실행기 명령 및 versioned 최종 증적 토픽입니다. 기본값은 object.executor-command, object.executor-receipt이며 서로 달라야 합니다.
FDAI_ISOLATED_EXECUTOR_MI_CLIENT_ID / FDAI_ISOLATED_EXECUTOR_AUTHORITY_CUTOVERenv배포전용 isolated 신원과 정확한 default-off 전환 표시입니다. 관찰 모드에서는 전송 계층/상태 접근만 가지며 전환 후에는 유일한 development-gateway 호출자가 되고 Core는 전송 계층/읽기 접근만 유지합니다.
FDAI_ISOLATED_EXECUTOR_DEPLOYEDenv업스트림 / 배포독립 배포 프로세스의 exact 명시적 선택 표시입니다. 1일 때만 이 entrypoint를 시작하며 환경 이름은 배포 venue 또는 권한을 의미하지 않습니다.
FDAI_ISOLATED_EXECUTOR_HEALTH_PORT / FDAI_ISOLATED_EXECUTOR_INSTANCE_IDenv업스트림 / 배포내부 상태 포트(기본 8000)와 증적 귀속용 범위가 제한된 인스턴스 id입니다. 명시적 인스턴스 id가 없으면 Container Apps의 HOSTNAME을 사용합니다.
LLM_MODEenv배포명시적 테스트/mock용 local-fake 또는 권위 있는 프로파일용 azure. 환경은 연결을 선택하지 않습니다. dev-and-deploy-parity-ko.md § 동등성 컨트랙트 참조.
LLM_RESOLVED_MODELS_PATHKV 참조배포LLM_MODE=azure 시 필수; 부트스트랩 해석기가 쓴 resolved-models.json을 가리킴
T1_SIMILARITY_THRESHOLD / T1_MIN_SUCCESS_RATEenv배포Learned-action reuse 전 유사도와 historical 성공에 적용하는 검증된 [0,1] 하한입니다. 기본값은 0.8, 0.9입니다.
QUALITY_GATE_CONFIDENCE_THRESHOLD / QUALITY_GATE_QUORUMenv배포T2에 적용하는 검증된 확신도 하한과 independent-model agreement 정족수입니다. 기본값은 0.7, 2이며 정족수는 2보다 작을 수 없습니다.
RULE_CATALOG_REFenv배포카탈로그 스냅샷 git 참조
AUTONOMY_MODE_DEFAULTenv배포반드시 shadow 기본값
FDAI_LOG_LEVELenv업스트림코어 앱의 Python 로거 레벨 (DEBUG / INFO / WARNING / ERROR). 기본 INFO.
FDAI_OPERATOR_API_LOCAL_AZURE_CLIenvlocal-onlyFixed 역할 상한을 사용하는 명시적 CLI-principal debug 대안입니다. VITE_LOCAL_AZURE_CLI_AUTH=1과 함께 사용합니다.
FDAI_OPERATOR_API_DEV_MODEenvtest-onlyAutomated Operator API 테스트용 authentication bypass입니다. VS 코드 full-stack 프로파일은 설정하지 않습니다.
FDAI_OPERATOR_API_LOCAL_ENTRAenvlocal-only정본 interactive 프로파일입니다. 브라우저 Entra JWT와 App 역할은 배포와 같으며 서버 Azure CLI 세션은 Azure 어댑터로 제한됩니다.
FDAI_START_PANTHEONenv업스트림 / 로컬15-agent 런타임의 disable-only 컨트롤입니다. 미설정은 활성 상태이며 0, false, no, off만 비활성화합니다. Event Hubs variable은 전송 계층을 선택하며 Pantheon을 활성화하지 않습니다.
FDAI_LOCAL_SCENARIO_REPLAYenvtest-onlyAutomated 테스트와 명시적 mock 애플리케이션용 생성된 시나리오 재생입니다. Interactive 로컬 시작은 이를 거부합니다.
FDAI_LOCAL_AZURE_DISCOVERYenvlocal-onlyAzure 발견은 필수입니다. 미설정 또는 1은 읽기 전용 AzureCliInventory를 사용하고 0은 거부하며 synthetic 그래프를 선택하지 않습니다.
FDAI_LOCAL_AZURE_SUBSCRIPTION_IDenvdev-only모든 로컬 az group/resource list 호출에 전달하는 선택적 구독입니다. 미설정 시 선택한 Azure CLI 프로파일의 활성 구독을 사용합니다. 채워진 값을 커밋하지 않습니다.
FDAI_LOCAL_AZURE_CONFIG_DIRenvdev-only선택적 격리 Azure CLI 프로파일입니다. 미설정 시 어댑터가 상속된 AZURE_CONFIG_DIR를 제거하고 기본 프로파일을 사용합니다.
FDAI_POLICIES_ROOTenv배포T0 와 검증기 가 소비하는 OPA / Rego 번들 루트의 절대 경로. 미설정 시 in-repo policies/ 를 기본값.
FDAI_MI_CLIENT_IDenv업스트림현재 프로세스의 user-assigned MI 클라이언트 id. Core에는 실행기 id를 주입하고 인벤토리 작업에는 별도 읽기 전용 발견 id를 주입합니다.
FDAI_INVENTORY_RECONCILIATION_INTERVAL_SECONDSenv업스트림인벤토리 작업의 정상 full-scan 간격입니다. 기본 작업 cron은 10분마다 실행되지만 PostgreSQL 시도 상태를 기준으로 간격이 도래하기 전의 검사는 건너뜁니다. 더 최근의 실패하거나 중단된 시도는 다음 틱에 재시도합니다. 기존 온톨로지 변환의 세대가 활성 스냅샷이 아니거나 release가 실행 중인 release가 아니면 대기로 보고 최소 폴링 간격 뒤에 다시 수집하므로, 온톨로지 release를 바꾸는 배포가 이 간격 동안 답변을 부분 결과로 남기지 않습니다. 성능이 저하된 대기 중 변환은 실패 근거를 유지하지만 다음 정본 전체 스캔을 차단하지 않으며 현재 변환이 불완전하면 계속 실패합니다. 해당 base를 건너뛴 승격된 전체 스냅샷은 실제 manifest 세대에 다시 결속하며 manifest 세대가 없으면 계속 차단합니다. 새로운 전체 스냅샷의 선언 base가 건너뛴 정확한 불완전 generation이면 보존된 완전한 topology 이력에서 이전 상태를 파생할 수 있습니다. 복구는 다시 계산한 배치에서 동일한 콘텐츠 주소 상태 전이 커버리지 레코드를 중복시키거나 약화하지 않고 재사용할 수 있습니다. 이후 기록이 동시에 커밋되더라도 전역 및 활성 범위 변환 checkpoint는 해당 스냅샷 append가 관측한 journal high watermark보다 앞으로 이동하지 않습니다. 저장소 변수 ENABLE_RUNTIME_CALL_EVIDENCE=true는 Operator 상태 이행 후 배포된 런타임 호출 원본을 독립적으로 활성화합니다. 독립 Operator API와 채널 경계에는 서로 다른 고정 semantic outbox namespace를 주입하므로 한 런타임이 다른 런타임의 대기 중 요청을 claim할 수 없습니다. 독립 서비스 runtime_call_evidence_transition guard는 일치하는 런타임에서 이 정확한 namespace 추가 또는 제거만 허용합니다. 구성한 최신성 구간에서는 ARM replica 검증 전에 정확한 엔드포인트 쌍별 최신 관측을 선택합니다. 더 새로운 검증되지 않은 관측은 실패 시 닫힌 상태가 되고 더 새로운 짝이 없는 관측은 후행 유예 구간 뒤 불완전 상태가 됩니다. 보호된 plan-runtime-* 및 apply-runtime-* 요청은 검증된 업데이터와 롤백이 기존 Job에만 영향을 주는 형제 플래그, workspace 및 정확한 이미지 전환 리소스를 대상으로 합니다. 별도 workspace 전환 리소스는 이미 생성된 플래그 리소스가 새 필수 바인딩을 숨기지 않도록 합니다. 검증된 다이제스트가 바뀌면 이미지 업데이터의 상태 전용 교체만 허용합니다. 런타임 전용 수렴 검사는 세 전환 상태를 확인하며 독립 읽기는 플래그, workspace 다이제스트 및 선택한 이미지 다이제스트를 검증합니다. 환경 통합 Container Apps 로그 행의 _ResourceId가 비어 있을 수 있으므로 원본은 결속되지 않은 이름을 수락하는 대신 플랫폼 컨테이너 이름과 ID가 정확한 ARM replica 응답과 일치하도록 요구합니다. 범위 검사는 다른 모든 주소를 차단합니다.
FDAI_INVENTORY_OPERATOR_REQUESTEDenv배포 / one-shot명시적으로 요청한 one-shot Job 실행에서만 1로 설정해 정상이고 유휴 상태인 adaptive scheduler가 즉시 수집하도록 합니다. 이 요청은 활성 수집, provider backoff, throttling, 열린 circuit 또는 인벤토리 근거 gate를 우회하지 않습니다. 영속 Job template에서는 이 값을 설정하지 않습니다. Core 마이그레이션 head는 snapshot 및 실시간 인벤토리 table에서 검토된 runtime_calls link 형식을 허용하며 downgrade는 다시 만들 수 있는 런타임 호출 link만 제거한 뒤 이전 허용 목록을 복원합니다.
FDAI_EMAIL_ENDPOINT / FDAI_EMAIL_SENDER_ADDRESS / FDAI_EMAIL_RECIPIENT_ADDRESSES_JSON / FDAI_NOTIFICATION_MI_CLIENT_IDenv업스트림 / 배포ACS 이메일 A2/A4 채널을 활성화합니다. Terraform이 엔드포인트와 Azure-managed 발신자를 파생하고 전용 알림 MI를 연결한 뒤 클라이언트 id를 주입합니다. 배포 구성은 NOTIFICATION_EMAIL_RECIPIENTS_JSON으로 수신자를 공급하며 앱에는 접근 키나 연결 문자열이 들어가지 않습니다. 부분 설정은 시작을 차단합니다.
FDAI_CONSOLE_BASE_URLenv배포인시던트 이메일의 읽기 전용 근거 링크를 만드는 공개 HTTPS 출처입니다. Console을 활성화하면 Terraform이 Static Web App hostname에서 파생합니다. 값이 없으면 이메일 전달은 계속되며 렌더러는 인시던트 CTA를 생략합니다.
FDAI_MEASUREMENT_MODEenv업스트림infra/modules/measurement-runners/의 선택적 Container Apps 작업 진입점을 선택합니다. baseline은 고정된 시나리오 회귀 측정을 실행하고, growth는 검토된 결과를 패턴 성장 수집으로 전달하며, operational-promotion은 승격 없이 변경할 수 없는 작업별 근거를 평가합니다. 모든 작업은 기본적으로 비활성화되며 전용 비실행기 측정 신원을 사용합니다. 액션 권한은 승격 및 안전성 검토가 독립적으로 관리합니다.
FDAI_REVISION / FDAI_OPERATIONAL_PROMOTION_EVIDENCE_ROOT / FDAI_OPERATIONAL_PROMOTION_MANIFESTenv배포Opt-in operational-promotion 작업에 필요합니다. Revision은 전체 불변 소스 개정 번호이고 root는 고정 이미지 또는 보호된 읽기 전용 mount가 제공하는 컨테이너 절대 경로이며 manifest는 해당 root 기준 상대 경로입니다. 근거 파일은 raw provider payload가 아니라 범위가 제한된 정본 사실과 digest를 담습니다.
FDAI_DIRECT_API_FAKEenvtest-only1이면 자동화 테스트에서 실행기 direct-API 경로를 in-memory 관찰 모드 가짜로 바꿉니다. Interactive 로컬 준비 과정에서는 이 값을 설정하지 않습니다. 범위 안에서 개발 운영 게이트웨이를 정확히 하나 찾지 못하면 관리 리소스 실행을 사용할 수 없습니다. FDAI_DEV_OPERATIONS_GATEWAY_URL과 상호 배타적입니다.
FDAI_TOOL_CALL_FAKEenvtest-onlyAutomated 테스트에서 실행기 tool-call 경로를 RecordingToolExecutor로 바꿉니다. Interactive 로컬 시작은 실행기를 연결하지 않습니다.
FDAI_WORKFLOW_SHADOWenv업스트림Event-triggered 카탈로그 작업 흐름은 기본적으로 non-mutating 관찰 모드로 실행됩니다. 명시적 maintenance 비활성화에만 0, false, no, off를 설정합니다.
FDAI_WORKFLOW_ENFORCE_ALLOWLISTenv배포 / 로컬Owner가 mode=enforce로 시작할 수 있는 작업 흐름 이름의 comma-separated 목록입니다. Event Hubs 명령 전송 계층이 필요하며 액션 단계는 일반 승격/risk/사람 승인/실행기 경로로 재진입합니다.
KAFKA_TOPIC_EVENTS / FDAI_STAGE_TOPICenv업스트림 / 로컬Deployed 런타임과 Azure-backed interactive 전송 계층이 공유하는 이벤트 및 단계 토픽입니다. Kafka 초기화와 이벤트 토픽이 모두 없으면 interactive 로컬은 fdai.events와 범위가 제한된 로컬 EventBus/SSE 어댑터를 사용합니다.
FDAI_IRP_ENABLED / FDAI_IRP_BUDGET_SECONDSenv업스트림alert-shaped 이벤트를 budgeted 조사 -> 타입이 지정된 제안 경로로 처리합니다. 제안은 표준 risk/사람 승인/실행기 루프에 재진입합니다.
FDAI_CHAOS_CONTEXT_JSON / FDAI_CHAOS_ENFORCEenv배포승격된 chaos 주입기의 런타임 맥락입니다. 명시 플래그가 1이고 시나리오가 승격된 상태이며 주입기와 탐색기가 모두 등록된 경우에만 강제 적용을 허용합니다. 보호된 시나리오 랩 계획이 실패하면 정리 단계에서 원시 프로바이더 로그를 파기하기 전에 허용 목록에 포함된 진단 분류, Terraform 주소 및 Azure 오류 코드만 출력합니다.
FDAI_JIRA_BASE_URL / FDAI_JIRA_ACCOUNT_EMAIL / FDAI_JIRA_API_TOKEN_SECRET / FDAI_JIRA_TOOL_MAP_JSONenv + KV 참조배포운영 JiraToolExecutor를 설정합니다. TOOL_MAP_JSON은 tool.open-incident-ticket을 Jira project 키에 매핑합니다. 토큰 값은 KV-backed FDAI_SECRET_<API_TOKEN_SECRET>에서 해석하며 대응에 토큰을 넣지 않습니다. 영속 Jira 원장과 distributed 리소스 잠금을 위해 FDAI_STATE_STORE_DSN이 필요합니다.
FDAI_JIRA_ENFORCEenv배포unset/0 기본값은 Jira를 관찰 모드-only로 유지합니다. 1은 ActionType 승격 게이트와 risk/사람 승인 결정도 강제 적용을 허용한 경우에만 강제 적용 요청을 허용합니다. 관찰 모드 증적은 실제 인시던트 티켓으로 링크되지 않습니다.
FDAI_PROFILE_IDenv배포rule-catalog/profiles/ 에서 한 프로파일을 선택 (rule-catalog-profiles-ko.md 참조). 시작 시 바인딩되며, 비어 있거나 없으면 전체 카탈로그를 유지합니다.
FDAI_NARRATOR_PROVIDER / FDAI_NARRATOR_BASE_URL / FDAI_NARRATOR_MODEL / FDAI_NARRATOR_API_VERSION / FDAI_NARRATOR_API_KEYenv + KV 참조배포Operator-console 서술기 translator 설정 (operator-console-ko.md 참조); API_KEY 는 반드시 KV 경유. 빈 프로바이더 = 결정론적 폴백.
FDAI_CHATOPS_WEBHOOK_SECRET / FDAI_CHATOPS_TIMEOUT_SECONDS / FDAI_TEAMS_APPLICATION_ID / FDAI_TEAMS_TENANT_ID / FDAI_TEAMS_APPROVAL_TEAM_ID / FDAI_TEAMS_APPROVAL_CHANNEL_ID / FDAI_TEAMS_APPROVAL_ACTIVITY_URL / FDAI_TEAMS_BOT_MI_CLIENT_ID / FDAI_TEAMS_ALLOWED_SERVICE_URLS_JSON / FDAI_TEAMS_JWKS_URL / FDAI_TEAMS_PRINCIPAL_MAP_JSON / FDAI_SLACK_TEAM_ID / FDAI_SLACK_PRINCIPAL_MAP_JSONenv + KV 참조배포사람 승인 콜백에는 PostgreSQL, Kafka, 범위가 제한된 워크플로 시간 초과 및 내부 Slack 중계용 공유 HMAC 비밀이 필요합니다. Teams에는 완전한 Bot 애플리케이션, 테넌트, 그룹 연결 팀/채널 activity endpoint, 전용 Bot 관리 ID, 서비스 토큰 신뢰 입력 및 주체 매핑이 필요합니다. Slack은 워크스페이스와 주체 매핑이 완전하면 독립 운영할 수 있습니다. 일부 구성은 사용할 수 없습니다.
FDAI_KAFKA_BOOTSTRAP_SERVERS / FDAI_HIL_DECISION_TOPICenv배포 / 업스트림Operator API 영속 결정 보낼 편지함이 사용하는 Event Hubs Kafka 엔드포인트입니다. 토픽 기본값은 fdai.hil.decisions입니다. Operator는 먼저 영속화하고 정확한 결정 필드를 게시한 뒤 브로커 수락 후에만 전달 완료로 표시합니다. Core는 같은 토픽을 소비하고 재개와 실행을 소유합니다.
FDAI_NOTIFICATION_RECEIPT_SECRET / FDAI_NOTIFICATION_RECEIPT_TOPICenv + KV 참조배포게시 자동화가 서명하는 게시 접수 콜백을 인증합니다. 토픽은 기존 기본 물리 토픽에 multiplex되는 고정 논리 이름 fdai.notifications.delivery-receipts이며, 다른 값을 설정하면 시작이 차단됩니다. 시크릿에는 PostgreSQL, 의미 전송 계층의 물리 토픽 및 구성된 Kafka 접수 전송이 필요합니다. 시크릿이 없으면 ingress는 바인딩된 상태로 닫혀 있으므로 서명되지 않은 콜백은 조용히 버려지지 않고 거부됩니다. 결과적인 delivered 또는 retryable_failed 전이는 Core만 적용합니다.
FDAI_TEAMS_NOTIFICATION_ENDPOINT / FDAI_NOTIFICATION_BINDINGS_JSONenv + KV 참조배포enable_teams_notification_delivery와 teams_notification_binding이 A2/A4 Teams 전달을 활성화할 때만 Terraform이 함께 공급합니다. Console에서 endpoint를 저장하거나 테스트해도 설정되지 않습니다. 컨트롤 플레인은 endpoint 시크릿에 읽기 전용 권한만 가지며 초기 unconfigured placeholder는 시작 시 거부합니다.
FDAI_TEAMS_NOTIFICATION_ACTIVATIONenv로컬로컬 전용 명시적 활성화입니다. 설정하면 컨트롤 플레인이 평문 endpoint 값 대신 공유 루프백 데이터베이스에서 암호화된 Operator 소유 Teams 바인딩 레코드를 읽습니다. 설정하지 않으면 저장된 바인딩은 아무것도 전달하지 않습니다.
FDAI_KAFKA_BOOTSTRAP_SERVERS / FDAI_SEMANTIC_TURN_REQUEST_TOPIC / FDAI_SEMANTIC_TURN_PROJECTION_TOPICenv배포 / 업스트림Operator 의미 전송 계층 구성입니다. 세 값은 모두 함께 설정하며 부분 구성은 시작을 차단합니다. 요청과 변환 결과 값은 프로비저닝된 operator-core-request 및 core-operator-projection 개체를 지정합니다. 선택 항목인 FDAI_SEMANTIC_TURN_CONSUMER_GROUP_ID와 FDAI_SEMANTIC_TURN_KAFKA_CLIENT_ID는 안정적인 서비스 기본값을 재정의합니다. FDAI_COMMAND_MI_CLIENT_ID는 OAUTHBEARER용 명령 신원을 선택하며 연결 문자열 또는 shared 키는 지원하지 않습니다. 로컬 preparation은 Terraform 출력에 같은 토픽이 이미 있을 때만 값을 복사하고 해당 실행에서는 dev-only 서술기를 비활성화합니다.
FDAI_GITOPS_API_BASE / FDAI_GITOPS_DEFAULT_BRANCH / FDAI_GITOPS_BRANCH_PREFIX / FDAI_GITOPS_TIMEOUT_SECONDSenv배포gitops-pr 어댑터 대상 repo 설정 (GitHub App / Azure DevOps). 인증 시크릿 은 플랫폼 App installation 을 통해 흐르고 env var 아님.
FDAI_GITOPS_TOKEN / FDAI_GITOPS_OWNER / FDAI_GITOPS_REPO / FDAI_GITHUB_WORKFLOW_TOOLS_ENFORCEKV 참조 + env배포fix/release/security/인시던트/IRP 산출물용 GitHub 변경 피드 및 작업 흐름 도구 연결입니다. 플랫폼은 활성화된 담당 체계 대상과 토큰 시크릿 ID를 stewardship_gitops_binding으로 내보냅니다. 보호된 서비스 워크플로는 이 객체를 검증하고 독립 Core 서비스에는 Key Vault 참조만 주입합니다. 강제 적용 플래그는 ActionType 승격 및 risk/사람 승인 게이트를 우회하지 않습니다.
FDAI_RBAC_READERS_GROUP_ID / FDAI_RBAC_CONTRIBUTORS_GROUP_ID / FDAI_RBAC_APPROVERS_GROUP_ID / FDAI_RBAC_OWNERS_GROUP_ID / FDAI_RBAC_BREAK_GLASS_GROUP_IDenv배포5개 human 역할 의 Entra ID 그룹 객체 id (user-rbac-and-identity-ko.md 참조). 미설정 그룹 = 역할 미할당.
FDAI_STEWARDSHIP_REQUIRE_BINDINGS / FDAI_STEWARDSHIP_AUDIT_INTERVAL_SECONDS / FDAI_HANDOVER_KNOWLEDGE_INTERVAL_SECONDSenv배포 / 업스트림자리 표시자 신원이 시작을 차단하도록 FDAI_STEWARDSHIP_REQUIRE_BINDINGS=1로 설정합니다. ENABLE_STEWARDSHIP_GOVERNANCE는 기본적으로 GitHub App이나 웹후크 시크릿 없이 Console 관리형 모드로 동작하며, 선택적 GitOps 어댑터는 조정 회전 Key Vault 예외와 함께 GITOPS_OWNER, GITOPS_REPO, GITHUB_APP_CLIENT_ID, GITHUB_APP_INSTALLATION_ID, GITHUB_APP_PRIVATE_KEY, GITHUB_WEBHOOK_SECRET 또는 호환 GITOPS_TOKEN을 매핑합니다. Terraform은 FDAI_MAINTAINERS, FDAI_STEWARD_<AGENT>, Key Vault 참조와 에이전트 운영 담당 체계 수명 주기에 정의된 준비 상태 기반 Entra 상태 및 내용이 없는 인수인계 수명 주기 간격도 공급합니다. 간격 기본값은 3600초와 60초이며 병합, IAM, 승인 또는 실행 권한을 부여하지 않습니다.
FDAI_CATALOG_FRESHNESS_METADATA_URL / _ROOT_KEY_IDS / _ROOT_THRESHOLD / _REFRESH_SECONDSenv배포 / 업스트림선택 사항입니다. Core가 Release Hub의 공개 서명 카탈로그 메타데이터를 고정된 ed25519 root 키 id로 검증하고, 메타데이터가 만료되었거나 검증되지 않은 동안 운영자 재정의 승격을 shadow 모드로 되돌립니다. Terraform은 Core 루트의 catalog_freshness에서 값을 설정하며 URL은 https여야 합니다. 권한을 낮추기만 합니다. Lifecycle Release와 채널을 참조하세요.
FDAI_ENTRA_TENANT_ID / FDAI_API_AUDIENCEenv배포프로덕션 Operator API Entra JWT 검증기 (EntraJwtVerifier) 필수: 배포 테넌트 id와 fdai-api 애플리케이션(클라이언트) ID이며, v2 액세스 토큰은 이 값을 aud로 전달합니다. user-rbac-and-identity-ko.md#102-api-토큰-검증 참조.
FDAI_ENTRA_ISSUER / FDAI_ENTRA_JWKS_URIenv배포선택 검증기 오버라이드; 기본값은 테넌트 의 v2 발급자 + 공개 키 셋. v1-토큰 앱은 ISSUER 를 https://sts.windows.net/<tenant>/ 로; JWKS_URI 는 소버린 / 에어갭 클라우드에서만 오버라이드.
FDAI_EXECUTOR_PRINCIPAL_ID / FDAI_EXECUTOR_EVENT_ROLE_DEFINITION_ID / FDAI_EXECUTOR_SECRET_ROLE_DEFINITION_IDenv업스트림Operator API onboarding 탐색 입력. ARG를 사용해 프로비저닝된 리소스 집합 및 실행기 Event Hubs / Key Vault 역할을 검증합니다.
FDAI_DR_DRILL_SOURCE_SERVER_ARM_ID / FDAI_DR_DRILL_TARGET_LOCATION / FDAI_DR_DRILL_TARGET_RESOURCE_GROUP / FDAI_DR_DRILL_TARGET_SERVER_PREFIX / FDAI_DR_DRILL_PITR_OFFSET_MINUTES / FDAI_DR_DRILL_INTEGRITY_TABLES / FDAI_DR_DRILL_DRY_RUNenv배포전달 계층이 소유하는 DB-DR 훈련 설정입니다. DB-DR 훈련 런북을 참조하세요. 작업은 전용 비실행기 신원과 미리 만든 격리 대상 그룹을 사용합니다. DRY_RUN=true는 Azure나 데이터베이스를 변경하지 않고 완전한 구성을 검증합니다.
FDAI_SECRET_KAFKA_TOKEN / 기타 FDAI_SECRET_*KV 참조배포전용 env var 이름이 아직 없는 어댑터가 소비하는 시크릿 을 위한 범용 escape hatch; 모든 FDAI_SECRET_* 값은 반드시 KV 경유.

모든 키에 적용되는 규칙:

Onboarding 콘솔은 모든 Azure 탐색 입력이 있을 때만 probe_mode=configured를 보고합니다. 입력이 없을 때 probe_mode=not-configured는 표시된 공백이 로그인한 테넌트의 관찰 결과가 아니라 필요한 기준선임을 의미합니다.

  • 시작 시 누락/파싱 불가 구성에 대해 fail fast (coding-conventions.instructions.md).
  • 시크릿은 Key Vault refs로, 절대 plain env가 아님; plain env의 시크릿은 CI secret-scan 게이트 실패.
  • 환경별 값이 다름; 같은 이미지가 주입된 환경에서 값을 읽음.
  • Terraform은 Core와 Operator용 deployment-owned operator-request receipt signing seed secret을 Key Vault에 만들고 버전이 없는 secret id와 producer id만 내보냅니다. Deploy workflow는 버전이 지정된 secret 참조를 hydrate 전에 거부하고 이 참조를 service tfvars로 hydrate하므로, 교체된 seed는 현재 버전으로 해석됩니다. Operator는 자기 seed만 받고, Core는 자기 seed와 Operator seed를 받아 startup에서 trusted producer public key를 파생하며 core-control-plane으로만 서명합니다. Core는 trusted computing base 안의 verifier로 남습니다.

초기 세 영역에서 관측할 수 있도록 부트스트랩 시 신호를 연결합니다. 구체적인 이벤트 유형, 구독 필터, 속도 제한은 추후 결정할 예정이지만, 연결 구조는 확정되어 있습니다.

버티컬Azure 신호 후보딜리버리
변경Activity Log (resource-write / 삭제), 변경 Analysis, Resource Health정본 Event Hubs Kafka 유입으로 push하며 Huginn이 실시간 발견 정규화를 소유하고 인벤토리 sync 작업이 전체 그래프를 조정합니다.
DR / ChaosResource Health, 백업 금고 이벤트, PostgreSQL / SQL replication-lag 메트릭, restore-rehearsal 결과Diagnostic Settings + 스케줄 Container Apps 작업 프로브 → Kafka 토픽 (fdai.dr.events)
FinOps비용 이상 알림, 예산 알림, Advisor 비용 권고비용 관리 pull → Kafka 토픽 (fdai.finops.events); 이상 알림은 같은 Diagnostic-Settings 경로로 fan in
Operator 안전 제어Ordered poison-halt clear 요청Operator가 shared pantheon-object transport의 logical fdai.operator.ordered-poison-halt.clear.v1 topic에 씁니다. Core는 halted ordered consumer를 재개하기 전에 parked-record 근거를 검증합니다.

모든 이벤트는 유입 시 멱등성 키를 부여하므로 재생은 no-op으로 처리됩니다. DLQ는 접근할 수 있어야 하며, 어느 경로에서든 강제 적용을 활성화하기 전에 경보 라우팅 계약에 포함해야 합니다.

Azure forwarding 방식은 shared 시크릿이 없는 경계를 유지하는 것이 좋습니다. Diagnostic Settings 내보내기를 위해 Event Hubs 로컬 인증만 다시 활성화하지 않습니다. 선택한 Azure 신호 출처가 Managed Identity로 게시할 수 없다면 승인된 push 전송 계층이 준비될 때까지 범위가 제한된 Activity Log 복구 읽기 담당을 사용합니다. 적응형 인벤토리 Job은 각 조정기 실행 전에 검증된 정책을 읽고 런타임 호출, Resource Health, Static Web App 및 Kubernetes 보강을 하나의 공유 순차 지원 경계에서 구성한 뒤 지연된 조정을 진행합니다. 모듈 분리는 서비스, 신원 또는 상태 작성자를 추가하지 않습니다. 제한된 네트워크 인벤토리 인증은 기존 개발 애플리케이션 리소스 그룹 안에서 정확한 생성 및 정리 계획이 있는 작업 전용 리소스 집합을 사용하며 그룹 자체를 변경하거나 삭제하지 않습니다. 비공개 Container Apps, PostgreSQL, DNS 및 Blob 경로는 선택한 환경과 피어링하거나 이를 변경하지 않습니다. 비공개 Blob I/O는 hostname 검증을 유지하면서 엔드포인트 주소를 고정하고, migration은 URL로 인코딩된 자격 증명을 안전하게 보존하고 격리된 서버는 정확한 VECTOR,PG_TRGM 확장 허용 목록을 선언합니다. 서로 다른 캠페인 신원과 검증기 신원은 권한을 부여하지 않는 정제된 증적만 보존합니다.

프로비저닝 후 검증은 어댑터 도달성, canary 왕복, 관찰 모드 정확성, 활성화된 Inventory Job 재확인을 포함합니다. 배포 후 smoke 테스트 계약은 인벤토리 컨테이너가 계획의 정확한 다이제스트로 고정된 Core 이미지를 사용하지 않으면 적용을 중단하여 오래된 수집을 방지합니다. 검증에 실패하면 승격을 중단하고 트래픽을 롤백합니다.

프로비저닝 비용 원칙은 이 원칙에서 나오는 예시 월간 비용 묶음과 함께 비용 모델이 소유합니다. 이 제목은 기존 링크의 안정적인 대상으로 남아 있습니다.

  • 배포 인터페이스 - 해결: Terraform은 실행 엔진이고 운영자 인터페이스는 fdaictl provision azure입니다. 설치형 CLI는 읽기 전용 preflight를 실행하고 Terraform을 대체하지 않으면서 exact-plan 작업을 수동 Managed Host에서 조정합니다. 설치형 배포 CLI를 참조하세요.
  • 최소 세트 내 구체적 티어 값(PostgreSQL 저장소 크기, Log Analytics daily 상한, ACR 보존 윈도우, Event Hubs 처리량-단위 상한).
  • 리전 선택과 single-zone 배포 자세(멀티 존은 단계 4로 연기).
  • 배포자 아이덴티티를 위한 커스텀 Azure 롤 패키징.
  • Log Analytics daily-cap과 쿼리 비용 예산 (보존 기본 30일은 콘솔 UI에서 설정 가능; 알림 임계값 TBD).
  • Kafka 토픽 명명 + Diagnostic-Settings forwarding 필터, 도메인별 fan-in 형상.
  • 운영 networking 기준선 - 해결: VNet-integrated Container Apps, 비공개 Key Vault, delegated-subnet 비공개 PostgreSQL. 개발은 공개 PostgreSQL 경로를 유지할 수 있으며 ACR/Event Hubs 비공개 엔드포인트는 테넌트 정책에 따라 추가합니다.
  • 완전한 런타임 구성 키 리스트 (값 매트릭스 확장).
  • 초기 의미 기준선 - 서명된 정확한 리비전 번들의 스키마 유효 범용 카탈로그 항목 전체이며 구독 초기 구성 매니페스트에서 열거합니다.
  • Core -> Isolated 실행기 목표 경계 - 5개 서비스 프로그램에 필수이며 권한 전환은 모든 binary 게이트와 롤백 증적을 기다립니다.

기존 AKS 워크로드 상태 스냅샷을 사용할 수 없으면 Hub 인수인계 흐름은 승인된 Deployment, Service, HorizontalPodAutoscaler, CronJob 재고를 비공개 상태 계보로 정확히 가져옵니다. 별도의 forget-only 해제 계획은 실제 객체 삭제가 0임을 입증해야 합니다. 롤백은 생성된 가져오기 선언을 사용하고 마지막 변경 없음 계획을 요구합니다. Terraform 1.9 가져오기 계획은 기존 객체를 before와 after에 모두 보고할 수 있습니다. 검증기는 두 값이 같고 작업이 no-op이며 가져오기 ID가 일치할 때만 이를 허용합니다. 완료된 이전 전환에서 1밀리초 미만의 상태 타임스탬프 불일치가 있으면 인증된 조정 명령을 사용합니다. 이 명령은 불변 전환 증적을 유지하고 Agent의 영구 현재 상태만 Hub 권위의 정규 타임스탬프와 다이제스트로 다시 씁니다. 이전 증적 검증은 저장된 증적 다이제스트를 바꾸지 않고 밀리초 상태 다이제스트와 전체 정밀도 Hub 완료 다이제스트를 각각 독립적으로 검증합니다. 동일한 UTC 시각의 +00:00과 Z 형식은 저장된 증적 다이제스트를 검증한 뒤에만 허용합니다. 만료됐지만 사용하지 않은 승인은 모든 증거와 실제 상태가 그대로일 때만 갱신할 수 있습니다. 선행 조건 루트는 이 재고가 참조하는 신원, 페더레이션 자격 증명, ServiceAccount, SecretProviderClass, ConfigMap, 비밀 바인딩만 소유합니다. 관리 대상 Deployment, Service, HorizontalPodAutoscaler, CronJob은 만들지 않습니다. Operator API 신원에는 생성된 세 secret 리소스 ID에 대해서만 Key Vault Secrets User를 부여하며, Key Vault 전체 범위 권한은 부여하지 않습니다. 별도 Operator command 신원에는 변경, 의미 처리, 사람 승인, 파이프라인에 사용하는 정확한 Event Hub 토픽 5개에 대해서만 sender와 receiver 역할을 부여합니다.

알아볼 내용읽을 문서
구현 상태 및 남은 작업구현 원장