web-dev-qa-db-fra.com

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

Je dois définir des en-têtes de contrôle du cache pour tout un compartiment s3, les fichiers existants et futurs, et espérais le faire dans une stratégie de compartiment. Je sais que je peux modifier les fichiers existants et que je sais comment les spécifier 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.

101
thattommyhall

Il existe maintenant 3 façons de le faire: 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 du temps.

  • Connectez-vous à AWS Management Console
  • Aller dans le seau S3
  • Sélectionner tous les fichiers par route
  • Choisissez "Plus" dans le menu
  • Sélectionnez "Changer les métadonnées"
  • Dans le champ "Key", sélectionnez "Cache-Control" dans le menu déroulant max-age = 604800Enter (7 jours) pour Value
  • Appuyez sur le bouton "Enregistrer"

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


Solution de ligne de commande AWS

À l'origine, lorsque j'ai créé ce seau, les règles étaient inacceptables. J'ai donc compris comment le faire à l'aide de aws-cli, et c'est plutôt simple. Lors de mes recherches, je ne trouvais aucun exemple dans la nature et j'ai donc pensé publier certaines de mes solutions pour aider les personnes dans le 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 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 (note - indicateur récurrent):

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 peu que j'ai trouvé, si vous voulez seulement l'appliquer à un type de fichier spécifique, vous devez exclure tous les fichiers, puis inclure ceux que vous voulez.

Seulement 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 réponse de @ eliotRosewater ci-dessous


Outil S3cmd

S3cmd est un "outil de ligne de commande permettant de gérer les services Amazon S3 et CloudFront". Bien que cette solution nécessite un tirage git, cela 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!

161
Dan Williams

Maintenant, cela peut changer facilement depuis la console AWS.

  • Connectez-vous à AWS Management Console
  • Aller dans le seau S3
  • Sélectionner tous les fichiers par route
  • Choisissez "Plus" dans le menu
  • Sélectionnez "Changer les métadonnées"
  • Dans le champ "Key", sélectionnez "Cache-Control" dans le menu déroulant.
  • max-age = 604800Enter (7 jours) pour Value
  • 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.

28
biplob

étapes

  1. git clone https://github.com/s3tools/s3cmd
  2. Courir s3cmd --configure _ (On vous demandera les deux clés - copiez-les et collez-les à partir de votre e-mail de confirmation ou de la page de votre compte Amazon. Faites attention lorsque vous les copiez! Elles sont sensibles à la casse et doivent être saisies correctement. signatures invalides ou similaires. N'oubliez pas d'ajouter s3:ListAllMyBuckets autorisations sur les 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://your_bucket_name/
20
ashishyadaveee11

Si ma cote de réputation était supérieure à 50, je ferais juste un commentaire. 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 la documentation. Partager cela ici au cas où cela aiderait quelqu'un d'autre:

Ce qui a fini par fonctionner de manière fiable pour moi était cette commande. J'ai choisi un délai d'expiration de 1 seconde pour le test 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 lorsque "cp" modifie 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 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 ressemblera à ceci:

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file
8
roens

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

  1. Copiez l'objet sur lui-même sur S3 en définissant le cache-control en-têtes 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, notamment cache-control et expires. Pour une liste complète des options disponibles, voir: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225

7
Geoff Appleford

Pour ceux qui tentent d'utiliser la réponse de Dan et qui 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

Ceci a installé une ancienne version de awscli à laquelle il manque 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 à cause de problèmes de permission que d'autres pourraient rencontrer.

1
eliotRosewater

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 placé.

Ensuite, vous pouvez exécuter la commande de copie mentionnée ci-dessus une dernière fois et tous les nouveaux objets seront fixés par le lambda.

MISE À 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 /

1