Je dois définir les en-têtes de contrôle-cache pour l'ensemble d'un bucket s3, à la fois pour les fichiers existants et futurs, et j'espérais le faire via une politique de bucket. Je sais que je peux modifier les existants et je sais comment les spécifier lors de l'envoi si je les télécharge moi-même, mais malheureusement l'application qui les télécharge ne peut pas définir les en-têtes car elle utilise s3fs pour copier les fichiers là-bas.
Réponses
Trop de publicités?Vous pouvez toujours configurer une lambda avec un déclencheur sur PUTOBJECT sur S3, la lambda changera simplement l'en-tête de cet objet particulier qui vient d'être mis.
Ensuite, vous pouvez exécuter la commande de copie mentionnée ci-dessus une dernière fois, et tous les nouveaux objets seront corrigés par la lambda.
METTRE À JOUR:
Voici un bon point de départ: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects/
A ceux qui tentent d'utiliser la réponse de Dan et qui obtiennent l'erreur :
"Options inconnues : --metadata-directive, REPLACE"
J'ai rencontré le même problème, et la cause était que j'avais installé awscli en utilisant
sudo apt-get install awscli
Cela a installé une ancienne version d'awscli qui ne contient pas la commande --metadata-directive. J'ai donc utilisé sudo apt-get remove awscli pour le désinstaller.
Puis j'ai réinstallé en suivant la procédure d'Amazon : http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html
La seule différence est que j'ai dû utiliser sudo -H en raison de problèmes de permissions auxquels d'autres pourraient également être confrontés.
Les politiques de bucket servent à donner des autorisations au bucket et à l'objet stocké à l'intérieur, donc cette méthode ne donnera pas les résultats que vous recherchez. Les autres réponses modifient les métadonnées de l'objet en utilisant des moyens automatisés, mais vous pouvez également utiliser Lambda@Edge si vous êtes prêt à déplacer le bucket derrière CloudFront.
Avec Lambda@Edge, vous pouvez exécuter un code arbitraire pour chaque requête client et il peut modifier les en-têtes renvoyés par l'origine (le bucket S3 dans ce cas). Cela nécessite un peu plus de configuration et cela coûte de l'argent, mais voici un plan de la solution :
- créer une distribution CloudFront
- ajouter le bucket S3 comme origine
- créer une fonction lambda qui modifie l'en-tête de réponse
- utiliser l'URL de la distribution CloudFront pour accéder aux fichiers
La documentation AWS a un exemple de la manière de modifier les en-têtes de réponse. Si vous utilisez Terraform pour gérer l'infrastructure, j'ai écrit un article sur la façon de le faire.
Les réponses précédentes ne correspondent pas vraiment à la question ou entraînent des coûts (Lambda).
Ce que vous devriez faire est de définir l'en-tête "cache-control" lorsque vous téléchargez le fichier (PutObject ou MultiPartUpload).
En fonction de votre langage, cela peut être quelque peu différent. La documentation n'est pas très claire (car AWS espère probablement que vous les paierez avec les autres solutions).
Un exemple avec PHP:
$uploader = new MultipartUploader ($s3,$filename,[
...,
'before_initiate' => function(\Aws\Command $command){
$command['CacheControl'] = 'max-age=31536000,public';
},
...
]);
Un autre exemple avec Go:
cc := "max-age=31536000,public"
input := &s3.PutObjectInput{
...,
CacheControl: &cc,
}
J'ai pensé que je partagerais mon utilisation puisque les réponses précédentes m'ont induit en erreur. Seuls deux commandes avec AWS CLI :
aws s3 cp s3://bucketname/ s3://bucketname/ --cache-control max-age=12345 --recursive
C'est tout pour ce qui existe déjà, en utilisant cp. Définir --cache-control
de cette manière est une option valide.
Si vous téléchargez, vous pourriez aussi sync, pour lequel la commande est :
aws s3 sync z:\source\folder s3://bucketname/folder --delete --cache-control max-age=12345 --acl public-read
Remarquez que je n'utilise PAS --metadata-directive
DU TOUT, car en l'utilisant, vous perdrez vos types de contenu devinés, ce qui fera que des éléments comme les images ne s'afficheront pas dans un navigateur mais seront téléchargés instantanément. Ma solution préserve la valeur devinée, et permet de deviner avec le sync.
1 votes
Pour toute personne consultant cette question dans le contexte de définir
cache-control: max-age
sur une distribution CloudFront: voir cette réponse sur un autre fil de discussion; une autre solution, pour toute personne transmettant des ressources via un script de déploiement avecaws s3
: définissez une valeur via--cache-control max-age=
.