AWS S3'ten CloudFront Ön Belleği Temizlemek: Otomasyonu Kodla

S3'e dosya yüklediğinde CloudFront hâlâ eski versiyonu sunuyorsa, cache invalidation gerekir. Elle temizlemek yerine bunu otomatikleştir.

CloudFront invalidation işlemi, belirttiğin dosya yollarını CDN'den siler ve istemciler yeni versiyonu alır. AWS SDK ile bunu programatik hale getirebilirsin.

Gereklilik:
- AWS hesabı ve CloudFront distribution ID
- IAM kullanıcısı için `cloudfront:CreateInvalidation` izni
- Python 3.7+
- `boto3` kütüphanesi

İlk olarak boto3'ü kur:

1pip install boto3

Şimdi invalidation scripti:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import boto3
2from datetime import datetime
3
4client = boto3.client('cloudfront', region_name='us-east-1')
5
6DISTRIBUTION_ID = 'E1234ABCD'
7PATHS = ['/index.html', '/assets/*', '/images/logo.png']
8
9def invalidate_cache(paths):
10try:
11response = client.create_invalidation(
12DistributionId=DISTRIBUTION_ID,
13InvalidationBatch={
14'Paths': {
15'Quantity': len(paths),
16'Items': paths
17},
18'CallerReference': str(datetime.now().timestamp())
19}
20)
21print(f" Invalidation başlatıldı: {response['Invalidation']['Id']}")
22print(f" Durum: {response['Invalidation']['Status']}")
23return response['Invalidation']['Id']
24except Exception as e:
25print(f" Hata: {e}")
26return None
27
28if __name__ == '__main__':
29invalidate_cache(PATHS)

Beklenen çıktı:

1Invalidation başlatıldı: I2ABC3DEF4GHI
2Durum: InProgress

S3 upload'ı ile otomatik tetiklemek istersen Lambda + S3 event notification kullan. S3 bucket event'i Lambda'yı çağırır, Lambda invalidation işlemini yapar.

Lambda için basit versyon:

1import json
2import boto3
3import os
4
5client = boto3.client('cloudfront')
6DISTRIBUTION_ID = os.environ['DISTRIBUTION_ID']
7
8def lambda_handler(event, context):
9for record in event['Records']:
10bucket = record['s3']['bucket']['name']
11key = record['s3']['object']['key']
12
13# S3 key'i CloudFront path'ine çevir
14path = f'/{key}'
15
16client.create_invalidation(
17DistributionId=DISTRIBUTION_ID,
18InvalidationBatch={
19'Paths': {'Quantity': 1, 'Items': [path]},
20'CallerReference': key
21}
22)
23
24return {'statusCode': 200, 'body': 'Invalidation completed'}

Sık yapılan hatalar:
- Distribution ID yanlış kopyalanmış CloudFront konsolundan kontrol et
- IAM izni eksik `cloudfront:CreateInvalidation` ve `cloudfront:GetInvalidation` ekle
- Wildcard yollar (`/*`) invalidation sayısını arttırır; fazla kullanırsan rate limit'e takılırsın
- CallerReference aynı ise hata alırsın; her çağrıda benzersiz yap

Invalidation ID'sini kaydet; durumu sorgulayabilirsin: `client.get_invalidation(DistributionId=DISTRIBUTION_ID, Id=invalidation_id)`

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz