2017-10-17 16 views

Répondre

0

REMARQUE: Il s'agit d'extraits de code qui peuvent nécessiter que vous apportiez des modifications sur VOTRE CÔTÉ pour le faire fonctionner.

Vous devrez implémenter la méthode ci-dessous:

//EmptyBucket empties the Amazon S3 bucket 
    func (s awsS3) EmptyBucket(bucket string) error { 
     log.Info("removing objects from S3 bucket : ", bucket) 
     params := &s3.ListObjectsInput{ 
      Bucket: aws.String(bucket), 
     } 
     for { 
      //Requesting for batch of objects from s3 bucket 
      objects, err := s.Client.ListObjects(params) 
      if err != nil { 
       return err 
      } 
      //Checks if the bucket is already empty 
      if len((*objects).Contents) == 0 { 
       log.Info("Bucket is already empty") 
       return nil 
      } 
      log.Info("First object in batch | ", *(objects.Contents[0].Key)) 

      //creating an array of pointers of ObjectIdentifier 
      objectsToDelete := make([]*s3.ObjectIdentifier, 0, 1000) 
      for _, object := range (*objects).Contents { 
       obj := s3.ObjectIdentifier{ 
        Key: object.Key, 
       } 
       objectsToDelete = append(objectsToDelete, &obj) 
      } 
      //Creating JSON payload for bulk delete 
      deleteArray := s3.Delete{Objects: objectsToDelete} 
      deleteParams := &s3.DeleteObjectsInput{ 
       Bucket: aws.String(bucket), 
       Delete: &deleteArray, 
      } 
      //Running the Bulk delete job (limit 1000) 
      _, err = s.Client.DeleteObjects(deleteParams) 
      if err != nil { 
       return err 
      } 
      if *(*objects).IsTruncated { //if there are more objects in the bucket, IsTruncated = true 
       params.Marker = (*deleteParams).Delete.Objects[len((*deleteParams).Delete.Objects)-1].Key 
       log.Info("Requesting next batch | ", *(params.Marker)) 
      } else { //if all objects in the bucket have been cleaned up. 
       break 
      } 
     } 
     log.Info("Emptied S3 bucket : ", bucket) 
     return nil 
    } 

MISE À JOUR: La dernière version du SDK AWS pour GO a résolu le problème avant que j'avais.

+0

Avez-vous classé un problème de panique dans le sdk? Avez-vous essayé l'API actuelle avec 'ListObjectsV2'? – JimB

+0

Non, je n'ai pas encore enregistré de problème de panique. Je prévois de le faire ce week-end. Oui, ce problème se produit en utilisant l'API actuelle. – SKRelan

0

AWS SDK for Go propose une abstraction par lot Amazon S3. Jetez un oeil here.

0

N'oubliez pas que par défaut, ListObjects renvoie uniquement jusqu'à 1000 éléments de compartiment. Si vous avez plus de 1000, vérifiez la propriété IsTruncated sur la valeur de retour. Si la valeur est true, utilisez la propriété NextMarker à partir de la valeur de retour pour obtenir les 1000 éléments suivants.

Voir mon exemple dans le guide dev Go: http://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/s3-example-basic-bucket-operations.html#s3-examples-bucket-ops-delete-all-bucket-items