ai
Crossplane Composition CQRS Event Sourcing —
Crossplane CQRS Event Sourcing

Crossplane Composition CQRS Event Sourcing Kubernetes Infrastructure Cloud AWS Azure GCP GitOps ArgoCD Audit Trail Production
เนื้อหาเกี่ยวข้อง — ดูเพิ่มเติมเรื่อง Calico Network Policy Docker Container Deploy
| Pattern | Purpose | Implementation | Benefit |
|---|---|---|---|
| Crossplane Composition | รวม Resources เป็น Template | XRD + Composition YAML | Self-service Reusable |
| CQRS | แยก Read/Write | Command API + Query API | Scale แยก Optimize แยก |
| Event Sourcing | เก็บทุก Event | Event Store (PG/Kafka) | Audit Time Travel Debug |
| GitOps | Git เป็น Source of Truth | ArgoCD + Git Repository | Version Control Review |
Crossplane Composition
# === Crossplane Composition Example ===
# CompositeResourceDefinition (XRD)
# apiVersion: apiextensions.crossplane.io/v1
# kind: CompositeResourceDefinition
# metadata:
# name: xdatabases.platform.example.com
# spec:
# group: platform.example.com
# names:
# kind: XDatabase
# plural: xdatabases
# claimNames:
# kind: Database
# plural: databases
# versions:
# - name: v1alpha1
# schema:
# openAPIV3Schema:
# type: object
# properties:
# spec:
# type: object
# properties:
# engine: { type: string, enum: [postgres, mysql] }
# size: { type: string, enum: [small, medium, large] }
# region: { type: string }
# Composition
# apiVersion: apiextensions.crossplane.io/v1
# kind: Composition
# metadata:
# name: xdatabase-aws
# spec:
# compositeTypeRef:
# apiVersion: platform.example.com/v1alpha1
# kind: XDatabase
# resources:
# - name: rds-instance
# base:
# apiVersion: rds.aws.upbound.io/v1beta1
# kind: Instance
# spec:
# forProvider:
# engine: postgres
# instanceClass: db.t3.medium
# allocatedStorage: 20
from dataclasses import dataclass
@dataclass
class CompositionResource:
claim_param: str
small: str
medium: str
large: str
sizes = [
CompositionResource("Instance Class",
"db.t3.micro (2 vCPU 1GB)",
"db.t3.medium (2 vCPU 4GB)",
"db.r6g.large (2 vCPU 16GB)"),
CompositionResource("Storage",
"20GB gp3",
"100GB gp3",
"500GB io2"),
CompositionResource("Backup Retention",
"7 days",
"14 days",
"30 days"),
CompositionResource("Multi-AZ",
"false (Single AZ)",
"true (Multi-AZ)",
"true (Multi-AZ + Read Replica)"),
CompositionResource("Monitoring",
"Basic (CloudWatch)",
"Enhanced (60s interval)",
"Enhanced (1s) + Performance Insights"),
]
print("=== Database Composition Sizes ===")
for s in sizes:
print(f" [{s.claim_param}]")
print(f" Small: {s.small}")
print(f" Medium: {s.medium}")
print(f" Large: {s.large}")
CQRS + Event Sourcing

# === CQRS Event Sourcing for Infrastructure ===
# Event Types
# @dataclass
# class InfraEvent:
# event_id: str
# resource_id: str
# event_type: str
# payload: dict
# user: str
# timestamp: datetime
#
# events = [
# InfraEvent("evt-001", "db-prod-01", "ResourceCreated",
# {"engine": "postgres", "size": "medium", "region": "ap-southeast-1"},
# "dev-team", datetime(2025,1,15,10,0)),
# InfraEvent("evt-002", "db-prod-01", "ResourceScaled",
# {"old_size": "medium", "new_size": "large", "reason": "traffic spike"},
# "platform-team", datetime(2025,1,20,14,30)),
# ]
@dataclass
class EventType:
event: str
trigger: str
payload: str
read_model_update: str
events = [
EventType("ResourceCreated",
"Claim สร้างใหม่ → Crossplane สร้าง Resources",
"resource_id engine size region team",
"เพิ่ม Resource ใน Inventory + Dashboard"),
EventType("ResourceUpdated",
"Claim แก้ไข → Crossplane อัพเดท Resources",
"resource_id old_config new_config changed_by",
"อัพเดท Config History + Timeline"),
EventType("ResourceScaled",
"Scale Request → Composition Patch",
"resource_id old_size new_size reason",
"อัพเดท Capacity Dashboard + Cost"),
EventType("ResourceFailed",
"Crossplane detect Resource unhealthy",
"resource_id error_message severity",
"อัพเดท Health Dashboard + Alert"),
EventType("DriftDetected",
"Crossplane detect Configuration Drift",
"resource_id expected_state actual_state",
"อัพเดท Compliance Dashboard + Alert"),
EventType("ResourceDeleted",
"Claim ลบ → Crossplane ลบ Resources",
"resource_id deleted_by reason",
"ลบจาก Inventory + Archive Event"),
]
print("=== Infrastructure Events ===")
for e in events:
print(f" [{e.event}] Trigger: {e.trigger}")
print(f" Payload: {e.payload}")
print(f" Read Model: {e.read_model_update}")
Production Architecture
# === Production Stack ===
@dataclass
class ArchComponent:
component: str
tool: str
role: str
scaling: str
architecture = [
ArchComponent("GitOps",
"ArgoCD + Git Repository",
"Source of Truth สำหรับ Crossplane Compositions Claims",
"ArgoCD HA 3 replicas"),
ArchComponent("Control Plane",
"Crossplane + Providers",
"Reconcile Claims → Cloud Resources",
"Crossplane Pods HA + Provider Pods"),
ArchComponent("Event Capture",
"Custom Controller (Kubebuilder)",
"Watch Crossplane Resources → Publish Events",
"Controller HA 2 replicas"),
ArchComponent("Event Store",
"Apache Kafka (3 brokers)",
"Store Infrastructure Events Durable Ordered",
"Kafka Cluster 3+ brokers"),
ArchComponent("Read Model",
"PostgreSQL + Materialized Views",
"Optimized Read Model สำหรับ Dashboard API",
"PostgreSQL HA Primary + Replica"),
ArchComponent("Dashboard",
"Grafana + Custom UI (React)",
"Infrastructure Inventory Timeline Audit Compliance",
"Grafana HA + CDN for UI"),
]
print("=== Production Architecture ===")
for a in architecture:
print(f" [{a.component}] Tool: {a.tool}")
print(f" Role: {a.role}")
print(f" Scale: {a.scaling}")
เคล็ดลับ
- Composition: สร้าง Composition Template สำหรับทุก Resource ที่ใช้บ่อย
- Claim: ให้ Developer ใช้ Claim ไม่ต้องรู้ Implementation
- Events: เก็บทุก Event ใน Kafka สำหรับ Audit Trail
- GitOps: ใช้ ArgoCD Sync Crossplane Resources จาก Git
- Drift: ตรวจ Drift อัตโนมัติ Alert เมื่อ State ไม่ตรง
Crossplane คืออะไร
Open Source IaC Kubernetes API Cloud AWS Azure GCP Providers Compositions XRD Claim Self-service GitOps ArgoCD Multi-cloud
แนะนำเพิ่มเติม — SiamCafeBook
เนื้อหาเกี่ยวข้อง — อ่านต่อ: Rust Tokio SSL TLS Certificate
เนื้อหาเกี่ยวข้อง — Kustomize Overlay กับ Hexagonal Architecture —





