Skip to main content

Melakukan perubahan di AWS CloudFormation

CloudFormation Yaml sebelumnya dibagian TimeUnit Budget Alertnya masih dibuat MONTHLY, dikarenakan monthly alert terlalu lama, maka saya ingin merubah TimeUnit nya menjadi DAILY, dan sebenarnya perubahan ini bisa dilakukan secara langsung di setingan Budget AWS, dikarenakan pembuatannya menggunakan CloudFormation maka sebaiknya perubahan dilakukan di YAML CloudFormation sebelumnya.

Perubahan yang akan dilakukan

dari:

TimeUnit: MONTHLY

Menjadi:

TimeUnit: DAILY

๐Ÿ“ˆ Apa Efeknya?

Dengan TimeUnit: DAILY, maka:

  • Budget limit $0.01 berlaku per hari

  • Kalau hari ini kamu pakai lebih dari $0.01 โžœ langsung trigger notifikasi

  • Besok akan mulai hitung ulang lagi dari nol

Ini cocok banget buat pengguna Free Tier atau akun lab, karena kamu ingin tau langsung saat mulai keluar biaya, bukan nunggu akhir bulan.

๐Ÿ› ๏ธ Cara Update CloudFormation Stack

  1. Kalau kamu pakai CloudFormation:
    Ubah bagian ZeroSpendBudget jadi:
    TimeUnit: DAILY

    Dan berikut YAML File lengkapnya

    AWSTemplateFormatVersion: '2010-09-09'
    Description: Zero Spend Daily Budget Notification using SNS and Lambda
    
    Parameters:
      NotificationEmail:
        Type: String
        Description: Email address to receive budget notifications
    
    Resources:
    
      ZeroSpendSNSTopic:
        Type: AWS::SNS::Topic
        Properties:
          TopicName: ZeroSpendDailyBudgetTopic
    
      SNSEmailSubscription:
        Type: AWS::SNS::Subscription
        Properties:
          Protocol: email
          Endpoint: !Ref NotificationEmail
          TopicArn: !Ref ZeroSpendSNSTopic
    
      BudgetNotificationLambdaRole:
        Type: AWS::IAM::Role
        Properties:
          RoleName: BudgetNotificationLambdaRole
          AssumeRolePolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Principal:
                  Service: lambda.amazonaws.com
                Action: sts:AssumeRole
          ManagedPolicyArns:
            - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
    
      BudgetNotificationFunction:
        Type: AWS::Lambda::Function
        Properties:
          FunctionName: BudgetNotificationHandler
          Runtime: python3.12
          Handler: index.lambda_handler
          Role: !GetAtt BudgetNotificationLambdaRole.Arn
          Code:
            ZipFile: |
              def lambda_handler(event, context):
                  print("Received budget alert event:")
                  print(event)
                  return {
                      'statusCode': 200,
                      'body': 'Budget notification processed.'
                  }
    
      BudgetNotificationPermission:
        Type: AWS::Lambda::Permission
        Properties:
          Action: lambda:InvokeFunction
          FunctionName: !Ref BudgetNotificationFunction
          Principal: sns.amazonaws.com
          SourceArn: !Ref ZeroSpendSNSTopic
    
      BudgetNotificationSNSSubscription:
        Type: AWS::SNS::Subscription
        Properties:
          Protocol: lambda
          Endpoint: !GetAtt BudgetNotificationFunction.Arn
          TopicArn: !Ref ZeroSpendSNSTopic
    
      ZeroSpendDailyBudget:
        Type: AWS::Budgets::Budget
        Properties:
          Budget:
            BudgetName: ZeroSpendDailyBudget
            BudgetLimit:
              Amount: 0.01
              Unit: USD
            BudgetType: COST
            TimeUnit: DAILY
          NotificationsWithSubscribers:
            - Notification:
                NotificationType: ACTUAL
                ComparisonOperator: GREATER_THAN
                Threshold: 100
                ThresholdType: PERCENTAGE
              Subscribers:
                - SubscriptionType: SNS
                  Address: !Ref ZeroSpendSNSTopic
    

    ย 

  2. Simpan template ini ke file, misalnya zero-spend-daily.yaml
  3. Buka AWS Console โ†’ย CloudFormation
  4. Pilih stack yang sebelumnya โ†’ Klikย Update stack
  5. setelah kamu klik update ada dua pilihan yang muncul
    image.png

    ๐Ÿง  Penjelasan Singkat:

    Saat kamu memilih "Create a change set", itu artinya kamu baru membuat rencana perubahan, belum benar-benar menerapkannya.

    CloudFormation kasih kamu kesempatan untuk:

      • Cek dulu perubahan apa yang akan dilakukan (kayak dry-run)

      • Baru kalau yakin โ†’ kamu harus klik โ€œExecuteโ€ untuk menerapkan perubahan

    1. Pilih Replace current template

    2. Upload file zero-spend-daily.yaml

    3. Klik Next sampai akhir โ†’ Klik Update Stack

    4. Lanjut kebagian "cara execute cloudformation stack" ya

    ๐Ÿ’ก Note: Kamu tidak perlu menghapus stack lama, cukup update saja. Notifikasi email tetap dikirim ke email kamu aku@widianto.org (pastikan kamu tetap subscribe ke SNS-nya).


๐Ÿ› ๏ธ Cara Execute CloudFormation Stack

  1. Buka AWS Console โ†’ CloudFormation

  2. Pilih stack yang sebelumnya

    image.png

  3. Done

FAQ:

setelah saya click menu "execute change set" keluar notif seperti gambar berikut ini, apakah kamu bisa menjelaskan apakah itu?

image.png

Oke, aku lihat gambarnya! โœจ
Yang muncul itu adalah konfirmasi terakhir sebelum eksekusi perubahan.

Yuk aku jelaskan satu-satu isinya, gampang kok:


๐Ÿ“‹ Penjelasan pilihan-pilihan di โ€œExecute change set?โ€

1. Behavior on provisioning failure:

  • Roll back all stack resources (default, sudah terpilih)
    โ†’ Kalau nanti update gagal di tengah jalan, semua resource akan dikembalikan ke kondisi sebelum update. Ini aman banget untuk sekarang.

  • Preserve successfully provisioned resources
    โ†’ Kalau kamu pilih ini, resource yang berhasil dibuat tetap dipertahankan, hanya yang gagal yang di-rollback. (Tidak perlu dipilih untuk kasus kita.)


2. Delete newly created resources during a rollback:

  • Use deletion policy (default, sudah terpilih)
    โ†’ Artinya kalau ada resource yang baru dibuat saat update dan update itu gagal, maka CloudFormation akan memutuskan untuk menghapus atau mempertahankan resource berdasarkan kebijakan DeletionPolicy yang diset di template (kalau ada).
    Ini pilihan aman dan standar.

  • Delete all newly created resources
    โ†’ Kalau pilih ini, semua resource yang baru dibuat akan dihapus saat rollback, apapun kondisinya. (Kamu tidak perlu pilih ini.)