How do I delete a versioned bucket in AWS S3 using the CLI?

前端 未结 20 931
我在风中等你
我在风中等你 2020-12-07 16:34

I have tried both s3cmd:

$ s3cmd -r -f -v del s3://my-versioned-bucket/

And the AWS CLI:

$ aws s3 rm s3://my-v         


        
相关标签:
20条回答
  • 2020-12-07 17:09

    https://gist.github.com/wknapik/191619bfa650b8572115cd07197f3baf

    #!/usr/bin/env bash
    
    set -eEo pipefail
    shopt -s inherit_errexit >/dev/null 2>&1 || true
    
    if [[ ! "$#" -eq 2 || "$1" != --bucket ]]; then
        echo -e "USAGE: $(basename "$0") --bucket <bucket>"
        exit 2
    fi
    
    # $@ := bucket_name
    empty_bucket() {
        local -r bucket="${1:?}"
        for object_type in Versions DeleteMarkers; do
            local opt=() next_token=""
            while [[ "$next_token" != null ]]; do
                page="$(aws s3api list-object-versions --bucket "$bucket" --output json --max-items 1000 "${opt[@]}" \
                            --query="[{Objects: ${object_type}[].{Key:Key, VersionId:VersionId}}, NextToken]")"
                objects="$(jq -r '.[0]' <<<"$page")"
                next_token="$(jq -r '.[1]' <<<"$page")"
                case "$(jq -r .Objects <<<"$objects")" in
                    '[]'|null) break;;
                    *) opt=(--starting-token "$next_token")
                       aws s3api delete-objects --bucket "$bucket" --delete "$objects";;
                esac
            done
        done
    }
    
    empty_bucket "${2#s3://}"
    

    E.g. empty_bucket.sh --bucket foo

    This will delete all object versions and delete markers in a bucket in batches of 1000. Afterwards, the bucket can be deleted with aws s3 rb s3://foo.

    Requires bash, awscli and jq.

    0 讨论(0)
  • 2020-12-07 17:12

    Using boto3 it's even easier than with the proposed boto solution to delete all object versions in an S3 bucket:

    #!/usr/bin/env python
    import boto3
    
    s3 = boto3.resource('s3')
    bucket = s3.Bucket('your-bucket-name')
    bucket.object_versions.all().delete()
    

    Works fine also for very large amounts of object versions, although it might take some time in that case.

    0 讨论(0)
提交回复
热议问题