AWS 스토리지 S3ㅣ파이썬 코드로 파일 업로드하는 코드까지

신 영·2024년 3월 26일
1

AWS

목록 보기
2/4
post-thumbnail

✅스토리지

기능/서비스EBS (Elastic Block Store)EFS (Elastic File System)S3 (Simple Storage Service)
유형블록 스토리지파일 시스템객체 스토리지
주요 사용 사례EC2 인스턴스에 연결된 영구적이고 고성능의 디스크로 사용여러 EC2 인스턴스에서 동시에 마운트 가능한 공유 파일 시스템웹사이트 호스팅, 백업, 아카이빙 등 대량의 데이터 저장 및 검색
가용성고가용성, 하나의 AZ(Availability Zone) 내 사용여러 AZ에 걸쳐 고가용성 제공전역 가용성, 여러 지역에서 접근 가능
내구성높은 내구성 (99.999%의 가용성)높은 내구성 (99.999999999%의 내구성)매우 높은 내구성 (99.999999999%의 내구성)
확장성수동으로 크기 조정 필요자동 확장무제한 스토리지, 자동 확장
성능프로비저닝된 IOPS 옵션으로 고성능 제공여러 EC2 인스턴스에서 동시 접근 가능하며, 성능은 사용량에 따라 달라짐높은 처리량 및 저지연
가격사용한 스토리지 양과 프로비저닝된 IOPS에 따라 비용 발생사용량에 기반하여 비용 발생 (스토리지 사용량과 요청 수에 따라 다름)저장된 데이터의 양, 요청 횟수, 데이터 전송 비용에 따라 비용 발생
적합한 사용 사례데이터베이스, 부팅 볼륨홈 디렉토리, 애플리케이션 공유 스토리지웹사이트 이미지 및 비디오, 데이터 레이크, 백업
  • 역할 : 백업/재해복구, 파일 저장소, 데이터베이스, 분석
  • 종류
특성블록 스토리지파일 스토리지오브젝트 스토리지
사용 예시데이터베이스 저장소, 가상 머신 디스크네트워크 파일 시스템, 공유 드라이브미디어 스트리밍, 백업 및 아카이브, 대규모 데이터 저장소
액세스 방식블록 수준 액세스, 랜덤 액세스파일 및 디렉토리 구조를 통한 액세스파일 시스템이나 API를 통한 객체 수준 액세스
파일 시스템해당 없음존재함파일 시스템 없음 (객체 단위 저장)
데이터 구조블록으로 분할된 고정 크기 데이터파일 및 디렉토리 구조를 가진 데이터객체(파일)와 메타데이터(예: 키, 값)가 결합된 데이터
확장성유연하지 않음중간 정도매우 높음
가용성높은 가용성, 장애 복구가 더 어려움일반적으로 높은 가용성, 장애 복구가 가능매우 높은 가용성, 자동 복제 및 장애 복구
비용고가중간 정도저렴
대용량 데이터 처리미비한 대용량 데이터 처리 성능적절한 대용량 데이터 처리 성능우수한 대용량 데이터 처리 성능
보안데이터 암호화 및 접근 제어가 필요파일 시스템의 접근 제어 및 암호화가 가능데이터 암호화 및 접근 제어가 필요하지만 파일 시스템의 보안은 필요하지 않음
예시 서비스 및 제품AWS EBS (Elastic Block Store), 온프레미스 SAN/NASAWS EFS (Elastic File System), 온프레미스 NASAWS S3 (Simple Storage Service), Google Cloud Storage, Azure Blob Storage

✅실습1 : S3 버킷 만들기

1. S3 버킷 만들기


2. 폴더 생성 및 파일 업로드


프라이빗으로 버킷을 만들었어서 권한이 없다고 뜬다

퍼블릭으로 바꿔주면 사진이 잘 뜬다

다시 프라이빗으로 바꾸려면 cli 명령어로 설정해야 한다

버전 관리 활성화하면 이 이후 업로드하는 것부터 버전 기록 된다


✅실습2 : 파이썬 파일로 로컬 사진을 S3에 업로드 해보자

<조건 1>
S3의 옵션을 수정하지 않고 코드를 통해 퍼블릭으로 업로드 되도록
<조건 2>
객체 URL을 클릭하면 다운 받아지는 게 아니라 미리보기가 되도록

예시 코드 1

import boto3
from botocore.exceptions import NoCredentialsError

ACCESS_KEY = '(액세스키)'
SECRET_KEY = '(비밀 액세스키)'
BUCKET_NAME = '(버킷 이름)'

def upload_to_s3(file_name, bucket, object_name=None):
    """
    파일을 S3 버킷에 업로드하고 퍼블릭으로 설정합니다.

    :param file_name: 업로드할 파일의 경로
    :param bucket: S3 버킷 이름
    :param object_name: 버킷에 저장될 파일 이름. 지정하지 않으면 file_name이 사용됩니다.
    """
    if object_name is None:
        object_name = '(폴더명)/' + file_name.split('/')[-1]   # S3의 shinyoung 폴더에 업로드

    # S3 서비스 클라이언트를 생성합니다.
    s3_client = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
    
    try:
        # 파일을 업로드하고 퍼블릭으로 설정합니다.
        s3_client.upload_file(file_name, bucket, object_name, 
                              ExtraArgs={'ACL': 'public-read', 'ContentType': 'image/jpeg'})  
                              # MIME 유형을 설정하여 사진을 바로 볼 수 있도록 설정
        print(f"{file_name} has been uploaded to {bucket}/{object_name} and made public")

        # 공개적인 URL을 생성합니다.
        url = s3_client.generate_presigned_url('get_object',
                                               Params={'Bucket': bucket, 'Key': object_name},
                                               ExpiresIn=10800)  # URL 만료 시간(3시간)
        print(f"Public URL to access the file: {url}")
    except NoCredentialsError:
        print("Credentials not available")

if __name__ == "__main__":
    file_name = '짱구 배경화면.jpeg'  # 로컬에서 업로드하려는 파일명
    upload_to_s3(file_name, BUCKET_NAME, object_name=None)

예시 코드 2

출처 : https://velog.io/@glassesholder/posts

import boto3
import mimetypes
def upload_to_s3(file_name, bucket_name, object_name=None):
    """
    AWS S3로 파일을 업로드하면서 ACL을 설정하여 퍼블릭으로 설정하는 함수
    :param file_name: 업로드할 파일의 로컬 경로
    :param bucket_name: S3 버킷 이름
    :param object_name: S3에 저장될 객체 이름 (선택 사항)
    :return: 성공적으로 업로드된 경우 True, 그렇지 않으면 False
    """
    # 객체 이름이 제공되지 않으면 로컬 파일 이름을 사용
    if object_name is None:
        object_name = file_name
    # AWS credentials 로드
    session = boto3.Session(
        aws_access_key_id='(액세스키)',
        aws_secret_access_key='(비밀 액세스키)'
    )
    # S3 클라이언트 생성
    s3_client = session.client('s3')
    try:
        # 파일 업로드
        content_type, _ = mimetypes.guess_type(file_name)
        print(content_type)
        s3_client.upload_file(file_name, bucket_name, object_name, ExtraArgs={'ContentType': content_type})
        s3_client.put_object_acl(ACL='public-read', Bucket=bucket_name, Key=object_name)
        # ACL 설정하여 퍼블릭으로 설정
    except Exception as e:
        print(f"파일 업로드 실패: {e}")
        return False
    return True
if __name__ == "__main__":
    # 파일 이름과 버킷 이름을 지정하여 함수 호출
    file_name = '짱구 배경화면.jpg'  # 업로드할 이미지 파일의 로컬 경로
    bucket_name = '(버킷 이름)'  # S3 버킷 이름
    object_name = '(객체 이름)'  # S3에 저장될 객체 이름 (선택 사항)
    # 파일 업로드
    upload_to_s3(file_name, bucket_name, object_name)

업로드된 파일을 삭제하는 코드

# 삭제하는 방법

import boto3
from botocore.exceptions import NoCredentialsError

ACCESS_KEY = '(액세스키)'
SECRET_KEY = '(비밀 액세스키)'
BUCKET_NAME = '(버킷 이름)'

def delete_from_s3(bucket, object_name):
    """
    S3 버킷에서 객체를 삭제합니다.

    :param bucket: S3 버킷 이름
    :param object_name: 삭제할 객체의 키
    """
    # S3 서비스 클라이언트를 생성합니다.
    s3_client = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
    
    try:
        # 객체 삭제를 수행합니다.
        s3_client.delete_object(Bucket=bucket, Key=object_name)
        print(f"{object_name} has been deleted from {bucket}")
    except NoCredentialsError:
        print("Credentials not available")

if __name__ == "__main__":
    object_name = '짱구 배경화면.jpg'  # 삭제할 객체의 키
    delete_from_s3(BUCKET_NAME, object_name)

결과물

미리보기도 잘 된다.


📖'천재교육'의 '프로젝트 기반 빅데이터 서비스 개발자 양성 과정' 내용을 바탕으로 작성하였습니다.

0개의 댓글