171 votes

Définir le cache-control pour l'ensemble du bucket S3 automatiquement (en utilisant des stratégies de bucket?)

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.

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 avec aws s3: définissez une valeur via --cache-control max-age=.

268voto

Dan Williams Points 2109

Il existe maintenant 3 façons de réaliser cela: via la console AWS, via la ligne de commande, ou via l'outil en ligne de commande s3cmd.


Instructions de la console AWS

C'est désormais la solution recommandée. C'est simple, mais cela peut prendre du temps.

  • Connectez-vous à la console de gestion AWS
  • Accédez au bucket S3
  • Sélectionnez tous les fichiers par route
  • Choisissez "Plus" dans le menu
  • Sélectionnez "Modifier les métadonnées"
  • Dans le champ "Clé", sélectionnez "Cache-Control" dans le menu déroulant max-age=604800 Entrez (7 jours) pour la Valeur
  • Cliquez sur le bouton "Enregistrer"

(merci à @biplob - merci de lui montrer de l'amour ci-dessous)


Solution en ligne de commande AWS

À l'origine, lorsque j'ai créé ce bucket, les stratégies de bucket étaient impossibles, alors j'ai trouvé comment le faire en utilisant aws-cli, et c'est assez astucieux. Lors de mes recherches, je n'ai trouvé aucun exemple en ligne, alors j'ai pensé partager certaines de mes solutions pour aider ceux qui en ont besoin.

REMARQUE: Par défaut, aws-cli ne copie que les métadonnées actuelles d'un fichier, MÊME SI VOUS SPÉCIFIEZ DE NOUVELLES MÉTADONNÉES.

Pour utiliser les métadonnées spécifiées en ligne de commande, vous devez ajouter le drapeau '--metadata-directive REPLACE'. Voici quelques exemples.

Pour un fichier unique

aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

Pour un bucket entier (remarquez le drapeau --recursive):

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

J'ai découvert un petit piège, si vous voulez l'appliquer uniquement à un type de fichier spécifique, vous devez exclure tous les fichiers, puis inclure ceux que vous voulez.

Uniquement les jpg et png:

aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public

Voici quelques liens vers le manuel si vous avez besoin de plus d'informations:

Problèmes connus:

"Options inconnues : --metadata-directive, REPLACE"

cela peut être causé par une version obsolète d'awscli - voir la réponse de @eliotRosewater ci-dessous


Outil s3cmd

S3cmd est un "outil en ligne de commande pour gérer les services Amazon S3 et CloudFront". Bien que cette solution nécessite un git pull, elle pourrait être une solution plus simple et plus complète.

Pour des instructions complètes, voir la publication de @ashishyadaveee11 ci-dessous


70voto

CoderBoy Points 467

Maintenant, cela peut être changé facilement depuis la console AWS.

  • Connectez-vous à la console de gestion AWS
  • Allez dans le bucket S3
  • Sélectionnez tous les fichiers par itinéraire
  • Choisissez "Plus" dans le menu
  • Sélectionnez "Modifier les métadonnées"
  • Dans le champ "Clé", sélectionnez "Cache-Control" dans le menu déroulant
  • Entrez max-age=604800 (7 jours) pour la Valeur
  • Cliquez sur le bouton "Enregistrer"

Cela prend du temps pour s'exécuter en fonction de vos fichiers de bucket. Recommencez depuis le début si vous fermez accidentellement le navigateur.

25voto

ashishyadaveee11 Points 809

étapes

  1. git clone https://github.com/s3tools/s3cmd
  2. Exécutez s3cmd --configure (Vous serez invité à entrer les deux clés - copiez et collez-les à partir de votre e-mail de confirmation ou de votre page de compte Amazon. Faites attention en les copiant! Elles sont sensibles à la casse et doivent être saisies avec précision sinon vous continuerez à recevoir des erreurs concernant des signatures invalides ou similaires. N'oubliez pas d'ajouter les permissions s3:ListAllMyBuckets aux clés ou vous obtiendrez une erreur AccessDenied lors du test d'accès.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://nom_de_votre_bucket/

16voto

roens Points 311

J'avais été bloqué sur ce problème pendant un certain temps maintenant. Jusqu'à ce que je trouve et lise la documentation. Je partage cela ici au cas où cela pourrait aider quelqu'un d'autre :

Ce qui a finalement fonctionné de manière fiable pour moi était cette commande. J'ai choisi une expiration d'1 seconde pour les tests afin de vérifier les résultats attendus :

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACE est requis lors de la modification des métadonnées d'un fichier existant dans S3 avec "cp"
  • max-age définit l'âge du cache du navigateur, en secondes
  • s-maxage définit le cache de CloudFront, en secondes

De même, si vous définissez ces valeurs d'en-tête Cache-Control sur un fichier lors du téléchargement vers S3, la commande ressemblerait à ceci :

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /chemin/local/fichier \
  s3://bucket/chemin/fichier

8voto

Geoff Appleford Points 11796

Je ne pense pas que vous puissiez spécifier cela au niveau du bucket, mais il existe quelques solutions de contournement pour vous.

  1. Copiez l'objet sur lui-même sur S3 en définissant les en-têtes cache-control appropriés pour l'opération de copie.

  2. Spécifiez les en-têtes de réponse dans l'url des fichiers. Vous devez utiliser des URL pré-signées pour que cela fonctionne, mais vous pouvez spécifier certains en-têtes de réponse dans la chaîne de requête, y compris cache-control et expires. Pour une liste complète des options disponibles, consultez : http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X