Melakukan perubahan di AWS CloudFormation
CloudFrontCloudFormation Yaml sebelumnya dibagian TimeUnit Budget Alertnya masih dibuat MONTHLY, dikarenakan monthly 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 CloudFrontCloudFormation maka sebaiknya perubahan dilakukan di CloudFront.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:
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
π οΈ Cara Update CloudFormation Stack
-
Simpan template ini ke file, misalnya
zero-spend-daily.yaml
-
Buka AWS Console β CloudFormation
-
Pilih stack yang sebelumnya β Klik Update stack
setelah kamu klik update ada dua pilihan yang munculπ§ 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
-
-
Pilih Replace current template
-
Upload file
zero-spend-daily.yaml
-
Klik Next sampai akhir β Klik Update Stack
π‘ 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
FAQ:
setelah saya click menu "execute change set" keluar notif seperti gambar berikut ini, apakah kamu bisa menjelaskan apakah itu?
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 kebijakanDeletionPolicy
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.)
lebih buruk