Je dois changer de métadonnées (type de contenu) sur des centaines ou des milliers d'objets sur S3. Qu'est-ce qu'un bon moyen de faire cela avec Ruby? Pour autant que je puisse dire qu'il n'y a aucun moyen de sauvegarder uniquement des métadonnées avec Fog.IO , l'objet entier doit être ré-enregistré . On dirait que l'utilisation de La bibliothèque officielle du SDK vous obligerait à rouler un environnement d'emballage juste pour cela une tâche. p>
5 Réponses :
Vous avez raison, le SDK officiel vous permet de modifier les métadonnées d'objet sans la télécharger à nouveau. Ce qu'il fait est copie L'objet mais c'est sur le serveur, vous n'avez donc pas besoin de télécharger le fichier et de le télécharger.
Un wrapper serait facile à mettre en œuvre, quelque chose comme p>
Plus de discussions sur ceci ici: groups.google.com/group/ruby- brouillard / browse_thread / thread / ...
Cela ajoute uniquement des métadonnées avec x-amz-méta-préfixe. Est-ce que la façon d'ajouter juste une métadonnée normale de type contenu?
Pour les futurs lecteurs, voici un échantillon complet de changements de choses à l'aide de Ruby AWS-SDK V1 (voir également cette GIST pour un échantillon AWS-SDK V2):
# Using v1 of Ruby aws-sdk as currently v2 seems not able to do this (broken?). require 'aws-sdk-v1' key = YOUR_AWS_KEY secret = YOUR_AWS_SECRET region = YOUR_AWS_REGION AWS.config(access_key_id: key, secret_access_key: secret, region: region) s3 = AWS::S3.new bucket = s3.buckets[bucket_name] bucket.objects.with_prefix('images/').each do |obj| puts obj.key # Add metadata: {} to next line for more metadata. obj.copy_from(obj.key, content_type: obj.content_type, cache_control: 'max-age=1576800000', acl: :public_read) end
Votre gist dit que l'échantillon V2 ne semble pas fonctionner et suggère qu'il pourrait s'agir d'un bug dans le SDK ... je suppose que vous ne l'avez pas encore résolu?
Nan. Essayez simplement le gist avec la dernière version de v2 :)
La version V2 ne fonctionne pas non plus pour moi. J'ai commenté le gist avec ma solution (relancement de chaque fichier).
Dans l'API V2, vous pouvez utiliser Le code dans Le gist de Joost jette cette erreur: p> AWS :: S3 :: Erreurs :: InvalidRequest: Cette demande de copie est illégale car
Il essaie de copier un objet à lui-même sans changer l'objet
Métadonnées, classe de stockage, site de redirection de site Web ou cryptage
attributs. p>
BlockQuote> Ceci est parce que par défaut AWS ignore le voir Voici un extrait de code de travail complet que j'ai récemment utilisé pour effectuer des opérations de mise à jour de métadonnées: p> pour facile -Utilisez: p> objet # copy_from () code> ou
objet.copy_to () code> avec le
: métadata code> et
et
: MetaData_Directive => 'Remplacer' code> Options pour mettre à jour les métadonnées d'un objet sans le télécharger de S3.
: métadata code> fourni avec une opération de copie car il copie des métadonnées. Nous devons définir l'option
: metadata_directive => 'Remplacer' code> si nous voulons mettre à jour les métadonnées en place. P>
Pour ajouter un contrôle de cache Utilisation: objet.copy_to (objet, cache_control: "public, max-Âge = 333333 ', métadata_directive:" Remplacer ")
Après une recherche, cela semble fonctionner pour moi
Utilisation du SDK Pour modifier le type de contenu aboutira au préfixe x-amz-méta- code>. Ma solution était d'utiliser Ruby + AWS CLI. Cela écrira directement au type Code> Type de contenu Code> au lieu de
Type X-amz-méta-méta-contenu code>.
ids_to_copy = all_object_ids
ids_to_copy.each do |id|
object_key = "#{id}.pdf"
command = "aws s3 cp s3://{bucket-name}/#{object_key} s3://{bucket-name}/#{object_key} --no-guess-mime-type --content-type='application/pdf' --metadata-directive='REPLACE'"
system(command)
end