Objectif: Pour vider un compartiment S3 existant à l'aide du kit AWS SDK for GOlang.Comment vider un compartiment S3 à l'aide du kit AWS SDK pour GOlang?
Répondre
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.
AWS SDK for Go propose une abstraction par lot Amazon S3. Jetez un oeil here.
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
** Recommandation: ** Avez-vous contacté AWS ou lire leurs mises à jour? – Ibo
J'ai créé cette question pour aider les personnes susceptibles de faire face au même problème. J'ai mis dans ma solution ci-dessous. Merci pour le conseil si! – SKRelan