IDP
반복 플랫폼 요청을 셀프서비스 Golden Path로 바꾸는 내부 제품 전체.
포탈, API, 템플릿, 정책, 자동화 백엔드를 모두 포함한다.분류: Layer 5 - 플랫폼 엔지니어링 & 자동화 | 작성일: 2026-03-21
이 문서는 IDP를 “어떤 도구를 설치할 것인가”가 아니라 “반복되는 플랫폼 요청을 어떻게 학습 가능한 셀프서비스 제품으로 바꿀 것인가”의 관점에서 다룹니다. 플랫폼 엔지니어링의 더 큰 철학은
what-is-platform-engineering.mdx, Terraform과 GitOps의 세부 동작은 각각terraform-iac-basics.mdx,gitops-basics.mdx를 먼저 참고하세요.
Internal Developer Platform(IDP)은 개발자가 반복적인 인프라·배포·운영 요청을 티켓으로 넘기지 않고, 승인된 경로 안에서 스스로 처리하게 해주는 내부 제품이다.
중요한 점은 IDP가 단순한 포탈 UI가 아니라는 것이다. IDP의 본체는 “새 서비스 생성”, “데이터베이스 요청”, “배포 환경 생성”, “모니터링 등록”처럼 자주 반복되는 플랫폼 요청을 Golden Path로 제품화한 자동화 체계다. 화면은 그 체계에 접근하는 방법 중 하나일 뿐이다.
프론트엔드 CLI가 프로젝트 골격을 만들어주는 경험과 비슷한 면은 있지만, IDP는 코드 골격을 넘어 레포, CI/CD, Terraform, GitOps, 시크릿, 관측성, 소유자 정보까지 연결한다.
IDP 문서는 비슷한 단어가 많이 나온다. 처음 읽을 때는 아래 용어를 구분해야 한다.
반복 플랫폼 요청을 셀프서비스 Golden Path로 바꾸는 내부 제품 전체.
포탈, API, 템플릿, 정책, 자동화 백엔드를 모두 포함한다.개발자가 서비스, 문서, 템플릿, 배포 상태를 찾고 실행하는 화면 또는 진입점.
Backstage, Port, Cortex 같은 도구가 이 역할을 할 수 있다.조직이 권장하는 안전하고 빠른 표준 경로. 예외를 금지하는 감옥이 아니라 기본값이다.
새 서비스 생성, 배포, DB 발급처럼 반복되는 일을 표준화한다.서비스의 이름, 소유 팀, 런타임, 문서, 배포 상태, 의존성을 모아둔 목록.
'이 서비스는 누가 운영하고 어디에 배포되어 있나'를 찾을 때 쓴다.입력값 몇 개로 레포, 기본 코드, CI/CD, 카탈로그 등록을 생성하는 템플릿.
Backstage Software Templates가 대표적인 구현 예시다.포탈이나 CLI 뒤에서 실제 작업을 실행하는 안정적인 자동화 인터페이스.
GitHub API, Terraform, Argo CD, Vault, Cloud API를 조합한다.개발자가 빠르게 움직이되 보안·비용·운영 표준을 벗어나지 않게 하는 제약.
OPA 정책, 기본 태그, 암호화 강제, quota, 승인 규칙으로 나타난다.서비스가 조직의 최소 운영 기준을 만족하는지 보여주는 점수 또는 체크 결과.
소유자, 문서, 알림, SLO, 취약점, 배포 방식 같은 항목을 본다.**인지 부하(cognitive load)**는 개발자가 제품 기능을 만들기 위해 머릿속에 유지해야 하는 불필요한 운영 지식의 양이다. IDP는 인지 부하를 없애는 것이 아니라, 반복되고 외재적인 지식을 플랫폼 안으로 옮긴다. 예를 들어 “RDS subnet group과 security group을 매번 어떻게 조합하지?”라는 지식은 개발자가 외울 필요가 낮고, 플랫폼 템플릿이 일관되게 처리해야 한다.
**셀프서비스(self-service)**는 아무 제한 없이 마음대로 리소스를 만드는 권한이 아니다. 승인된 입력값과 정책 안에서 기다림 없이 처리할 수 있는 권한이다. 셀프서비스가 실패하면 개발자는 다시 Slack, Jira, 운영자 DM으로 돌아간다.
Platform API는 포탈의 버튼 뒤에 숨어 있는 실행 계약이다. 예를 들어 개발자가 새 서비스 만들기를 누르면 포탈은 내부적으로 POST /services 같은 API를 호출하고, 이 API는 GitHub repo 생성 작업 ID, Terraform plan/apply 작업 ID, Argo CD Application 이름, 카탈로그 entity ref를 반환해야 한다. 이렇게 결과 ID가 남아야 UI가 실패해도 “어디까지 만들어졌는가”를 추적할 수 있고, 나중에 Slack bot이나 AI 에이전트가 같은 Golden Path를 호출해도 동일한 guardrail을 통과한다.
IDP는 “멋진 포탈을 만들고 싶다”에서 출발하지 않는다. 출발점은 수동 티켓 운영의 반복 실패다.
전통적인 방식에서는 개발자가 새 서비스를 만들거나 데이터베이스를 요청할 때 플랫폼·인프라 팀에 티켓을 보낸다. 담당자는 레포를 만들고, Terraform 코드를 복사하고, 시크릿을 발급하고, CI/CD를 연결하고, 모니터링과 알림을 붙인다. 한두 번은 괜찮지만 요청이 반복되면 문제가 커진다.
AWS Prescriptive Guidance도 IDP의 목표를 개발자가 환경, 배포, 리소스, 설정을 독립적으로 관리하게 하는 내부 제품으로 설명한다. 다만 이런 외부 자료의 조직 도입률·전망 수치는 시점에 따라 바뀌므로, 여기서는 “왜 자동화가 필요한가”를 설명하는 맥락으로만 읽는다. 출처: https://docs.aws.amazon.com/prescriptive-guidance/latest/internal-developer-platform/introduction.html
IDP의 철학은 “모든 자유를 제거한다”가 아니라 “대부분의 좋은 선택을 기본 경로로 만든다”에 가깝다. 흔히 paved road라고 부르는 접근이다. 길을 포장해두면 많은 사람이 자연스럽게 그 길을 쓴다. 하지만 진짜 예외가 있을 때 숲길을 완전히 막아버리면 장애 대응이나 실험이 불가능해진다.
좋은 Golden Path는 다음 세 가지를 동시에 만족한다.
IDP에서 가장 위험한 오해는 추상화가 높을수록 무조건 좋다는 생각이다. 추상화는 인지 부하를 줄이지만, “How”가 숨겨질수록 장애 때 원인을 찾기 어려워진다. 따라서 IDP는 추상화를 제공하되 Terraform plan, Argo CD Application, Cloud 리소스, 카탈로그 엔티티로 내려가는 관찰 경로를 함께 제공해야 한다.
IDP는 보통 다음 흐름으로 동작한다.
flowchart LR Dev["개발자: 새 서비스 요청"] --> Entry["Portal / CLI / API"] Entry --> Template["Software Template"] Template --> Repo["GitHub: repo + branch protection"] Template --> Pipeline["CI/CD: build, test, image"] Template --> IaC["Terraform: network, db, secret reference"] IaC --> GitOps["GitOps repo: manifest commit"] GitOps --> Runtime["Kubernetes/ECS: deploy"] Template --> Observe["Monitoring: logs, alerts, dashboard"] Repo --> Catalog["Service Catalog"] Pipeline --> Catalog Runtime --> Catalog Observe --> Catalog Catalog --> Done["개발자에게 repo, 배포, 문서, 관측 링크 제공"]
핵심은 “포탈에서 버튼을 눌렀다”가 아니다. 버튼 뒤에서 여러 시스템의 계약이 연결된다.
| 단계 | 개발자가 보는 것 | 플랫폼이 처리하는 것 | 실패하면 보이는 신호 |
|---|---|---|---|
| 요청 | 서비스 이름과 팀 선택 | 이름 규칙, 소유자, 권한 확인 | 중복 이름, owner 없음 |
| 레포 생성 | GitHub URL | 템플릿 코드, CODEOWNERS, branch protection | repo만 있고 CI 없음 |
| CI/CD | 첫 build 상태 | 테스트, 이미지 빌드, 취약점 검사 | build는 되지만 배포 불가 |
| 인프라 | DB, 큐, secret 요청 | Terraform module, 정책 검사, state 기록 | 리소스 일부만 생성 |
| GitOps | 배포 상태 링크 | manifest commit, Argo CD sync | 포탈 성공, Argo CD OutOfSync |
| 관측성 | 대시보드와 알림 링크 | 로그, metric, alert, runbook 연결 | 장애 때 owner와 알림 없음 |
| 카탈로그 | 서비스 카드 | metadata, dependency, docs, scorecard | 카탈로그 stale |
이 표를 보면 IDP는 여러 도구를 한 화면에 모으는 것이 아니라, 작업의 시작과 끝을 연결하는 제품 경험이라는 점이 드러난다.
다음은 “user-service가 필요하다”는 요청을 IDP가 처리하는 작은 예시다. 실제 조직마다 도구는 다르지만 흐름은 비슷하다.
serviceName: user-serviceowner: team-identityruntime: nodejsframework: nestjsdatabase: postgresenvironment: - dev - prod이 입력에서 개발자는 VPC, subnet, IAM policy, Argo CD Application 이름, CloudWatch log group을 직접 쓰지 않는다. 대신 “업무 의도”를 말한다. 플랫폼은 이 의도를 조직 표준에 맞는 구체 리소스로 변환한다.
| 산출물 | 예시 | 왜 필요한가 |
|---|---|---|
| GitHub repo | myorg/user-service | 코드와 리뷰의 원본 |
| 기본 코드 | NestJS skeleton, health endpoint | 첫 build가 지나가는 최소 앱 |
| CI workflow | test, lint, docker build | 팀마다 다른 build 절차 제거 |
| Terraform module 호출 | service_db, service_secret, service_role | 반복 인프라 요청 자동화 |
| GitOps manifest | apps/user-service/prod.yaml | 배포 상태를 Git으로 추적 |
| Secret reference | DB_URL 참조만 생성 | 실제 secret 값은 Vault/Secrets Manager가 소유 |
| Monitoring | log group, dashboard, alert | 첫 장애 때 관찰 경로 제공 |
| Catalog entity | catalog-info.yaml | 서비스 소유자와 링크를 한 곳에 등록 |
catalog-info.yaml은 Backstage 같은 포탈이 서비스 정보를 읽는 대표적인 파일이다. 이 파일 자체가 IDP는 아니지만, 카탈로그의 최소 계약을 보여준다.
apiVersion: backstage.io/v1alpha1kind: Componentmetadata: name: user-service description: 사용자 프로필과 인증 관련 API annotations: github.com/project-slug: myorg/user-service argocd/app-name: user-service-prod backstage.io/techdocs-ref: dir:.spec: type: service lifecycle: production owner: team-identity dependsOn: - resource:default/user-db여기서 중요한 학습 포인트는 catalog-info.yaml이 실제 인프라를 만들지 않는다는 점이다. 카탈로그는 “이 서비스는 무엇인가”를 설명한다. 실제 리소스 생성은 Terraform, Crossplane, Cloud API, GitOps 컨트롤러가 맡는다. 따라서 카탈로그 등록 성공과 인프라 생성 성공을 같은 것으로 보면 silent failure가 생긴다.
좋은 IDP는 다음 상태까지 한 번에 이어져야 한다.
Synced와 Healthy 상태다.반대로 “레포는 생겼는데 배포는 안 되고, 카탈로그 카드만 보인다”면 IDP가 아니라 스캐폴딩 일부만 구현된 상태다.
IDP가 인지 부하를 줄이는 핵심 원리는 선언적 인터페이스다. 개발자는 “무엇이 필요한가(What)“를 말하고, 플랫폼은 “어떻게 만들 것인가(How)“를 결정한다.
Score 같은 workload-centric specification은 이 경계를 잘 보여주는 예시다. Score에서 개발자는 workload가 Postgres와 DNS를 필요로 한다고 선언하고, 구체적인 RDS 설정이나 Route 53 설정은 플랫폼 구현체가 해석한다. 출처: https://docs.score.dev/docs/
apiVersion: score.dev/v1b1metadata: name: user-servicecontainers: main: image: . variables: DB_HOST: ${resources.db.host} DB_PORT: ${resources.db.port}resources: db: type: postgres dns: type: dns이 예시에서 개발자가 선언한 것은 “Postgres가 필요하다”와 “DNS가 필요하다”다. 플랫폼이 결정하는 것은 인스턴스 타입, 백업 정책, subnet, security group, DNS zone, secret 주입 방식이다.
선언적 추상화를 평가할 때는 네 가지 질문을 던진다.
Kubernetes에서는 Deployment.replicas = 3이 What이고, 어느 노드에 배치할지는 scheduler의 How다. Terraform에서는 .tf 리소스 블록이 What이고, API 호출 순서와 dependency graph는 Terraform Core의 How다. IDP도 같은 패턴이다. 포탈 입력은 What이고, repo 생성, Terraform 실행, GitOps sync, 카탈로그 등록은 How다.
추상화가 좋을수록 사용자는 적게 알면 된다. 하지만 장애 때는 적게 아는 것이 약점이 될 수 있다. 그래서 IDP는 “성공했습니다”라는 단일 메시지보다 단계별 관찰 링크를 제공해야 한다.
IDP는 여러 구성요소가 합쳐져 동작한다. 처음에는 도구 이름보다 책임을 먼저 봐야 한다.
Portal, CLI, Slack bot, API처럼 개발자가 작업을 시작하는 인터페이스.
UI가 없어도 CLI와 API만으로 IDP MVP가 될 수 있다.서비스, owner, 문서, 배포 링크, 의존성, scorecard를 조회한다.
운영 사고 때 '누구에게 물어봐야 하나'를 줄인다.표준 코드, 레포, CI/CD, catalog-info를 생성한다.
새 서비스가 매번 다른 구조로 만들어지는 문제를 줄인다.Terraform, Crossplane, Cloud API로 네트워크, DB, 큐, 권한을 만든다.
수동 콘솔 작업을 정책 검증 가능한 코드 경로로 바꾼다.CI/CD와 GitOps로 빌드, 릴리스, 배포 상태를 연결한다.
생성된 서비스가 첫 배포까지 도달해야 한다.Vault, Secrets Manager, External Secrets, RBAC로 접근을 통제한다.
템플릿이 secret 값을 직접 파일에 쓰지 않게 한다.OPA, Conftest, Kyverno, Config Rule, catalog score로 기준 준수를 확인한다.
속도가 보안·비용·운영 기준을 우회하지 않게 한다.로그, metric, trace, alert, 사용자 피드백을 Golden Path 개선에 연결한다.
플랫폼을 설치물이 아니라 제품으로 운영한다.Backstage는 이 중 진입점, 카탈로그, 스캐폴더, 플러그인 생태계를 제공하는 구현 옵션이다. Backstage를 쓴다고 자동으로 IDP가 되는 것은 아니고, Backstage를 쓰지 않는다고 IDP가 아닌 것도 아니다.
Backstage는 Spotify에서 시작된 개발자 포탈 프레임워크다. 서비스 카탈로그와 Software Templates, TechDocs, 플러그인 생태계를 제공하기 때문에 IDP 논의에서 자주 등장한다. 하지만 Backstage는 “IDP의 전부”가 아니라 포탈과 확장 프레임워크다.
Backstage를 IDP로 착각하면 다음 실패가 생긴다.
반대로 GitHub Actions의 workflow_dispatch, Terraform module, Slack bot, 내부 위키만으로도 작은 IDP MVP를 만들 수 있다. 중요한 것은 개발자가 기다림 없이 안전한 경로를 실행할 수 있는가다.
아래 템플릿은 Backstage가 “새 서비스 생성”을 어떻게 표현하는지 보여주는 학습용 최소 예시다. 전체 설치 절차보다 여기서 봐야 할 것은 parameters -> steps -> output의 흐름이다.
apiVersion: scaffolder.backstage.io/v1beta3kind: Templatemetadata: name: nestjs-service-template title: NestJS 서비스 생성spec: owner: platform-team type: service parameters: - title: 서비스 정보 required: [name, owner] properties: name: type: string description: 예: user-service owner: type: string steps: - id: fetch-template action: fetch:template input: url: ./skeleton values: name: ${{ parameters.name }} - id: create-github-repo action: github:repo:create input: repoUrl: github.com?owner=myorg&repo=${{ parameters.name }} - id: register-catalog action: catalog:register input: repoContentsUrl: ${{ steps.create-github-repo.output.repoContentsUrl }} output: links: - title: Repository url: ${{ steps.create-github-repo.output.remoteUrl }} - title: Catalog Entity entityRef: ${{ steps.register-catalog.output.entityRef }}이 템플릿이 좋은지 보려면 “성공 로그가 예쁘다”보다 실패 경계를 봐야 한다.
| 확인 질문 | 좋은 신호 | 나쁜 신호 |
|---|---|---|
| repo 생성 실패 시 어디서 멈추나 | create-github-repo 단계 실패와 원인이 보인다 | 이후 단계가 계속 실행되어 좀비 카탈로그가 생긴다 |
| 같은 이름 요청을 막나 | 중복 repo 이름을 사전에 거부한다 | GitHub API 실패를 개발자가 해석해야 한다 |
| catalog 등록은 실제 repo와 연결되나 | repo URL과 entity ref가 결과에 남는다 | 카탈로그에 수동으로 다시 등록해야 한다 |
| 실패 후 정리가 가능한가 | 생성된 일부 리소스를 추적한다 | 어디까지 만들어졌는지 모른다 |
템플릿은 Golden Path의 시작점이지 끝이 아니다. repo 생성 뒤 배포, secret, monitoring, teardown까지 연결되지 않으면 개발자는 다시 수동 운영 절차로 돌아간다.
IDP 도입은 도구 선택보다 경제성 판단이 먼저다. 아래 숫자는 절대 기준이 아니라 사고를 돕는 예시다.
| 상황 | 가벼운 자동화로 충분한 경우 | IDP 후보가 되는 경우 |
|---|---|---|
| 팀 규모 | 5~10명, 서비스 수가 적고 요청자가 서로 안다 | 여러 팀, 수십 개 서비스, owner 탐색이 자주 필요 |
| 반복 요청 | 분기 1~2회 | 월 10~20회 이상 |
| 대기 시간 | 요청 후 몇 시간 안에 처리 | 요청은 짧지만 큐 때문에 1~3일 대기 |
| 설정 편차 | 실수해도 영향이 작고 쉽게 고친다 | 보안 그룹, 백업, 알림 누락이 반복된다 |
| 플랫폼 팀 시간 | 가끔 지원 | 반복 티켓이 로드맵 작업을 밀어낸다 |
| 개발자 경험 | 한두 명에게 물으면 된다 | Slack, 위키, 콘솔, Jira를 계속 오간다 |
간단한 계산도 도움이 된다.
월 20건의 새 환경 요청각 요청당 개발자 대기 1일 + 플랫폼 작업 30분
대기 비용: 20일/월의 리드 타임 지연플랫폼 직접 작업: 10시간/월설정 실수 10%라면: 월 2건의 재작업과 장애 위험이때 8주 동안 “새 환경 생성” Golden Path 하나를 만들어 대기 시간을 1일에서 15분으로 줄이면, 포탈이 거창하지 않아도 IDP 투자의 첫 증거가 된다. 반대로 월 1회 요청을 위해 Backstage, Crossplane, Argo CD, scorecard, plugin을 모두 붙이면 유지보수 비용이 이익을 이길 수 있다.
IDP 주변의 오해는 대부분 범위 혼동에서 나온다.
| 개념 | 무엇인가 | IDP와의 관계 | 흔한 오해 |
|---|---|---|---|
| IDP | 내부 Golden Path 제품 | 전체 체계 | 포탈 화면과 같다고 착각 |
| Internal Developer Portal | 카탈로그와 실행 화면 | IDP의 진입점이 될 수 있음 | UI만 있으면 IDP라고 착각 |
| PaaS | Heroku, Render처럼 외부가 제공하는 앱 플랫폼 | 일부 문제를 대신 풀어줌 | 내부 표준·조직 정책까지 자동 해결한다고 착각 |
| DevOps 도구 모음 | CI, Terraform, Argo CD, Vault 등 | IDP의 재료 | 도구 링크만 모으면 개발자 경험이 된다고 착각 |
| Platform API | 플랫폼 작업을 실행하는 API | 포탈보다 더 핵심일 수 있음 | UI 뒤 구현 세부로만 취급 |
CNCF의 설명도 IDP, internal developer portal, PaaS를 구분하면서 좋은 IDP가 underlying technology를 완전히 접근 불가능하게 만들어서는 안 된다고 정리한다. 출처: https://www.cncf.io/blog/2023/12/08/internal-developer-platform-vs-internal-developer-portal-vs-paas/
IDP는 “처음부터 풀스택 플랫폼을 구축하자”가 아니라 “반복 요청 하나를 제품처럼 만들자”에서 시작하는 편이 안전하다.
요청 빈도가 낮고 실수 비용이 작으면 문서와 체크리스트부터 시작한다.
분기 1~2회, 담당자가 명확하고 자동화 비용이 더 클 때.정해진 파라미터로 반복 작업을 실행하면 되는 단계.
repo 생성, preview 환경 생성, 단순 배포처럼 입력이 적을 때.인프라 표준화를 먼저 해야 하는 단계.
DB, queue, bucket, IAM role 같은 리소스 생성 편차가 문제일 때.포탈보다 빠르게 셀프서비스 경험을 검증하는 단계.
개발자가 이미 터미널이나 Slack에서 작업을 시작할 때.카탈로그, 템플릿, 문서, 플러그인을 한 진입점에 모을 단계.
서비스 수와 팀 수가 늘어 탐색과 표준화가 병목일 때.포탈 유지보수보다 기능 설계와 운영 지표에 집중하고 싶을 때.
Backstage 업그레이드와 플러그인 호환성 비용이 팀을 압도할 때.선택 기준은 도구의 인기도가 아니라 병목의 위치다.
IDP는 자동화와 제품 운영이 함께 있어야 한다. 다음 반례는 IDP 논의에서 자주 보이는 함정이다.
Backstage 화면은 있고 “새 DB 요청” 버튼도 있지만, 버튼을 누르면 Jira 티켓이 생기고 사람이 처리한다. 개발자는 예전보다 클릭만 늘었다고 느낀다. 이 상태는 IDP가 아니라 티켓 작성 UI다.
팀마다 템플릿을 복사해 고치면서 nestjs-template-v1, nestjs-template-v2, nestjs-template-team-a, nestjs-template-old가 생긴다. 어느 것이 최신인지 모르면 Golden Path가 아니라 template sprawl이다. 템플릿을 늘리기 전에 parameter로 흡수할 차이와 정말 별도 경로가 필요한 차이를 구분해야 한다.
서비스 생성은 클릭 한 번인데, preview 환경 삭제나 DB 제거는 담당자에게 DM해야 한다. 생성 자동화만 있고 폐기 자동화가 없으면 비용과 보안 리스크가 누적된다. IDP는 lifecycle 전체를 봐야 한다.
플러그인 호환성, React 코드, dependency upgrade, backend migration이 플랫폼 팀의 대부분 시간을 가져가면 IDP가 개발자 생산성을 높이기 전에 플랫폼 팀 생산성을 잡아먹는다. 작은 팀에서는 관리형 서비스나 단순 workflow가 더 나을 수 있다.
개발자는 “Postgres 필요”만 선언했는데, 플랫폼이 만든 security group, secret, backup 정책을 관찰할 방법이 없다. 이때 설정이 빠져도 포탈에는 성공으로 보인다. 추상화가 높을수록 hidden How를 점검하는 링크와 로그가 필요하다.
포탈은 있지만 개발자가 계속 Slack으로 요청한다. 보통 이유는 둘 중 하나다. 기존 방식보다 느리거나, 실패했을 때 원인을 더 알기 어렵다. 도입률은 공지 횟수가 아니라 실제 성공 경험으로 올라간다.
IDP에서 가장 위험한 실패는 명확한 에러가 아니라 조용한 누락이다. 템플릿 실행은 성공했지만 보안 그룹, secret, alert, 카탈로그 링크가 빠지는 식이다.
| 시나리오 | 포탈에서 보이는 상태 | 실제 문제 | 먼저 확인할 것 |
|---|---|---|---|
| 보안 그룹 누락 | 서비스 URL 접근 가능 | 허용 범위가 과도하거나 포트가 틀림 | Terraform plan, cloud security rule, policy 결과 |
| secret 미연결 | 배포 성공 | 런타임에서 DB 접속 실패 | secret reference와 실제 secret 존재 여부 |
| Argo CD 미연결 | 카탈로그 카드 생성 | 배포 상태를 포탈에서 못 봄 | argocd/app-name annotation과 Application 이름 |
| TechDocs 없음 | 서비스 카드 있음 | 운영 문서가 비어 있음 | backstage.io/techdocs-ref, mkdocs.yml, docs 경로 |
| owner 누락 | 검색은 됨 | 사고 때 담당 팀을 못 찾음 | catalog spec.owner, group entity |
| scorecard gaming | 점수 높음 | 실제 알림과 SLO는 작동 안 함 | 항목별 증거 링크와 최근 실행 시간 |
silent failure는 정책 위반을 “나중에 사람이 알게 되는 구조”에서 많이 생긴다. 사전 차단과 사후 감지를 나눠서 설계해야 한다.
여기서 명령어보다 중요한 것은 순서다. 요청 입력 -> plan 검증 -> 리소스 생성 -> catalog 등록 -> 배포 상태 연결 -> scorecard 확인의 어느 단계가 실패했는지 분리해야 한다.
IDP 학습에서 자주 빠지는 부분이 삭제와 폐기다. 새 서비스 생성은 멋져 보이지만, 더 이상 쓰지 않는 preview 환경, 임시 DB, 실험용 queue가 남으면 비용과 권한 표면이 계속 커진다.
예를 들어 pr-142-user-service preview 환경을 만든다고 하자.
| 생성 때 만든 것 | 폐기 때 해야 할 것 | 남으면 생기는 문제 |
|---|---|---|
| preview namespace | namespace 삭제 또는 TTL controller 적용 | 사용하지 않는 pod와 secret 잔존 |
| 임시 DB | snapshot 정책 확인 후 삭제 | 비용 누적, 테스트 데이터 노출 |
| DNS record | record 제거 | 죽은 endpoint가 문서에 남음 |
| GitOps Application | manifest 제거와 prune | Argo CD가 계속 sync 시도 |
| catalog entity | lifecycle을 archived로 바꾸거나 제거 | stale catalog |
| alert/dashboard | owner와 함께 정리 | 알림 노이즈 |
좋은 IDP는 “create”와 “destroy”를 같은 수준의 제품 기능으로 본다. 생성 템플릿에는 owner, TTL, cost center, lifecycle 같은 메타데이터가 있어야 하고, 폐기 작업은 그 메타데이터를 기준으로 안전하게 수행되어야 한다.
반례도 있다. 프로덕션 DB처럼 삭제 비용이 큰 리소스는 셀프서비스 destroy 버튼이 위험할 수 있다. 이 경우 IDP는 삭제 버튼을 없애는 대신 archive 요청, snapshot 확인, 승인, 변경 기록을 표준화한다. 즉 셀프서비스는 “무조건 자동 승인”이 아니라 “반복 가능한 안전 절차”다.
IDP 구축은 대개 다음 순서가 덜 위험하다.
처음부터 “완성형 IDP”를 만들려고 하면 범위가 커진다. 서비스 카탈로그, 템플릿, 정책, GitOps, secret, scorecard, docs를 한 번에 완성하려다 아무것도 실제 사용되지 않는 경우가 많다.
작은 MVP의 예시는 다음과 같다.
| MVP | 포함할 것 | 제외해도 되는 것 |
|---|---|---|
| 새 repo + CI 생성 | repo, CODEOWNERS, CI workflow, catalog-info | 자동 DB, 포탈 UI |
| preview 환경 생성 | branch 입력, namespace, GitOps app, TTL | 모든 cloud 리소스 |
| 표준 DB 요청 | Terraform module, secret reference, policy check | Backstage plugin |
| 서비스 카탈로그 | owner, repo, docs, deploy link | scorecard 자동화 |
MVP가 성공했는지 보려면 “기능을 만들었다”가 아니라 “개발자가 기존 요청 경로로 돌아가지 않는다”를 확인해야 한다.
IDP 성공은 설치된 플러그인 수로 측정하지 않는다. 개발자의 흐름이 실제로 좋아졌는지를 봐야 한다.
| 지표 | 무엇을 묻나 | 좋은 방향 | 해석할 때 조심할 점 |
|---|---|---|---|
| 첫 배포까지 시간 | 새 서비스 생성 후 첫 prod 배포까지 얼마나 걸리나 | 감소 | 속도만 빨라지고 실패율이 오르면 위험 |
| 수동 요청 건수 | 플랫폼 팀에 들어오는 반복 요청이 줄었나 | 감소 | 요청이 다른 채널로 숨어들 수 있음 |
| Golden Path 채택률 | 표준 경로를 쓰는 서비스 비율 | 증가 | 강제 사용이면 만족도와 함께 봐야 함 |
| 템플릿 성공률 | 실행된 템플릿이 끝까지 성공하나 | 증가 | 부분 성공과 정리 실패를 분리해야 함 |
| 변경 실패율 | IDP 경로로 만든 배포가 사고를 늘리나 | 감소 또는 안정 | 빠른 배포가 검증을 건너뛰는지 확인 |
| 개발자 만족도 | 실제 사용자가 덜 막히는가 | 증가 | 설문보다 인터뷰와 행동 로그를 같이 본다 |
| 플랫폼 팀 로드 | 반복 지원 시간이 줄었나 | 감소 | 줄어든 시간이 새 기능으로 전환되는지 본다 |
DORA 지표는 IDP의 효과를 설명하는 데 유용하지만, 팀 순위표로 쓰면 왜곡된다. DORA 공식 문서는 지표를 단일 목표로 삼거나 서로 다른 애플리케이션을 단순 비교하는 것을 흔한 함정으로 경고한다. 출처: https://dora.dev/guides/dora-metrics/
예를 들어 user-service의 리드 타임이 2일에서 4시간으로 줄었지만 변경 실패율이 3%에서 12%로 올랐다면, 플랫폼은 성공한 것이 아니라 검증 단계를 너무 많이 숨긴 것이다. 이때는 기능 추가보다 템플릿의 테스트, 보안 스캔, rollback, 관측 링크를 먼저 보강해야 한다.
긴 트러블슈팅 명령보다 먼저 봐야 할 것은 실패 신호가 어떤 개념의 실패인지다.
| 증상 | 깨진 개념 | 왜 문제인가 | 첫 확인 |
|---|---|---|---|
| 포탈은 성공인데 인프라가 없다 | 오케스트레이션 결과 검증 | 단계별 성공을 하나로 뭉갰다 | 템플릿 실행 로그와 리소스 ID |
| 카탈로그에 서비스가 있는데 owner가 없다 | 서비스 카탈로그 계약 | 사고 때 책임 경로가 끊긴다 | spec.owner와 group entity |
| Argo CD 상태가 포탈에 안 보인다 | 배포 상태 연결 | 생성과 운영이 분리된다 | annotation과 Application 이름 |
| TechDocs 탭이 비어 있다 | 문서와 서비스 연결 | 온보딩과 장애 대응 지식이 흩어진다 | techdocs-ref, docs 경로 |
| 개발자가 계속 Slack으로 요청한다 | 채택과 제품성 | 셀프서비스가 기존 방식보다 불편하다 | 비채택자 인터뷰 3명 |
| 템플릿이 팀별로 fork된다 | Golden Path 설계 | 표준이 실제 요구를 못 담는다 | fork 이유와 parameter 후보 |
| scorecard 점수만 높다 | guardrail의 증거성 | 체크가 실제 운영 상태를 반영하지 않는다 | 항목별 증거 링크와 최근성 |
| Backstage 업그레이드만 하다 분기가 끝난다 | 도구 유지보수 비용 | 플랫폼 제품 개발이 멈춘다 | 유지보수 시간/기능 개발 시간 비율 |
| preview 환경 비용이 계속 오른다 | lifecycle 관리 | 생성 자동화만 있고 폐기가 없다 | TTL, owner, archived 상태 |
이 표의 “첫 확인”은 실전 런북이 아니라 학습용 관찰 시작점이다. 실제 복구 명령은 조직 도구와 권한에 따라 달라진다.
Backstage 운영에는 많은 설치·플러그인 문제가 있지만, 첫 학습 문서에서 긴 디버그 절차를 외울 필요는 없다. 대신 각 문제가 어떤 IDP 개념을 건드리는지 연결하면 된다.
| 증상 | 개념 | 왜 생기나 | 먼저 볼 것 |
|---|---|---|---|
yarn install이 native module 오류로 실패 | 포탈 프레임워크 유지보수 비용 | Backstage는 Node/React 기반 앱이고 native dependency가 있다 | Node, Yarn, Python, Backstage 지원 버전 |
| 로그인 후 카탈로그가 비어 있다 | identity와 catalog 연결 | 인증된 사용자와 catalog User entity가 매핑되지 않았다 | sign-in resolver, User entity |
| TechDocs 빌드 실패 | 문서 포탈 계약 | repo에 문서 루트와 mkdocs.yml 계약이 없다 | backstage.io/techdocs-ref, docs_dir |
| Argo CD 플러그인 탭이 비어 있다 | 배포 상태 통합 | catalog annotation과 실제 Application 이름이 다르다 | argocd/app-name, token 권한 |
| 동적 플러그인이 안 뜬다 | 포탈 확장성의 운영 비용 | plugin 파일, app-config, backend system 버전이 맞지 않는다 | 시작 로그, plugin config, compatibility |
| 설치는 끝났지만 아무도 안 쓴다 | IDP adoption | 자동화 백엔드나 성공 경험이 부족하다 | 가장 많이 쓰는 기능 1개의 end-to-end 성공 |
Backstage 문제를 이런 식으로 읽으면 “어떤 명령을 쳐야 하지?”보다 “포탈, 카탈로그, identity, docs, deployment, adoption 중 무엇이 깨졌지?”를 먼저 판단할 수 있다.
실제 환경에서는 자세한 runbook이 필요하다. 하지만 공부 문서에서는 최소 관찰 지점만 알면 충분하다.
Backstage 카탈로그에 서비스가 등록되었는지 확인할 때는 UI만 보지 말고 Catalog API 결과를 함께 본다.
curl -s http://localhost:7007/api/catalog/entities/by-name/Component/default/user-service \ | jq '{name: .metadata.name, owner: .spec.owner, lifecycle: .spec.lifecycle}'예상 관찰:
{ "name": "user-service", "owner": "team-identity", "lifecycle": "production" }404라면 가능한 원인은 세 가지다.
catalog-info.yaml 파싱이 실패했다.kind, namespace, metadata.name 중 하나가 기대와 다르다.이 관찰은 카탈로그 존재만 확인한다. repo, 배포, secret, monitoring이 정상이라는 뜻은 아니다.
IDP 템플릿이 Terraform을 실행한다면 apply 전에 plan JSON을 정책으로 검사할 수 있다.
terraform plan -out=tfplanterraform show -json tfplan > plan.jsonconftest test --policy ./policy plan.json학습 포인트는 명령 자체가 아니라 “생성 전에 정책을 검사한다”는 위치다. storage_encrypted = false, 0.0.0.0/0 과도 허용, owner tag 누락처럼 반복되는 실수는 템플릿 실행 뒤 사람이 발견하는 것보다 plan 단계에서 막는 편이 낫다.
Backstage를 로컬에 띄우는 실습의 목적은 “Backstage를 설치할 줄 안다”가 아니라 다음 네 가지를 눈으로 확인하는 것이다.
설치 중 dependency 오류가 나면 그 자체가 Backstage DIY 비용의 예시다. 이 문서의 본문 흐름을 이해하는 데 설치 성공은 필수가 아니다.
IDP 분야는 Backstage, Port, Humanitec, Cortex, Roadie, Kratix, Crossplane, Score, Argo CD, Kyverno 같은 도구와 사례가 빠르게 바뀐다. 특정 연도의 예측이나 벤더 보고서 수치는 조사 시점, 응답자 구성, 마케팅 맥락에 따라 달라질 수 있다. 따라서 이 문서에서는 최신성 단정보다 판단 질문을 남긴다.
기존 문서에서 다룬 사례들은 다음 학습 질문으로 읽으면 좋다.
| 사례/자료 | 읽을 질문 |
|---|---|
| AWS IDP Prescriptive Guidance | 어떤 AWS 서비스 조합으로 IDP 책임을 나눌 수 있는가 |
| Backstage Software Templates | 템플릿의 성공/실패 경계를 어떻게 표현하는가 |
| Zepto, Zalando, DoorDash, Slack 같은 기업 사례 | 규모가 커졌을 때 카탈로그, 배포, 표준화, 채택 문제가 어떻게 나타나는가 |
| platformengineering.org/Fairwinds/Roadie 글 | 실패 패턴, build-vs-buy, DIY 유지보수 비용을 어떤 질문으로 검토할 것인가 |
| DORA 가이드 | 속도 지표와 안정성 지표를 함께 봐야 하는 이유는 무엇인가 |
AI 에이전트가 플랫폼 API를 호출하는 흐름도 생태계 맥락으로 볼 수 있다. 핵심은 “AI가 포탈을 대체한다”가 아니라, 사람이 누르든 에이전트가 호출하든 같은 Golden Path, 같은 권한, 같은 감사 로그, 같은 quota를 통과해야 한다는 점이다.
IDP는 다음 상황에서 직접적인 가치가 있다.
여기서 중요한 것은 모든 것을 한 번에 하는 것이 아니다. 지금 조직에서 가장 많이 반복되는 요청 하나를 IDP 후보로 삼는 것이 출발점이다.
BackOps나 운영 지원 경험은 IDP 설계와 잘 연결된다. 이미 반복 요청, 배포 실패, 권한 누락, 알림 누락, 문서 부재를 가까이에서 봤기 때문이다.
현재 업무에서 바로 해볼 수 있는 질문은 다음과 같다.
이 질문에 답하면 거대한 IDP 기획서보다 작은 Golden Path 후보가 먼저 보인다.
IDP 경험은 운영 지식을 제품 엔지니어링과 플랫폼 엔지니어링 사이에 연결하는 증거가 된다. 단순히 “Backstage를 설치했다”보다 더 강한 증거는 다음과 같다.
| 경험 | 더 강한 증거 |
|---|---|
| 반복 요청을 처리했다 | 반복 요청을 셀프서비스화하고 대기 시간을 줄였다 |
| Terraform module을 만들었다 | 개발자가 안전하게 쓸 수 있는 입력 계약과 정책 검사를 붙였다 |
| 배포 파이프라인을 만들었다 | 첫 배포까지 시간과 변경 실패율을 함께 개선했다 |
| 서비스 카탈로그를 만들었다 | owner, docs, deploy, alert 링크의 stale 상태를 줄였다 |
| 포탈을 만들었다 | 실제 채택률과 수동 요청 감소를 측정했다 |
Product Engineering 관점에서는 IDP도 제품이다. 사용자가 개발자일 뿐, 문제 발견, MVP, 채택, 피드백, 지표, 유지보수의 루프는 같다.
| 헷갈리는 표현 | 정확히 구분할 점 |
|---|---|
| IDP = Backstage | Backstage는 구현 옵션이다. IDP는 자동화·정책·카탈로그·운영 경험 전체다. |
| 셀프서비스 = 무제한 권한 | 셀프서비스는 승인된 guardrail 안에서 기다림 없이 실행하는 것이다. |
| Golden Path = 강제 표준 | Golden Path는 기본 경로다. 예외 경로와 escape hatch가 있어야 한다. |
| 카탈로그 = 실제 상태 | 카탈로그는 metadata다. 실제 repo, deployment, infra 상태와 drift가 생길 수 있다. |
| 템플릿 성공 = 서비스 준비 완료 | 템플릿은 시작일 뿐이다. 배포, secret, monitoring, docs, teardown까지 봐야 한다. |
| scorecard 높음 = 운영 안전 | 점수가 실제 증거와 연결되지 않으면 게임화될 수 있다. |
| 포탈 설치 = 채택 | 개발자가 기존보다 빨리 성공해야 채택된다. |
퀴즈
힌트: 카탈로그 등록, repo 생성, 실제 클라우드 리소스 상태는 같은 것이 아니다.
플랫폼 silent failure다. 포탈의 실행 성공과 실제 인프라 정책 적용 여부를 분리해서 검증해야 한다. 템플릿 로그, Terraform plan 결과, cloud 정책 검사, catalog metadata를 각각 확인해야 한다.
Backstage, Port, Cortex, Roadie, Humanitec, Kratix, Crossplane, Score, Platform Orchestrator, Golden Path, Service Catalog, Software Template, Scaffolder, TechDocs, Scorecard, OPA, Conftest, Kyverno, Argo CD, External Secrets