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:
1import boto32from datetime import datetime34client = boto3.client('cloudfront', region_name='us-east-1')56DISTRIBUTION_ID = 'E1234ABCD'7PATHS = ['/index.html', '/assets/*', '/images/logo.png']89def invalidate_cache(paths):10try:11response = client.create_invalidation(12DistributionId=DISTRIBUTION_ID,13InvalidationBatch={14'Paths': {15'Quantity': len(paths),16'Items': paths17},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 None2728if __name__ == '__main__':29invalidate_cache(PATHS)Beklenen çıktı:
1Invalidation başlatıldı: I2ABC3DEF4GHI2Durum: InProgressS3 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 json2import boto33import os45client = boto3.client('cloudfront')6DISTRIBUTION_ID = os.environ['DISTRIBUTION_ID']78def lambda_handler(event, context):9for record in event['Records']:10bucket = record['s3']['bucket']['name']11key = record['s3']['object']['key']1213# S3 key'i CloudFront path'ine çevir14path = f'/{key}'1516client.create_invalidation(17DistributionId=DISTRIBUTION_ID,18InvalidationBatch={19'Paths': {'Quantity': 1, 'Items': [path]},20'CallerReference': key21}22)2324return {'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)`
0 yorum