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.
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 .
C'est maintenant la solution recommandée. C'est simple, mais cela peut prendre du temps.
( merci à @biplob - donnez-lui un peu d'amour ci-dessous )
À 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
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!
Maintenant, cela peut changer facilement depuis la console AWS.
L'exécution dépend de vos fichiers de compartiment. Refaites depuis le début si vous fermez accidentellement le navigateur.
étapes
git clone https://github.com/s3tools/s3cmd
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.)./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
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 S3max-age
définit l’âge de la mise en cache du navigateur, en secondess-maxage
définit la mise en cache de CloudFront, en secondesDe 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
Je ne pense pas que vous puissiez spécifier cela au niveau du compartiment, mais il existe quelques solutions de contournement pour vous.
Copiez l'objet sur lui-même sur S3 en définissant le cache-control
en-têtes 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, 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
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.
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.
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 /