TLDR: Nous devons tromper CloudFront 307 rediriger la mise en cache en créant un nouveau comportement de cache pour les réponses à venir de notre fonction Lambda.Redimensionner les images à la volée dans CloudFront et les obtenir instantanément dans la même URL: AWS CloudFront -> S3 -> Lambda -> CloudFront
Vous ne croirez pas à quel point nous sommes proches pour y parvenir. Nous avons tellement mal pris dans la dernière étape.
cas d'affaires:
Nos magasins d'application des images dans S3 et les sert avec CloudFront afin d'éviter les ralentissements géographiques à travers le monde. Maintenant, nous voulons être très flexibles avec la conception et pouvoir demander de nouvelles dimensions d'image directement dans l'URL CouldFront! Chaque nouvelle taille d'image sera créée à la demande puis stockée dans S3, donc la seconde fois qu'elle sera demandée, elle sera servie très rapidement car elle existera dans S3 et sera également mise en cache dans CloudFront.
Supposons que l'utilisateur ait téléchargé l'image chucknorris.jpg. Seule l'image originale sera stockée dans S3 et wil être servi sur notre page comme ceci:
//xxxxx.cloudfront.net/chucknorris.jpg
Nous avons calculé que nous devons maintenant afficher une miniature de 200x200 pixels. Par conséquent nous avons mis le src d'image dans notre modèle:
//xxxxx.cloudfront.net/chucknorris-200x200.jpg
Lorsque cette nouvelle taille est demandée, les services Web amazon doivent fournir sur la mouche dans le même seau et avec la clé demandée. De cette façon, l'image sera directement chargée dans la même URL de CloudFront.
J'ai fait un dessin laid avec la vue d'ensemble de l'architecture et le flux de travail sur la façon dont nous faisons cela dans AWS:
Voici comment se termine Python Lambda:
return {
'statusCode': '301',
'headers': {'location': redirect_url},
'body': ''
}
Le problème :
Si nous faisons rediriger la fonction Lambda vers S3, cela fonctionne comme un charme. Si nous redirigeons vers CloudFront, il passe en boucle de redirection car CloudFront met en cache 307 (ainsi que 301, 302 et 303). Dès que notre fonction Lambda réoriente à CloudFront, CloudFront appelle l'URL Getaway API au lieu d'aller chercher l'image de S3:
Je voudrais créer un nouveau comportement de cache dans Behaviors
paramètres CloudFront onglet. Ce comportement ne doit pas mettre en cache les réponses de Lambda ou S3 (ne sait pas ce qui s'y passe en interne), mais doit toujours mettre en cache les requêtes suivies dans cette même image redimensionnée. J'essaie de définir le modèle de chemin -\d+x\d+\..+$
, ajouter l'ARN de la fonction Lambda en ajoutant "Lambda Function Association" et définir le type d'événement Origin Response
. À côté de cela, je définis le "Default TTL" à 0
.
Mais je ne peux pas enregistrer le comportement en raison d'une erreur:
Sommes-nous sur la bonne voie, ou est l'idée de cette « Lambda Fonction Association » totalement différent?
Vous devez contacter le support AWS concernant ce message d'erreur. Aussi, avez-vous regardé la nouvelle fonctionnalité Lambda @ Edge de Cloudfront? –