web-dev-qa-db-fra.com

Comment rendre public 10 000 fichiers dans S3

J'ai un dossier dans un compartiment avec 10 000 fichiers. Il semble qu'il n'y ait aucun moyen de les télécharger et de les rendre publics immédiatement. Je les ai donc tous téléchargés, ils sont privés, et je dois les rendre tous publics.

J'ai essayé la console aws, elle donne juste une erreur (fonctionne très bien avec les dossiers avec moins de fichiers).

J'ai essayé d'utiliser l'organisation S3 dans Firefox, la même chose.

Existe-t-il un logiciel ou un script que je peux exécuter pour rendre tout cela public?

80
PeterV

Vous pouvez générer une stratégie de compartiment (voir l'exemple ci-dessous) qui donne accès à tous les fichiers du compartiment. La stratégie de compartiment peut être ajoutée à un compartiment via la console AWS.

{
    "Id": "...",
    "Statement": [ {
        "Sid": "...",
        "Action": [
            "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucket/*",
        "Principal": {
            "AWS": [ "*" ]
        }
    } ]
}

Regardez également l'outil générateur de stratégie suivant fourni par Amazon.

http://awspolicygen.s3.amazonaws.com/policygen.html

110
Rajiv

Si vous téléchargez pour la première fois, vous pouvez définir les fichiers pour qu'ils soient publics lors du téléchargement sur la ligne de commande:

aws s3 sync . s3://my-bucket/path --acl public-read

Comme indiqué dans tilisation des commandes s3 de haut niveau avec l'interface de ligne de commande AWS

Malheureusement, il n'applique l'ACL que lorsque les fichiers sont téléchargés. Il (dans mes tests) n'applique pas l'ACL aux fichiers déjà téléchargés.

Si vous souhaitez mettre à jour des objets existants, vous pouviez auparavant synchroniser le compartiment avec lui-même, mais cela semble avoir cessé de fonctionner.

[Ne fonctionne plus] Cela peut être fait à partir de la ligne de commande:

aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read

(Donc, cela ne répond plus à la question, mais laisse la réponse pour référence comme cela fonctionnait auparavant.)

54
David Roussel

J'ai dû changer plusieurs centaines de milliers d'objets. J'ai lancé une instance EC2 pour exécuter cela, ce qui accélère le tout. Vous voudrez installer le aws-sdk gem en premier.

Voici le code:

require 'rubygems'
require 'aws-sdk'


# Change this stuff.
AWS.config({
    :access_key_id => 'YOURS_HERE',
    :secret_access_key => 'YOURS_HERE',
})
bucket_name = 'YOUR_BUCKET_NAME'


s3 = AWS::S3.new()
bucket = s3.buckets[bucket_name]
bucket.objects.each do |object|
    puts object.key
    object.acl = :public_read
end
33
Daniel Von Fange

J'ai eu le même problème, la solution de @DanielVonFange est obsolète, car la nouvelle version du SDK est sortie.

Ajout d'extrait de code qui fonctionne pour moi en ce moment avec AWS Ruby SDK:

require 'aws-sdk'

Aws.config.update({
  region: 'REGION_CODE_HERE',
  credentials: Aws::Credentials.new(
    'ACCESS_KEY_ID_HERE',
    'SECRET_ACCESS_KEY_HERE'
  )
})
bucket_name = 'BUCKET_NAME_HERE'

s3 = Aws::S3::Resource.new
s3.bucket(bucket_name).objects.each do |object|
  puts object.key
  object.acl.put({ acl: 'public-read' })
end
22
ksarunas

Je voulais juste ajouter qu'avec la nouvelle console S3, vous pouvez sélectionner vos dossiers et sélectionner Make public pour rendre tous les fichiers à l'intérieur des dossiers publics. Il fonctionne comme tâche d'arrière-plan et doit donc gérer n'importe quel nombre de fichiers.

Make Public

14
Selcuk

Utilisation du cli:

aws s3 ls s3://bucket-name --recursive > all_files.txt && grep .jpg all_files.txt > files.txt && cat files.txt | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'

6
Alexander Vitanov

J'avais ce besoin moi-même, mais le nombre de fichiers le rend très lent à faire en série. J'ai donc écrit n script qui le fait sur le service iron.ioIronWorker . Leurs 500 heures de calcul gratuites par mois sont suffisantes pour gérer même de grands seaux (et si vous dépassez cela, le prix est raisonnable). Comme il se fait en parallèle, il se termine en moins d'une minute pour les 32 000 objets que j'avais. Je pense également que leurs serveurs fonctionnent sur EC2, la communication entre le travail et S3 est donc rapide.

Tout le monde est invité à utiliser mon script pour ses propres besoins.

2
Eric Anderson

Jetez un œil à BucketExplorer il gère très bien les opérations en bloc et est un solide client S3.

2
willbt

On pourrait penser qu'ils rendraient public le comportement par défaut, n'est-ce pas? :) J'ai partagé votre frustration lors de la construction d'une API personnalisée pour interfacer avec S3 à partir d'une solution C #. Voici l'extrait qui permet de télécharger un objet S3 et de le définir par défaut en accès public en lecture:

public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) {
     string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower());
     DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes);
     msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType;
     msg.Headers[DreamHeaders.EXPECT] = "100-continue";
     msg.Headers[AWS_ACL_HEADER] = ToACLString(acl);
     try {
        Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader);
        s3Client.At(id).Put(msg);
     } catch (Exception ex) {
        throw new ApplicationException(String.Format("S3 upload error: {0}", ex.Message));
     }
}

La fonction ToACLString (acl) renvoie en lecture publique , BASE_SERVICE_URL est s3.amazonaws.com et la constante AWS_ACL_HEADER est x-amz-acl . Le plugin et DreamMessage vous sembleront probablement étranges car nous utilisons le cadre Dream pour rationaliser nos communications http. Essentiellement, nous faisons un http PUT avec les en-têtes spécifiés et une signature d'en-tête spéciale par spécifications aws (voir cette page dans les aws docs pour des exemples de construction de l'en-tête d'autorisation).

Pour modifier un ACL d'objet 1000 existant, vous pouvez écrire un script, mais il est probablement plus facile d'utiliser un outil GUI pour résoudre le problème immédiat. Le meilleur que j'ai utilisé jusqu'à présent provient d'une société appelée cloudberry pour S3; il semble qu'ils aient un essai gratuit de 15 jours pour au moins un de leurs produits. Je viens de vérifier qu'il vous permettra de sélectionner plusieurs objets à la fois et de définir leur ACL au public via le menu contextuel. Profitez du cloud!

0
Tahbaza