1. Pengenalan CloudFormation
AWS CloudFormation adalah layanan AWS yang memungkinkan Anda mendefinisikan infrastruktur cloud sebagai kode (Infrastructure as Code / IaC). Dengan CloudFormation, Anda dapat mendeskripsikan seluruh sumber daya AWS β EC2, RDS, VPC, S3, dan lainnya β dalam file template yang version-controlled, reproducible, dan auditable.
Konsep utamanya sederhana: Anda menulis template (dalam format YAML atau JSON) yang mendefinisikan infrastruktur yang diinginkan, lalu CloudFormation akan membuat, memperbarui, atau menghapus resource tersebut secara otomatis sesuai template. Ini menghilangkan konfigurasi manual melalui console dan memastikan infrastruktur dapat direplikasi secara konsisten.
Mengapa CloudFormation?
| Keunggulan | Penjelasan |
|---|---|
| Infrastructure as Code | Infrastruktur didefinisikan dalam kode yang bisa di-review, version, dan audit |
| Reproducibility | Buat environment identik berkali-kali dengan template yang sama |
| Automation | Provisioning dan teardown infrastruktur sepenuhnya otomatis |
| Dependency Management | CloudFormation otomatis menentukan urutan pembuatan resource |
| Rollback | Jika deploy gagal, semua perubahan di-rollback secara otomatis |
| Change Tracking | Setiap perubahan infrastructure tercatat dan bisa di-audit |
| Drift Detection | Detect perubahan manual di luar CloudFormation |
Template (YAML/JSON) .yaml / .json
β CloudFormation Service
/"1. Parse template"/
/"2. Validate resources"/
/"3. Create change set"/
/"4. Execute changes"/
/"5. Track stack state"/
Resources
/"EC2"/
/"VPC"/
/"Security Grps"/
/"RDS"/
/"S3"/
/"ElastiCache"/
/"π¦ Stack Tracking semua resource yang dibuat sta..."/
/"Resource Physical IDs"/
/"Status (CREATE_COMPLETEβ¦)"/
/"Event History"/
Perbandingan CloudFormation dengan tools IaC lain:
| Fitur | CloudFormation | Terraform | Pulumi |
|---|---|---|---|
| Vendor | AWS only | Multi-cloud | Multi-cloud |
| Bahasa | YAML/JSON | HCL | Python/TypeScript/Go |
| State Management | Managed oleh AWS | Self-managed | Managed atau self |
| Cost | Gratis (bayar resource) | Open-source | Open-source |
| Custom Resources | Lambda-backed | Providers | Native code |
Jika infrastruktur Anda 100% AWS, CloudFormation adalah pilihan yang sangat baik karena terintegrasi penuh dengan seluruh layanan AWS dan tidak memerlukan state management eksternal. Jika multi-cloud, pertimbangkan Terraform atau Pulumi.
2. Konsep Dasar: Resources, Parameters, Outputs
CloudFormation template terdiri dari beberapa komponen utama yang masing-masing memiliki peran penting dalam mendefinisikan infrastruktur Anda.
Bagian Utama Template
Resources β Komponen Wajib
Resources adalah satu-satunya bagian wajib dalam template. Setiap resource merepresentasikan satu AWS service resource yang akan dibuat. Setiap resource memiliki tipe (misalnya AWS::EC2::Instance) dan properti spesifik.
Commands untuk Stack Sets
# Buat Stack Set
aws cloudformation create-stack-set \
--stack-set-name SharedSecurityPolicies \
--template-body file://shared-policies.yaml \
--description "Security policies untuk semua akun" \
--permission-model SELF_MANAGED \
--administration-role-arn arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole \
--execution-role-name AWSCloudFormationStackSetExecutionRole
# Deploy ke target accounts/regions
aws cloudformation create-instances-from-stack-set \
--stack-set-name SharedSecurityPolicies \
--accounts '["111111111111","222222222222"]' \
--regions '["us-east-1","us-west-2","eu-west-1"]'
# Cek status deployment
aws cloudformation list-stack-instances \
--stack-set-name SharedSecurityPolicies
# Update Stack Set
aws cloudformation update-stack-set \
--stack-set-name SharedSecurityPolicies \
--template-body file://shared-policies-v2.yaml \
--accounts '["111111111111","222222222222"]' \
--regions '["us-east-1","us-west-2"]'
# Hapus Stack Set
aws cloudformation delete-stack-instances \
--stack-set-name SharedSecurityPolicies \
--accounts '["111111111111"]' \
--regions '["us-east-1"]' \
--retain-resources NONE
aws cloudformation delete-stack-set \
--stack-set-name SharedSecurityPolicies
9. Drift Detection
Drift Detection adalah fitur CloudFormation yang mendeteksi apakah resource dalam stack telah diubah secara manual di luar CloudFormation. Perubahan manual ini disebut "drift" dan bisa menyebabkan ketidaksesuaian antara state aktual infrastruktur dengan state yang tercatat di CloudFormation.
Mengapa Drift Detection Penting?
| Aspek | Penjelasan |
|---|---|
| Konsistensi | Pastikan infrastruktur sesuai template, bukan diubah manual |
| Security | Detect perubahan keamanan yang tidak diinginkan (misalnya SG dibuka) |
| Compliance | Memastikan infrastruktur comply dengan standar organisasi |
| Troubleshooting | Mencari tahu mengapa stack gagal update karena perubahan manual |
| Audit | Melacak siapa yang mengubah infrastruktur di luar prosedur |
Menjalankan Drift Detection
# Mulai drift detection
aws cloudformation detect-stack-resource-drift \
--stack-name my-web-stack
# Atau deteksi drift untuk semua resource dalam stack
DRIFT_DETECTION_ID=$(aws cloudformation detect-stack-drift \
--stack-name my-web-stack \
--query 'StackDriftDetectionId' \
--output text)
echo "Detection ID: $DRIFT_DETECTION_ID"
# Cek status drift detection
aws cloudformation describe-stack-drift-detection-status \
--stack-drift-detection-id $DRIFT_DETECTION_ID
# Lihat detail drift
aws cloudformation describe-stack-resource-drifts \
--stack-name my-web-stack \
--stack-resource-drift-status-filters MODIFIED DELETED
# Output detail drift:
# StackResourceDrift:
# - LogicalResourceId: WebSecurityGroup
# ResourceType: AWS::EC2::SecurityGroup
# StackResourceDriftStatus: MODIFIED
# ActualProperties: '{"SecurityGroupIngress": [...443, 80, 22...]}'
# ExpectedProperties: '{"SecurityGroupIngress": [...80, 443, 22...]}'
# PropertyDifferences:
# - PropertyPath: "/SecurityGroupIngress/1/FromPort"
# ExpectedValue: "443"
# ActualValue: "8443"
# DifferenceType: NOT_EQUAL
# Batch detect untuk semua stack
aws cloudformation list-stack-resource-drifts \
--stack-name my-web-stack \
--stack-resource-drift-status-filters MODIFIED
Perbedaan Resource Status
| Status | Arti |
|---|---|
IN_SYNC | Resource sesuai dengan template β tidak ada drift |
MODIFIED | Resource telah diubah secara manual di luar CloudFormation |
DELETED | Resource telah dihapus secara manual di luar CloudFormation |
Auto-Remediation untuk Drift
# Option 1: Update stack untuk sync kembali ke template
# CloudFormation akan mengembalikan resource ke state template
aws cloudformation update-stack \
--stack-name my-web-stack \
--use-previous-template
# Option 2: Import resource yang di-drift
# Jika ingin mengadopsi perubahan manual ke template
aws cloudformation import-resources-to-stack \
--stack-name my-web-stack \
--resource-identifiers \
'ResourceType=AWS::EC2::SecurityGroup,LogicalResourceId=WebServerSG,ResourceIdentifier=sg-0123456789abcdef'
# Option 3: Auto-remediation dengan EventBridge
# Trigger drift detection otomatis via schedule
aws events put-rule \
--name "MonthlyDriftDetection" \
--schedule-expression "cron(0 1 1 * ? *)" \
--description "Deteksi drift bulanan"
# Script remediation otomatis
cat << 'EOF' > remediate-drift.sh
#!/bin/bash
STACK_NAME=$1
DRIFT_ID=$(aws cloudformation detect-stack-drift \
--stack-name $STACK_NAME \
--query 'StackDriftDetectionId' --output text)
aws cloudformation wait stack-drift-detection-complete \
--stack-drift-detection-id $DRIFT_ID
DRIFT_STATUS=$(aws cloudformation describe-stack-drift-detection-status \
--stack-drift-detection-id $DRIFT_ID \
--query 'DetectionStatus' --output text)
if [ "$DRIFT_STATUS" = "DETECTION_COMPLETE" ]; then
MODIFIED=$(aws cloudformation describe-stack-resource-drifts \
--stack-name $STACK_NAME \
--stack-resource-drift-status-filters MODIFIED \
--query 'length(StackResourceDrifts)' --output text)
if [ "$MODIFIED" -gt "0" ]; then
echo "Drift detected! Resources modified: $MODIFIED"
aws cloudformation update-stack \
--stack-name $STACK_NAME \
--use-previous-template
fi
fi
EOF
Tidak semua resource type didukung oleh drift detection. Beberapa properti juga tidak bisa di-detect. Selalu cek dokumentasi AWS untuk resource type yang ingin Anda monitor. Drift detection tersedia gratis β Anda hanya membayar untuk API calls.
10. Nested Stacks
Nested Stacks memungkinkan Anda membuat stack dari stack lain β template induk (parent) mereferensikan child stack melalui AWS::CloudFormation::Stack. Ini membantu memecah template besar menjadi modul-modul yang lebih kecil dan reusible.
Konsep Nested Stacks
π¦ Parent Stack: MainInfrastructure DependsOn β ...
VPCStack vpc.yaml
ComputeStack compute.yaml
DatabaseStack database.yaml
MonitoringStack monitoring.yaml
VPC Stack VPC, Subnets, IGW Route Tables, NAT O...
Compute Stack EC2, ALB, ASG Launch Templates In...
Database Stack RDS, Subnet Group Security Group...
/"Key Points: β’ Parent mereferensi child via AWS:..."/
# Template Parent (main.yaml)
AWSTemplateFormatVersion: '2010-09-09'
Description: Main Infrastructure Stack
Parameters:
EnvironmentName:
Type: String
Default: dev
Resources:
VPCStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://s3.amazonaws.com/my-templates/vpc.yaml
Parameters:
VpcCIDR: 10.0.0.0/16
EnvironmentName: !Ref EnvironmentName
ComputeStack:
Type: AWS::CloudFormation::Stack
DependsOn: VPCStack
Properties:
TemplateURL: https://s3.amazonaws.com/my-templates/compute.yaml
Parameters:
VPCId: !GetAtt VPCStack.Outputs.VPCId
SubnetId: !GetAtt VPCStack.Outputs.PublicSubnet1
InstanceType: t3.micro
DatabaseStack:
Type: AWS::CloudFormation::Stack
DependsOn: VPCStack
Properties:
TemplateURL: https://s3.amazonaws.com/my-templates/database.yaml
Parameters:
VPCId: !GetAtt VPCStack.Outputs.VPCId
SubnetIds: !GetAtt VPCStack.Outputs.PrivateSubnetIds
DBPassword: !Ref DBPassword
Outputs:
VPCId:
Value: !GetAtt VPCStack.Outputs.VPCId
WebServerIP:
Value: !GetAtt ComputeStack.Outputs.PublicIP
DatabaseEndpoint:
Value: !GetAtt DatabaseStack.Outputs.Endpoint
11. Best Practices
Struktur Template
| Best Practice | Penjelasan |
|---|---|
| Pisahkan environment | Gunakan parameter untuk mengontrol perbedaan dev/staging/prod |
| Gunakan nested stacks | Pecah template besar menjadi modul-modul kecil |
| Parameterize nilai | Jangan hardcode β gunakan parameters untuk values yang berubah |
| Output semua values | Export values penting untuk digunakan stack lain |
| Gunakan mappings | Untuk region-specific values seperti AMI IDs |
| Description yang jelas | Tulis description yang informatif untuk setiap template |
Keamanan
# 1. Gunakan NoEcho untuk secrets
DBPassword:
Type: String
NoEcho: true
MinLength: 12
# 2. Gunakan AWS Secrets Manager
DBSecret:
Type: AWS::SecretsManager::Secret
Properties:
Name: !Sub '${EnvironmentName}/database/credentials'
GenerateSecretString:
SecretStringTemplate: '{"username": "admin"}'
GenerateStringKey: password
PasswordLength: 32
ExcludeCharacters: '"@/\'
# 3. Gunakan KMS untuk encryption
EncryptedBucket:
Type: AWS::S3::Bucket
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: aws:kms
KMSMasterKeyID: !Ref KMSKey
# 4. VPC Endpoints untuk akses private
VPCEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3'
VpcId: !Ref VPC
RouteTableIds:
- !Ref PrivateRouteTable
# 5. Stack policy untuk proteksi resource kritis
# Simpan sebagai stack-policy.json:
# {
# "Statement": [
# {
# "Effect": "Deny",
# "Action": "Update:*",
# "Principal": "*",
# "Resource": "LogicalResourceId/DatabaseInstance",
# "Condition": {
# "StringEquals": {"ResourceType": "AWS::RDS::DBInstance"}
# }
# }
# ]
# }
Organisasi dan Naming
/"Rekomendasi Struktur Project:"/
/"templates/"/
/"main.yaml"/
/"vpc.yaml"/
/"compute.yaml"/
/"database.yaml"/
/"monitoring.yaml"/
/"security.yaml"/
/"parameters/"/
/"dev.json"/
/"staging.json"/
/"production.json"/
/"scripts/"/
/"deploy.sh"/
/"validate.sh"/
/"drift-check.sh"/
/"README.md"/
/".github/"/
/"workflows/"/
/"deploy.yml"/
CI/CD dengan CloudFormation
# GitHub Actions: Deploy CloudFormation
name: Deploy CloudFormation
on:
push:
branches: [main]
paths:
- 'templates/**'
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate templates
run: |
for f in templates/*.yaml; do
echo "Validating $f..."
aws cloudformation validate-template \
--template-body file://$f
done
deploy:
needs: validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to Dev
run: |
aws cloudformation deploy \
--template-file templates/main.yaml \
--stack-name my-app-dev \
--parameter-overrides file://parameters/dev.json \
--capabilities CAPABILITY_IAM \
--tags Environment=Dev Project=MyApp
- name: Run Tests
run: |
# Test endpoints
curl -f http://$(aws cloudformation describe-stacks \
--stack-name my-app-dev \
--query 'Stacks[0].Outputs[?OutputKey==`WebServerIP`].OutputValue' \
--output text)/health
- name: Deploy to Production
if: github.ref == 'refs/heads/main'
run: |
aws cloudformation deploy \
--template-file templates/main.yaml \
--stack-name my-app-production \
--parameter-overrides file://parameters/production.json \
--capabilities CAPABILITY_IAM \
--no-fail-on-empty-changeset \
--tags Environment=Production Project=MyApp
Cost Optimization Tips
| Tip | Detail |
|---|---|
| Gunakan CAPABILITY_AUTO_EXPAND | Untuk macro dan transforms β hati-hati karena bisa mengubah resource secara tidak terduga |
| Set termination protection | Hindari stack production terhapus secara tidak sengaja |
| Gunakan change sets | Selalu review perubahan sebelum execute |
| Monitoring drift | Jalankan drift detection secara berkala (weekly/monthly) |
| Tag semua resources | Memudahkan tracking cost per project/team |
| Cleanup unused stacks | Hapus stack yang sudah tidak digunakan untuk menghemat cost |
Gunakan CloudFormation Designer (tersedia di AWS Console) untuk visualisasi template secara grafis. Sangat membantu untuk memahami dependency antar resource, terutama untuk template yang kompleks dengan banyak resource.
12. Quiz Pemahaman
π Quiz: Pemahaman CloudFormation
1. Komponen manakah yang WAJIB ada dalam CloudFormation template?
2. Apa fungsi !Ref dalam CloudFormation?
3. Fitur apa yang mendeteksi perubahan manual pada resource AWS?
4. Untuk apa NoEcho: true digunakan pada parameter?
5. Apa keuntungan utama Change Sets?