β˜€οΈSiang
DevOps & Cloud

AWS CloudFormation: Infrastructure as Code

TOKEN

Panduan lengkap AWS CloudFormation β€” template YAML/JSON, stacks, change sets, stack sets, drift detection, dan best practices Infrastructure as Code

Artikel: Aws Cloudformation Artikel: Aws Cloudformation


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 CodeInfrastruktur didefinisikan dalam kode yang bisa di-review, version, dan audit
ReproducibilityBuat environment identik berkali-kali dengan template yang sama
AutomationProvisioning dan teardown infrastruktur sepenuhnya otomatis
Dependency ManagementCloudFormation otomatis menentukan urutan pembuatan resource
RollbackJika deploy gagal, semua perubahan di-rollback secara otomatis
Change TrackingSetiap perubahan infrastructure tercatat dan bisa di-audit
Drift DetectionDetect perubahan manual di luar CloudFormation
Diagram: CloudFormation Architecture
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
VendorAWS onlyMulti-cloudMulti-cloud
BahasaYAML/JSONHCLPython/TypeScript/Go
State ManagementManaged oleh AWSSelf-managedManaged atau self
CostGratis (bayar resource)Open-sourceOpen-source
Custom ResourcesLambda-backedProvidersNative code
πŸ’‘ Tips

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

Diagram: Struktur CloudFormation Template

AWSTemplateFormatVersion Version: '2010-09-09'

Description 'Deskripsi template...'

Parameters Input untuk user Type validation

Resources AWS resources Core dari template (REQ...

β˜… REQ

Mappings Lookup tables Region-based configs

Conditions If/else logic Environment flag

Outputs Export values Stack exports

Transform (opsional) Macros, SAM, etc.

β˜… Resources adalah satu-satunya section yang WA...

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.

Diagram

🏒 Admin Account (Management) 'SharedSecurityPol...

Mengelola template

Deploy targets

Account A (111...111) us-east-1 IAM Role + SG

Stack Instance

Stack Instance us-west-2

Account B (222...222) us-east-1, us-west-2 IAM ...

Stack Instance

Stack Instance IAM Role + SG

Account C (333...333) eu-west-1 IAM Role + SG

Stack Instance

Stack Instance IAM Role + SG

Stack Set mengelola deployment ke semua account...

Commands untuk Stack Sets

Bash
# 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
KonsistensiPastikan infrastruktur sesuai template, bukan diubah manual
SecurityDetect perubahan keamanan yang tidak diinginkan (misalnya SG dibuka)
ComplianceMemastikan infrastruktur comply dengan standar organisasi
TroubleshootingMencari tahu mengapa stack gagal update karena perubahan manual
AuditMelacak siapa yang mengubah infrastruktur di luar prosedur

Menjalankan Drift Detection

Bash
# 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_SYNCResource sesuai dengan template β€” tidak ada drift
MODIFIEDResource telah diubah secara manual di luar CloudFormation
DELETEDResource telah dihapus secara manual di luar CloudFormation

Auto-Remediation untuk Drift

Bash
# 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
⚠️ Peringatan

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

Diagram: Nested Stack Structure
πŸ“¦ 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:..."/
YAML
# 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 environmentGunakan parameter untuk mengontrol perbedaan dev/staging/prod
Gunakan nested stacksPecah template besar menjadi modul-modul kecil
Parameterize nilaiJangan hardcode β€” gunakan parameters untuk values yang berubah
Output semua valuesExport values penting untuk digunakan stack lain
Gunakan mappingsUntuk region-specific values seperti AMI IDs
Description yang jelasTulis description yang informatif untuk setiap template

Keamanan

YAML
# 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

Text
Diagram: Rekomendasi Struktur Project:
/"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

YAML
# 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_EXPANDUntuk macro dan transforms β€” hati-hati karena bisa mengubah resource secara tidak terduga
Set termination protectionHindari stack production terhapus secara tidak sengaja
Gunakan change setsSelalu review perubahan sebelum execute
Monitoring driftJalankan drift detection secara berkala (weekly/monthly)
Tag semua resourcesMemudahkan tracking cost per project/team
Cleanup unused stacksHapus stack yang sudah tidak digunakan untuk menghemat cost
πŸ’‘ Tips

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?

πŸ” Zoom
100%
🎨 Tema