Platform Engineering focuses on building and maintaining Internal Developer Platforms (IDPs) that enable self-service capabilities for development teams. By abstracting infrastructure complexity, platform teams accelerate delivery while maintaining governance and security.
What is an Internal Developer Platform?
An IDP is a layer on top of existing infrastructure that provides developers with self-service access to environments, deployments, and resources through golden paths – pre-approved, standardized workflows.
IDP Components
- Service Catalog: Templates for creating new services
- Environment Management: Self-service environment provisioning
- CI/CD Integration: Standardized deployment pipelines
- Observability: Built-in monitoring and logging
- Developer Portal: Single pane of glass for all services
Backstage Developer Portal
# catalog-info.yaml - Service definition
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: payment-service
description: Payment processing microservice
annotations:
github.com/project-slug: company/payment-service
backstage.io/techdocs-ref: dir:.
spec:
type: service
lifecycle: production
owner: team-payments
system: checkout
providesApis:
- payment-api
dependsOn:
- component:user-service
- resource:payments-dbSoftware Templates
# template.yaml - New service template
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: microservice-template
title: Create Microservice
description: Create a new microservice with CI/CD
spec:
owner: platform-team
type: service
parameters:
- title: Service Details
required: [name, owner]
properties:
name:
title: Service Name
type: string
pattern: '^[a-z0-9-]+$'
owner:
title: Owner Team
type: string
ui:field: OwnerPicker
language:
title: Language
type: string
enum: [python, go, nodejs]
steps:
- id: fetch
name: Fetch Template
action: fetch:template
input:
url: ./skeleton
values:
name: ${{ parameters.name }}
owner: ${{ parameters.owner }}
- id: publish
name: Create Repository
action: publish:github
input:
repoUrl: github.com?owner=company&repo=${{ parameters.name }}
- id: register
name: Register in Catalog
action: catalog:register
input:
repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }}
catalogInfoPath: /catalog-info.yamlCrossplane for Infrastructure
# Composite Resource Definition
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: databases.platform.company.com
spec:
group: platform.company.com
names:
kind: Database
plural: databases
versions:
- name: v1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
size:
type: string
enum: [small, medium, large]
engine:
type: string
enum: [postgres, mysql]
---
# Composition
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: database-aws
spec:
compositeTypeRef:
apiVersion: platform.company.com/v1
kind: Database
resources:
- name: rds
base:
apiVersion: rds.aws.crossplane.io/v1beta1
kind: Instance
spec:
forProvider:
region: us-east-1
dbInstanceClass: db.t3.medium
engine: postgres
masterUsername: adminDeveloper Self-Service
# Developer requests a database
apiVersion: platform.company.com/v1
kind: Database
metadata:
name: orders-db
namespace: orders-team
spec:
size: medium
engine: postgresPlatform Metrics
- Time to first deployment for new developers
- Lead time for changes
- Deployment frequency
- Platform adoption rate
- Developer satisfaction (NPS)
Conclusion
Platform Engineering reduces cognitive load on developers while maintaining security and compliance. By building golden paths with tools like Backstage and Crossplane, platform teams enable self-service without sacrificing governance.

