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?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:
- http://docs.aws.amazon.com/cli/latest/userguide/using-s3-commands.html
- http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html#options
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
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.
étapes
git clone https://github.com/s3tools/s3cmd
- 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 permissionss3:ListAllMyBuckets
aux clés ou vous obtiendrez une erreurAccessDenied
lors du test d'accès.) ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://nom_de_votre_bucket/
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 :
- Documentation d'Amazon CloudFront : Spécifier la durée de stockage des objets dans le cache CloudFront Edge (Expiration)
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 secondess-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
Je ne pense pas que vous puissiez spécifier cela au niveau du bucket, mais il existe quelques solutions de contournement pour vous.
-
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. -
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
etexpires
. Pour une liste complète des options disponibles, consultez : http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225
- Réponses précédentes
- Plus de réponses
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=
.