플랫폼 엔지니어링
개발자가 자율적으로 인프라를 사용할 수 있는 내부 개발자 플랫폼 구축
개발자가 자율적으로 인프라를 사용할 수 있는 내부 개발자 플랫폼 구축
목표: 개발자 경험을 향상시키고 운영 부담을 줄이는 플랫폼을 설계할 수 있는 수준
🎯 플랫폼 엔지니어링 개요
개념
graph TB
subgraph "전통적 방식"
DEV["👨💻 개발자"] -->|"티켓"| OPS["⚙️ 운영팀"]
OPS -->|"수동"| INFRA["🏗️ 인프라"]
end
subgraph "플랫폼 엔지니어링"
DEV2["👨💻 개발자"] -->|"Self-Service"| PLATFORM["🛠️ Platform"]
PLATFORM -->|"자동화"| INFRA2["🏗️ 인프라"]
PLATFORM -->|"Golden Path"| DEV2
end
핵심 원리:
- 셀프 서비스: 개발자가 직접 인프라 프로비저닝
- 골든 패스: 표준화된 워크플로우 제공
- 내부 복잡성 추상화: 복잡한 인프라 숨김
- 개발자 경험: DX 최적화
🏗️ 내부 개발자 플랫폼 (IDP)
아키텍처
graph TB
subgraph "IDP"
PORTAL["🌐 Developer Portal"] -->|"API"| BACKEND["🔧 Platform Backend"]
BACKEND -->|"Orchestration"| GITOPS["🔄 GitOps"]
BACKEND -->|"Provisioning"| TF["🏗️ Terraform"]
BACKEND -->|"Deployment"| K8S["☸️ Kubernetes"]
GITOPS -->|"Apply"| K8S
TF -->|"Create"| CLOUD["☁️ Cloud"]
end
subgraph "개발자"
DEV["👨💻 개발자"] -->|"Self-Service"| PORTAL
end
주요 구성 요소
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| Developer Portal | 셀프 서비스 UI | Backstage, Port |
| Service Catalog | 서비스 목록 | Backstage Catalog |
| Scaffolder | 프로젝트 템플릿 | Cookiecutter |
| GitOps | 배포 자동화 | ArgoCD, Flux |
| IaC | 인프라 프로비저닝 | Terraform, Pulumi |
| Policy Engine | 정책 적용 | OPA, Kyverno |
🛠️ Backstage
설치
# Backstage 앱 생성
npx @backstage/create-app@latest
# 개발 서버 실행
cd my-backstage-app
yarn dev
엔티티 등록
# catalog-info.yaml
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: my-service
description: My microservice
annotations:
github.com/project-slug: myorg/my-service
argocd/app-name: my-service
grafana/dashboard-selector: "tags @> 'my-service'"
spec:
type: service
lifecycle: production
owner: team-platform
system: payment-system
dependsOn:
- component:database
- resource:redis
템플릿
# template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: microservice-template
title: Microservice Template
description: Create a new microservice
spec:
owner: team-platform
type: service
parameters:
- title: Service Information
required:
- name
- owner
properties:
name:
title: Name
type: string
owner:
title: Owner
type: string
ui:field: OwnerPicker
- title: Infrastructure
properties:
database:
title: Database
type: string
enum: ['postgresql', 'mysql', 'none']
cache:
title: Cache
type: boolean
steps:
- id: fetch-base
name: Fetch Base
action: fetch:template
input:
url: ./skeleton
values:
name: ${{ parameters.name }}
owner: ${{ parameters.owner }}
- id: publish
name: Publish
action: publish:github
input:
allowedHosts: ['github.com']
description: ${{ parameters.description }}
repoUrl: github.com?owner=myorg&repo=${{ parameters.name }}
- id: register
name: Register
action: catalog:register
input:
repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }}
catalogInfoPath: '/catalog-info.yaml'
📋 플랫폼 성숙도 모델
레벨 1: 수동
graph LR
DEV["개발자"] -->|"문서"| OPS["운영팀"]
OPS -->|"수동"| INFRA["인프라"]
- 문서 기반 프로세스
- 수동 승인 필요
- 긴 리드타임
레벨 2: 반자동
graph LR
DEV["개발자"] -->|"스크립트"| INFRA["인프라"]
INFRA -->|"검토"| OPS["운영팀"]
- 자동화된 스크립트
- 수동 검토 필요
- 부분적 셀프 서비스
레벨 3: 자동
graph LR
DEV["개발자"] -->|"Self-Service"| PLATFORM["플랫폼"]
PLATFORM -->|"자동"| INFRA["인프라"]
- 완전한 셀프 서비스
- 정책 기반 제어
- 골든 패스 제공
📋 체크리스트
- 플랫폼 엔지니어링 이해
- IDP 아키텍처 설계
- Backstage 설치
- 서비스 카탈로그 구성
- 템플릿 작성
- 셀프 서비스 구현
- 골든 패스 정의
- 정책 엔진 설정
- 모니터링 구성
- 개발자 온볇ィング
🔗 관련 노트
- 03-01-GitOps-원칙 — GitOps
- 03-09-GitOps-ArgoCD — ArgoCD
- 01-05-인프라코드-Terraform — Terraform
마지막 업데이트: 2026-06-01