이 가이드는 CrewAI AMP에 배포할 때 프라이빗 PyPI 레지스트리(Azure DevOps Artifacts, GitHub Packages,
GitLab, AWS CodeArtifact 등)에서 Python 패키지를 설치하도록 CrewAI 프로젝트를 구성하는 방법을 다룹니다.
이 가이드가 필요한 경우
프로젝트가 공개 PyPI가 아닌 프라이빗 레지스트리에 호스팅된 내부 또는 독점 Python 패키지에 의존하는 경우, 다음을 수행해야 합니다:- UV에 패키지를 어디서 찾을지 알려줍니다 (index URL)
- UV에 어떤 패키지가 해당 index에서 오는지 알려줍니다 (source 매핑)
- UV가 설치 중에 인증할 수 있도록 자격 증명을 제공합니다
pyproject.toml 구성과 자격 증명용 환경 변수를 결합하여 인증된 프라이빗 레지스트리를 지원합니다.
1단계: pyproject.toml 구성
pyproject.toml에서 세 가지 요소가 함께 작동합니다:
1a. 의존성 선언
프라이빗 패키지를 다른 의존성과 마찬가지로[project.dependencies]에 추가합니다:
1b. index 정의
프라이빗 레지스트리를[[tool.uv.index]] 아래에 명명된 index로 등록합니다:
name 필드는 중요합니다 — UV는 이를 사용하여 인증을 위한 환경 변수 이름을
구성합니다 (아래 2단계를 참조하세요).explicit = true를 설정하면 UV가 모든 패키지에 대해 이 index를 검색하지 않습니다 —
[tool.uv.sources]에서 명시적으로 매핑한 패키지만 검색합니다. 이렇게 하면 프라이빗
레지스트리에 대한 불필요한 쿼리를 방지하고 의존성 혼동 공격을 차단할 수 있습니다.1c. 패키지를 index에 매핑
[tool.uv.sources]를 사용하여 프라이빗 index에서 해결해야 할 패키지를 UV에 알려줍니다:
전체 예시
pyproject.toml을 업데이트한 후 lock 파일을 다시 생성합니다:
2단계: 인증 자격 증명 설정
UV는pyproject.toml에서 정의한 index 이름을 기반으로 한 명명 규칙을 따르는
환경 변수를 사용하여 프라이빗 index에 인증합니다:
{UPPER_NAME}은 index 이름을 대문자로 변환하고 하이픈을 언더스코어로 대체한 것입니다.
예를 들어, my-private-registry라는 이름의 index는 다음을 사용합니다:
| 변수 | 값 |
|---|---|
UV_INDEX_MY_PRIVATE_REGISTRY_USERNAME | 레지스트리 사용자 이름 또는 토큰 이름 |
UV_INDEX_MY_PRIVATE_REGISTRY_PASSWORD | 레지스트리 비밀번호 또는 토큰/PAT |
레지스트리 제공업체 참조
아래 표는 일반적인 레지스트리 제공업체의 index URL 형식과 자격 증명 값을 보여줍니다. 자리 표시자 값을 실제 조직 및 피드 세부 정보로 대체하세요.| 제공업체 | Index URL | 사용자 이름 | 비밀번호 |
|---|---|---|---|
| Azure DevOps Artifacts | https://pkgs.dev.azure.com/{org}/_packaging/{feed}/pypi/simple/ | 비어 있지 않은 임의의 문자열 (예: token) | Packaging Read 범위의 Personal Access Token (PAT) |
| GitHub Packages | https://pypi.pkg.github.com/{owner}/simple/ | GitHub 사용자 이름 | read:packages 범위의 Personal Access Token (classic) |
| GitLab Package Registry | https://gitlab.com/api/v4/projects/{project_id}/packages/pypi/simple/ | __token__ | read_api 범위의 Project 또는 Personal Access Token |
| AWS CodeArtifact | aws codeartifact get-repository-endpoint의 URL 사용 | aws | aws codeartifact get-authorization-token의 토큰 |
| Google Artifact Registry | https://{region}-python.pkg.dev/{project}/{repo}/simple/ | _json_key_base64 | Base64로 인코딩된 서비스 계정 키 |
| JFrog Artifactory | https://{instance}.jfrog.io/artifactory/api/pypi/{repo}/simple/ | 사용자 이름 또는 이메일 | API 키 또는 ID 토큰 |
| 자체 호스팅 (devpi, Nexus 등) | 레지스트리의 simple API URL | 레지스트리 사용자 이름 | 레지스트리 비밀번호 |
AMP에서 환경 변수 설정
프라이빗 레지스트리 자격 증명은 CrewAI AMP에서 환경 변수로 구성해야 합니다. 두 가지 옵션이 있습니다:- 웹 인터페이스
- CLI 배포
- CrewAI AMP에 로그인합니다
- 자동화로 이동합니다
- Environment Variables 탭을 엽니다
- 각 변수 (
UV_INDEX_*_USERNAME및UV_INDEX_*_PASSWORD)에 값을 추가합니다
전체 동작 흐름
CrewAI AMP가 자동화를 빌드할 때, 해결 흐름은 다음과 같이 작동합니다:UV가 인증
각 프라이빗 index에 대해 UV가 AMP에서 구성한 환경 변수에서
UV_INDEX_{NAME}_USERNAME과 UV_INDEX_{NAME}_PASSWORD를 조회합니다.문제 해결
빌드 중 인증 오류
증상: 프라이빗 패키지를 해결할 때401 Unauthorized 또는 403 Forbidden으로 빌드가 실패합니다.
확인사항:
UV_INDEX_*환경 변수 이름이 index 이름과 정확히 일치하는지 확인합니다 (대문자, 하이픈 -> 언더스코어)- 자격 증명이 로컬
.env뿐만 아니라 AMP 환경 변수에 설정되어 있는지 확인합니다 - 토큰/PAT에 패키지 피드에 필요한 읽기 권한이 있는지 확인합니다
- 토큰이 만료되지 않았는지 확인합니다 (특히 AWS CodeArtifact의 경우)
패키지를 찾을 수 없음
증상:No matching distribution found for my-private-package.
확인사항:
pyproject.toml의 index URL이/simple/로 끝나는지 확인합니다[tool.uv.sources]항목이 올바른 패키지 이름을 올바른 index 이름에 매핑하는지 확인합니다- 패키지가 실제로 프라이빗 레지스트리에 게시되어 있는지 확인합니다
- 동일한 자격 증명으로 로컬에서
uv lock을 실행하여 해결이 작동하는지 확인합니다
Lock 파일 충돌
증상: 프라이빗 index를 추가한 후uv lock이 실패하거나 예상치 못한 결과를 생성합니다.
해결책: 로컬에서 자격 증명을 설정하고 다시 생성합니다:
uv.lock을 커밋합니다.
관련 가이드
배포 준비하기
배포 전에 프로젝트 구조와 의존성을 확인합니다.
AMP에 배포하기
crew 또는 flow를 배포하고 환경 변수를 구성합니다.
Crew 업데이트하기
환경 변수를 업데이트하고 실행 중인 배포에 변경 사항을 푸시합니다.
