La motivation pour faire cette approche en premier lieu vient d'Amazon: https://aws.amazon.com/blogs/compute/resize-images-on-the-fly-with-amazon-s3-awaws-lambda -et-amazon-Api-passerelle / (avant d'avoir ajouté la "mise à jour" ...)
Dans notre fonction AWS Lambda Redimensionner, il redimensionne l'image et le stocke la nouvelle image sur S3.
const s3_bucket = process.env.s3_bucket;
S3.putObject({
Body: buffer,
Bucket: s3_bucket,
ContentType: contentType,
CacheControl: 'max-age=31536000',
Key: key,
StorageClass: 'STANDARD'
}).promise()
Maintenant, nous voulons que cela fonctionne pour tous nos environnements de test/de mise en scène ainsi que de la production. Donc, j'ai trouvé des "variables d'environnement", si bien! Mais quand j'essaie de déployer une nouvelle version, tout ce que je reçois est:
Avons-nous mis en place quelque chose de mal dans CloudFront? Nous utilisons Node version 6.10. Je trouve qu'il est difficile de croire si nous devons rectifier les godets et conserver différentes versions du code juste pour gérer cela? Si tel est le cas, nous avons gaspillé un Beaucoup de temps en utilisant AWS Lambda ...
Edition: Ce que nous faisons est de faire une demande d'une image comme "Media/Catalogue/Produit/3/0/30123/768x/Lorem.jpg" , alors nous utilisons l'image d'origine située à "media/catalogue/produit/3/0/30123.jpg", redimensionnez-la à 768px et sur la page Web si le navigateur prend en charge, puis renvoyez la nouvelle image (si elle n'est pas déjà mise en cache).
J'avais cela comme un commentaire mais je pense que cela vaut la peine d'être ajouté comme une réponse.
Pourquoi avez-vous besoin d'utiliser Lambda @ Edge pour commencer? Je comprends votre frustration, mais Lambda @ Edge a été conçu pour obtenir un ensemble de choses complètement différent. Voir certains cas d'utilisation ici
Dans votre cas d'utilisation, vous téléchargez un objet à S3 et que l'événement d'objet de Met déclenchera votre fonction Lambda, qui est, par nature, asynchrone et éventuelle cohérente. Vos utilisateurs n'ont vraiment pas besoin de l'heure d'exécution de la génération de vignettes optimisée, car vous ne gagneriez que quelques centaines de millisecondes de toute façon. Au moment où ils ont besoin de la vignette, ce sera déjà là indépendamment.
Dans les fonctions de Lambda régulières, vous pouvez absolument utiliser des variables d'environnement, ce qui facilite l'application de différents paramètres à différents environnements (dev, test, prod).
Vous pouvez voir comment définir des variables d'environnement dans des fonctions Lambda régulières ici
Je l'ai résolu en préparé le s3_bucket
au fichier JS dans le script Bash Build. Donc je spécifie build.sh [s3_bucket] [environment-name]
if [ ! $# -eq 2 ]; then
echo 'You need to provide two parameters: [s3_bucket] [environment]'
echo 'example: build.sh imagetest-us-east-1 next'
echo 'example: build.sh [s3_bucket_to_be_defined] production'
exit 1
fi
filename='index.js'
setCurrentEnvironment() {
jsEnv="const s3_bucket='$1';"
mv "$filename" "$filename".orig && cp "$filename".orig "$filename"
echo -e "$jsEnv\n\n$(cat ${filename})" > "$filename"
}
restoreDefault() {
rm -rf "$filename"
mv "$filename".orig "$filename"
}
setCurrentEnvironment $1
Zip -FS -q -r "../../dist/resize__$2.Zip" *
restoreDefault