Définir automatiquement le contrôle du cache pour l'ensemble du compartiment S3 (à l'aide de stratégies de compartiment?)

126

J'ai besoin de définir des en-têtes de contrôle du cache pour un bucket s3 entier, les fichiers existants et futurs et j'espérais le faire dans une politique de seau. Je sais que je peux modifier les fichiers existants et je sais comment les spécifier lors de la mise en ligne 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 y copier les fichiers.

thattommyhall
la source

Réponses:

209

Il existe maintenant 3 façons d'y parvenir: via la console AWS , via la ligne de commande ou via l'outil de ligne de commande s3cmd .


Instructions de la console AWS

C'est maintenant la solution recommandée. C'est simple, mais cela peut prendre un certain temps.

  • Connectez-vous à AWS Management Console
  • Aller dans le compartiment 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 max-age = 604800Entrez (7 jours) pour Valeur
  • Appuyez sur le bouton "Enregistrer"

( merci à @biplob - merci de lui donner un peu d'amour ci-dessous )


Solution de ligne de commande AWS

À l'origine, lorsque j'ai créé ce bucket, les politiques étaient interdites, alors j'ai compris comment le faire en utilisant aws-cli, et c'est assez astucieux. Lors de mes recherches, je n'ai trouvé aucun exemple dans la nature, alors j'ai pensé publier certaines de mes solutions pour aider ceux qui en avaient besoin.

REMARQUE: par défaut, aws-cli copie uniquement 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 sur la ligne de commande, vous devez ajouter l'indicateur «--metadata-directive REPLACE». Voici quelques exemples.

Pour un seul fichier

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 compartiment entier (notez - indicateur 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

Un petit truc que j'ai trouvé, si vous ne voulez l'appliquer qu'à un type de fichier spécifique, vous devez exclure tous les fichiers, puis inclure ceux que vous voulez.

Uniquement jpgs et pngs:

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:

"Unknown options: --metadata-directive, REPLACE"

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


Outil S3cmd

S3cmd est un «outil de ligne de commande pour la gestion des services Amazon S3 et CloudFront». Bien que cette solution nécessite un pull git, elle pourrait être une solution plus simple et plus complète.

Pour des instructions complètes, voir le post de @ ashishyadaveee11 ci-dessous


J'espère que ça aide!

Dan Williams
la source
6
Merci pour les exemples réels de ce qu'il faut faire. J'avais du mal à découvrir ce qui était même possible en lisant simplement la documentation.
danneu le
2
J'obtiens "Options inconnues: --metadata-directive, REPLACE" lorsque j'exécute l'une des commandes ci-dessus. Veuillez m'aider.
user3722785
1
Remarque, il existe maintenant un moyen plus simple. Vous pouvez désormais modifier les métadonnées de TOUS les fichiers d'un compartiment via AWS Console. Voir la réponse de CoderBoy ci-dessous: stackoverflow.com/a/47072736/2538952
Martin Tschammer
1
Notez que l'utilisation de --meta-directive REPLACE écrasera toutes les métadonnées précédentes qui ne sont pas copiées dans la commande! Par exemple, "content-encoding gzip" sera supprimé s'il n'est pas explicitement ajouté à la commande cp.
Harmen Janssen
1
Est-ce que le cptéléchargement et re-upload tout?
mlissner
37

Désormais, il peut changer facilement depuis la console AWS.

  • Connectez-vous à AWS Management Console
  • Aller dans le compartiment 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
  • max-age = 604800Entrez (7 jours) pour Valeur
  • Appuyez sur le bouton "Enregistrer"

L'exécution dépend de vos fichiers de compartiment. Refaites depuis le début si vous fermez accidentellement le navigateur.

biplob
la source
6
Que signifie «sélectionner tous les fichiers par itinéraire»?
Tamzin Blake
1
Sélectionnez tous / certains fichiers dans le répertoire que vous souhaitez définir meta
biplob
Désolé pour la réponse tardive. Non, ce n'est pas le cas. Vous devez le définir depuis votre application.
biplob
Cela remplace-t-il les métadonnées précédentes ou y ajoute-t-il? (Je ne veux pas perdre tous mes types de contenu!)
Chris
Je viens de confirmer qu'il ne supprime PAS les valeurs existantes. Définit uniquement les clés que vous spécifiez (clé de remplacement si elle existe)
rynop
21

pas

  1. git clone https://github.com/s3tools/s3cmd
  2. Exécuter s3cmd --configure (il vous sera demandé les deux clés - copiez-les et collez-les à partir de votre e-mail de confirmation ou de la page de votre compte Amazon. Soyez prudent lorsque vous les copiez! Elles sont sensibles à la casse et doivent être saisies avec précision, sinon vous continuerez à recevoir des erreurs de non-validité signatures ou similaires. N'oubliez pas d'ajouter des s3:ListAllMyBucketsautorisations aux clés ou vous obtiendrez une AccessDeniederreur lors du test de l'accès.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
ashishyadaveee11
la source
Super réponse. Je vous remercie! Existe-t-il un moyen de mettre à jour UNIQUEMENT ceux qui n'ont pas déjà ce paramètre d'en-tête?
PKHunter
Quelqu'un a-t-il une solution similaire à utiliser avec S3Express de Windows?
Joe
12

Si mon score de réputation était> 50, je voudrais juste commenter. Mais ce n'est pas (encore) alors voici une autre réponse complète.


Je me cogne la tête sur ce problème depuis un moment maintenant. Jusqu'à ce que j'ai trouvé et lu les documents. Partager cela ici au cas où cela aiderait quelqu'un d'autre:

Ce qui a fonctionné de manière fiable pour moi, c'est cette commande. J'ai choisi un délai d'expiration de 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 REPLACEest requis lorsque " cp" la modification des métadonnées sur un fichier existant dans S3
  • max-age définit l'âge de la mise en cache du navigateur, en secondes
  • s-maxage définit la mise en cache CloudFront, en quelques 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 \
  /local/path/file \
  s3://bucket/path/file
Roens
la source
8

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- cache-controltêtes 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-controlet expires. Pour une liste complète des options disponibles, voir: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

Geoff Appleford
la source
Merci Geoff, je connaissais (1) mais pas (2). Pas ce que j'avais espéré (bien que je crains que ce ne soit pas possible)
thattommyhall
Avez-vous un exemple de commande AWS CLI sur la façon de faire # 1? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm
3

Vous pouvez toujours configurer un lambda avec un déclencheur sur PUTOBJECT sur S3, le 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 le 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 /

Ibrahim Bou Ncoula
la source
Pouvez-vous fournir plus de détails sur la façon de faire ce lamba? Cela semble être une excellente solution.
Wouter
1
@Wouter bien sûr, je vous ai trouvé un lien qui peut réellement vous aider à y arriver facilement, aaronfagan.ca/blog/2017/ ... Si vous avez besoin d'aide ou de soutien, je serais plus qu'heureux de vous aider.
Ibrahim Bou Ncoula
Je sais que c'est vieux mais j'ai trouvé cette ressource utile pour ce que je cherchais. Merci pour ça. upvotes pour vous mon mec!
castaway2000
1

À ceux qui tentent d'utiliser la réponse de Dan et obtiennent l'erreur:

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

J'ai rencontré le problème, et le problème était que j'ai installé awscli en utilisant

sudo apt-get installer awscli

Cela a installé une ancienne version de awscli qui n'a pas la commande --metadata-directive. J'ai donc utilisé sudo apt-get remove awscli pour le supprimer.

Puis 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 d'autorisation que d'autres pourraient également rencontrer.

eliotRosewater
la source