12
votes

Comment mettre à jour un lot de métadonnées d'objets S3 en utilisant Ruby?

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.


0 commentaires

5 Réponses :


7
votes

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 xxx


2 commentaires

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?



4
votes

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


3 commentaires

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).



5
votes

Dans l'API V2, vous pouvez utiliser objet # copy_from () ou objet.copy_to () avec le : métadata et et : MetaData_Directive => 'Remplacer' Options pour mettre à jour les métadonnées d'un objet sans le télécharger de S3.

Le code dans Le gist de Joost jette cette erreur:

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.

Ceci est parce que par défaut AWS ignore le : métadata fourni avec une opération de copie car il copie des métadonnées. Nous devons définir l'option : metadata_directive => 'Remplacer' si nous voulons mettre à jour les métadonnées en place.

voir http://docs.aws.amazon.com/sdkforby/api/aws/s3/Object.html # copy_from-instance_method

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: xxx

pour facile -Utilisez: xxx


1 commentaires

Pour ajouter un contrôle de cache Utilisation: objet.copy_to (objet, cache_control: "public, max-Âge = 333333 ', métadata_directive:" Remplacer ")



3
votes

Après une recherche, cela semble fonctionner pour moi xxx


0 commentaires

2
votes

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


0 commentaires