Amazon S3 버킷에서 파일을 삭제하는 방법은 무엇입니까?


91

Amazon s3 버킷에서 필요한 파일을 삭제하는 코드를 Python으로 작성해야합니다. Amazon s3 버킷에 연결하고 파일을 저장할 수 있지만 파일을 삭제하려면 어떻게해야합니까?


S3 지원을 위해 어떤 (있는 경우) Python 라이브러리를 사용하고 있습니까? 아니면 Python 코드에서 REST 또는 SOAP 인터페이스로 직접 이동 하시겠습니까?
TJ Crowder

1
저는 파이썬 라이브러리 boto.s3을 사용하고 있습니다
Suhail

답변:


94

사용 boto3(현재 버전 1.4.4)를 사용 S3.Object.delete().

import boto3

s3 = boto3.resource('s3')
s3.Object('your-bucket', 'your-key').delete()

1
개체가 없으면 오류가 발생합니까?
Akash Tantri 2019

2
@AkashTantri 개인적으로 시도하지는 않았지만 문서는 null 버전 (있는 경우)을 제거 한다고 말합니다. [...] null 버전이 없으면 Amazon S3는 객체를 제거하지 않습니다. 그래서 제 생각에는 오류가 발생하지 않을 것입니다. 당신이 그것을 시도 일 경우 (다만 그런 짓을 s3.Object('existing-bucket', 'bogus-key').delete()하고 어떻게되는지 또한보십시오. s3.Object('bogus-bucket', 'bogus-key').delete().
Kohányi 로버트

매력처럼 작동,
그것이

@yunus 이것은 심각한 의견입니까?
Henry Henrinson 2010 년

your-key여기 your-bucket가 S3 의 실제 파일 이름을 의미 합니까 ?
Underoos 2010

91

boto를 사용하여 한 가지 더 방법을 찾았습니다.

from boto.s3.connection import S3Connection, Bucket, Key

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY)

b = Bucket(conn, S3_BUCKET_NAME)

k = Key(b)

k.key = 'images/my-images/'+filename

b.delete_key(k)

10
당신이 양동이에 모든 것을 삭제하고 싶다면, 당신은 할 수 :for x in b.list(): b.delete_key(x.key)
jontsai

19
내 파일에이 밝혀 얼마나 사랑bucket.list()
아르투르 Sapek

이 코드 스 니펫이 표시된대로 작동하려면 Bucket및 을 가져와야 Key합니다. 에서와 같이 :from boto.s3.connection import S3Connection, Bucket, Key
Nick Chammas 2014

내가받을 >>> from boto.s3.connection import S3Connection, Bucket, Key Traceback (most recent call last): File "<console>", line 1, in <module> ImportError: No module named boto.s3.connectionboto3에 대한 답을 업데이트하십시오
해리 모레노에게

1
그것을 파악하고 솔루션 쓴 harrymoreno.com/2017/04/24/...
해리 모레노

74

Python boto3 SDK를 사용하고 (그리고 AWS에 대한 자격 증명이 설정되었다고 가정) 다음은 버킷에서 지정된 객체를 삭제합니다.

import boto3

client = boto3.client('s3')
client.delete_object(Bucket='mybucketname', Key='myfile.whatever')

6
@Rob boto3 문서는 오해의 소지가 있습니다. 객체의 버전이 지정되면 삭제 마커가 생성됩니다. 그렇지 않으면 개체가 삭제됩니다.
jarmod

1
깨끗하고 간단합니다. 허용되는 대답이 될 수 있으며 둘 다 작업에 대한 최선의 접근 방식이므로 @ Kohányi Róbert의 대답과 확실히 병합되어야합니다.
PaulB

15

2020 년에 오신 것을 환영합니다. 여기에 Python / Django의 답변이 있습니다.

from django.conf import settings 
import boto3   
s3 = boto3.client('s3')
s3.delete_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=f"media/{item.file.name}")

답을 찾기에는 너무 오래 걸렸고 이렇게 간단했습니다.


4

이 쉬운 방법이 없다는 것에 놀랐습니다 : key.delete():

from boto.s3.connection import S3Connection, Bucket, Key

conn = S3Connection(AWS_ACCESS_KEY, AWS_SECERET_KEY)
bucket = Bucket(conn, S3_BUCKET_NAME)
k = Key(bucket = bucket, name=path_to_file)
k.delete()

4

Boto3는 수시로 변경 될 수 있으므로 업데이트 된 메서드 를 찾아보십시오 . my_bucket.delete_objects () 사용 했습니다 .

import boto3
from boto3.session import Session

session = Session(aws_access_key_id='your_key_id',
                  aws_secret_access_key='your_secret_key')

# s3_client = session.client('s3')
s3_resource = session.resource('s3')
my_bucket = s3_resource.Bucket("your_bucket_name")

response = my_bucket.delete_objects(
    Delete={
        'Objects': [
            {
                'Key': "your_file_name_key"   # the_name of_your_file
            }
        ]
    }
)


3

어떤 인터페이스를 통해? REST 인터페이스를 사용하면 다음과 같이 delete를 보냅니다 .

DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: signatureValue

SOAP 인터페이스를 통해 :

<DeleteObject xmlns="http://doc.s3.amazonaws.com/2006-03-01">
  <Bucket>quotes</Bucket>
  <Key>Nelson</Key>
  <AWSAccessKeyId> 1D9FVRAYCP1VJEXAMPLE=</AWSAccessKeyId>
  <Timestamp>2006-03-01T12:00:00.183Z</Timestamp>
  <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>
</DeleteObject>

당신은 파이썬 라이브러리를 사용하는 경우 BOTO 등이 , 그것은처럼 "삭제"기능을 노출한다 delete_key().


예, 저는 그 파이썬 라이브러리를 사용하고 있지만 파일이 삭제됩니까? 이 방법으로해야합니까 : k.key = 'images / anon-images / small /'+ filename k.delete_key () 맞습니까? 알려주세요.
Suhail

@Suhail : 저는 그 라이브러리를 사용하지 않았지만 제가 링크 한 소스에서 실제로하고있는 것은 DELETEREST 인터페이스를 통한 호출입니다. 예, "delete_key"라는 이름 (내가 동의하는 것은 불분명 함)에도 불구하고 실제로 키가 참조 하는 객체를 삭제하는 것 입니다.
TJ Crowder

1
이름에 공통 접두사가있는 많은 파일을 제거하는 것은 어떻습니까? S3는 이러한 경우에 대량 삭제를 허용합니까, 아니면 하나씩 삭제해야합니까 (느림)?
Illarion Kovalchuk

@Shaman : 저는 S3 전문가는 아니지만 제가 아는 한 특정 파일 만 삭제할 수 있습니다. 그러나 S3 전문가의 관심을 끌기 위해 실제로 질문을하고 싶을 것입니다.
TJ Crowder

여기에 댓글을 단 직후에 그런 질문을 추가했습니다. 아직 2 개의 뷰가 있습니다. :)
Illarion Kovalchuk

2

이를 수행하는 가장 간단한 방법은 다음과 같습니다.

import boto3
s3 = boto3.resource("s3")
bucket_source = {
            'Bucket': "my-bcuket",
            'Key': "file_path_in_bucket"
        }
s3.meta.client.delete(bucket_source)

1

지금은 Linux 유틸리티 s3cmd를 사용하여 문제를 해결했습니다 . Python에서 다음과 같이 사용했습니다.

delFile = 's3cmd -c /home/project/.s3cfg del s3://images/anon-images/small/' + filename
os.system(delFile)

1
S3와 통신하기 위해 서브 쉘을 호출하는 것은 정확히 파이썬 적이지는 않지만 (라이브러리 또는 직접 HTTP 트랜잭션이 더 우아함) 여전히 작동합니다. 나는 그것이 반대표를받을 가치가 없다고 생각합니다. +1.
Randall Cook

1

그것은 나를 위해 일했습니다.

import boto
import sys
from boto.s3.key import Key
import boto.s3.connection

AWS_ACCESS_KEY_ID = '<access_key>'
AWS_SECRET_ACCESS_KEY = '<secret_access_key>'
Bucketname = 'bucket_name' 

conn = boto.s3.connect_to_region('us-east-2',
        aws_access_key_id=AWS_ACCESS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
        is_secure=True,              
        calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )
bucket = conn.get_bucket(Bucketname)

k = Key(bucket)

k.key = 'filename to delete'
bucket.delete_key(k)   

1

aws cli : https://aws.amazon.com/cli/ 및 일부 unix 명령을 사용하여 수행 할 수 있습니다 .

이 aws cli 명령이 작동해야합니다.

aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>" 

하위 폴더를 포함하려면 --recursive 플래그를 추가해야합니다.

또는 유닉스 명령으로 :

aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_shell>   -c 'aws s3 rm s3:// <your_bucket_name>  /% $1'

설명:

  1. 버킷 --pipe-> 의 모든 파일 나열
  2. 네 번째 매개 변수 (파일 이름) 가져 오기 --pipe-> // 패턴과 일치하도록 linux 명령으로 바꿀 수 있습니다.
  3. aws cli로 삭제 스크립트 실행

1

자체 로컬 호스트 콘솔을 사용하여 파일을 삭제하려는 경우 시스템에 이미 액세스 ID와 비밀 키를 할당했다고 가정하고이 Python 스크립트를 실행 해 볼 수 있습니다.

import boto3

#my custom sesssion
aws_m=boto3.session.Session(profile_name="your-profile-name-on-local-host")
client=aws_m.client('s3')

#list bucket objects before deleting 
response = client.list_objects(
    Bucket='your-bucket-name'
)
for x in response.get("Contents", None):
    print(x.get("Key",None));

#delete bucket objects
response = client.delete_object(
    Bucket='your-bucket-name',
    Key='mydocs.txt'
)

#list bucket objects after deleting
response = client.list_objects(
    Bucket='your-bucket-name'
)
for x in response.get("Contents", None):
    print(x.get("Key",None));

0

다음은 나를 위해 일했습니다 (Django 모델에 대한 예제를 기반으로하지만 delete메서드 코드를 자체적으로 사용할 수 있음).

import boto3
from boto3.session import Session
from django.conf import settings

class Video(models.Model):
    title=models.CharField(max_length=500)
    description=models.TextField(default="")
    creation_date=models.DateTimeField(default=timezone.now)
    videofile=models.FileField(upload_to='videos/', null=True, verbose_name="")
    tags = TaggableManager()

    actions = ['delete']

    def __str__(self):
        return self.title + ": " + str(self.videofile)

    def delete(self, *args, **kwargs):
        session = Session (settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
        s3_resource = session.resource('s3')
        s3_bucket = s3_resource.Bucket(settings.AWS_STORAGE_BUCKET_NAME)

        file_path = "media/" + str(self.videofile)
        response = s3_bucket.delete_objects(
            Delete={
                'Objects': [
                    {
                        'Key': file_path
                    }
                ]
            })
        super(Video, self).delete(*args, **kwargs)

0

다음은 버킷을 삭제하는 데 사용할 수있는 코드 스 니펫입니다.

import boto3, botocore
from botocore.exceptions import ClientError

s3 = boto3.resource("s3",aws_access_key_id='Your-Access-Key',aws_secret_access_key='Your-Secret-Key')
s3.Object('Bucket-Name', 'file-name as key').delete()

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.