본문 바로가기
Cloud

[AWS] S3 소개 및 버킷 생성부터 파일 업로드 다운로드까지

by nothing-error 2023. 2. 10.

S3 소개

Amazon Simple Storage Service (Amazon S3)는 Amazon Web Services (AWS)의 가장 오래된 서비스 중 하나입니다. S3는 간단하고 효율적인 클라우드 저장소 솔루션으로, 웹에서 개인 또는 사업용 데이터를 저장, 보관, 복사, 복제 및 배포할 수 있는 기능을 제공합니다.

 

S3 특징

  1. 클라우드 저장소: Amazon S3는 클라우드 저장소 솔루션으로, 웹에서 개인 또는 사업용 데이터를 저장, 보관, 복사, 복제 및 배포할 수 있는 기능을 제공합니다.
  2. 안정성 높은 저장소: S3는 고성능 데이터 센터에서 높은 안정성, 가용성, 확장성 등의 특징을 갖추고 있어, 데이터의 안정적인 저장, 보관 및 관리가 가능합니다.
  3. 확장성: S3는 자동으로 데이터를 분산하여 저장하며, 데이터의 양이 증가할수록 자동으로 스케일 아웃하여 저장소 용량을 확장할 수 있습니다.
  4. 저장소 구성: S3는 버킷과 오브젝트로 구성되어 있어, 버킷에는 오브젝트들이 담겨있습니다. 오브젝트는 파일 또는 데이터 스트림으로 구성되어 있습니다.
  5. 저장소 제어: S3는 버킷 및 오브젝트 제어 기능을 제공하여, 사용자는 저장소의 접근 권한, 데이터의 보안, 데이터의 암호화 등을 제어할 수 있습니다. 또한, S3는 다양한 규정에 맞춰 데이터 보호를 제공하는 기능도 제공합니다.
  6. 고속의 데이터 전송: S3는 고속의 데이터 전송 속도를 제공하여, 대용량 데이터의 전송 및 다운로드에 적합합니다.
  7. 저장소의 유연성: S3는 다양한 파일 형식, 데이터 타입 및 크기를 지원하며, 저장소를 유연하게 사용할 수 있습니다.
  8. 저렴한 비용: S3는 고객이 실제로 사용한 데이터 용량에 대한 비용으로 과금되므로, 고객은 불필요한 비용 낭비를 피할 수 있습니다.

 

버킷생성

 

 AWS에서 상단에 S3를 검색하면 아래와 같이 버킷 생성페이지로 이동할 수 있습니다.

 ACL 의 경우 권한 설정에 대한 부분이며 현재는 비활성화로 생성하겠습니다.

 

현재는 모든 퍼블릭 액세스를 차단하지 않고 생성하며 이후에 버킷정책 설정 이후에 차단하겠습니다.

버킷 버전관리는 비활성화하겠습니다.

 

버킷을 생성하였으면 다음으로 버킷정책을 설정하겠습니다.

http://awspolicygen.s3.amazonaws.com/policygen.html 이 사이트에서 버킷정책 세팅값을 쉽게 설정할 수 있습니다.

ARN 부분은 생성한 버킷의 [속성] 부분을 보시면 확인하실 수 있습니다. 

저의 경우는 모든 Actions 을 체크해서 생성하겠습니다. 생성하시게되면 json형식으로 생성되며 복사하신 다음

[버킷] -> [권한] 으로 이동해줍니다. 여기에 복사하신 내용을 [편집] 하셔서 붙여넣어주시면 됩니다.

 

 

 

다음으로 이전에 퍼블릭 액세스를 차단하지 않았기 때문에 차단해주겠습니다.

모두 차단해줍니다.

 

 

여기까지 완료했다면  아래와 같은 상태이며 기본 설정은 끝났습니다.

 

버킷에 파일 업로드 & 다운로드

 

1. 키생성

AWS 상단 검색에 IAM 을 검색합니다. 화면 촤측에 아래와 같은 링크를 클릭해줍니다.

이 페이지에서 액세스 키를 생성하시면 됩니다.(만약 멀티 팩터 인증이 되어있지 않다면 같이 해주시면 계정 보안에 유리합니다)

 

2. boto3 설치

원하시는 환경에 boto3를 설치해줍니다. (Python용 AWS SDK인 boto3를 사용하여 AWS를 빠르게 시작하십시오. Boto3를 사용하면 Python 애플리케이션, 라이브러리 또는 스크립트를 Amazon S3, Amazon EC2, Amazon DynamoDB 등 AWS 서비스와 쉽게 통합할 수 있습니다.) 

pip install boto3

 

3. 버킷에 업로드 & 다운로드 & 삭제

 

#main.py

from s3_manager import S3StorageManager
import os
import boto3
current_directory = os.getcwd()
print(current_directory)
accessKey = os.environ.get('accessKey')
secretKey = os.environ.get('secretKey')
region = os.environ.get('region')
s3_client = boto3.client('s3', 
                aws_access_key_id=accessKey, 
                aws_secret_access_key=secretKey, 
                region_name=region)


s3sm=S3StorageManager(s3_client)

s3sm.upload_file(file_name='s3/test.txt', bucket='dahybucket', object_name=None)

# s3sm.download_file(file_name='s3/test3.txt', bucket='dahybucket', object_name='test.txt')

 

코드에 대해 설명드리면 위에서 언급했던 IAM 에서 발급받은 accesskey와 secretkey를 python-dotenv 를 통해서 .env 파일에 저장해놓았습니다. 이 환경변수의 값을 가져와서 각각 변수에 할당해줬습니다. 다음으로 client를 생성해 줍니다.

다음으로 저의 경우에는 s3 와 관련된 함수들을 별도의 클래스로 묶어서 개인적으로 기억하거나 사용하기 편하도록 약간! 수정해놓았습니다.  

 

 

#s3_manage.py

import os
from set_log import set_log
from botocore.exceptions import ClientError
logger=set_log()

# s3 클라이언트 생성
#https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-example-download-file.html


class S3StorageManager:
    def __init__(self, s3_client):
        self.s3_client = s3_client
        
        
    def create_bucket(self, bucket_name, region=None):
        """Create an S3 bucket in a specified region

        If a region is not specified, the bucket is created in the S3 default
        region (us-east-1).

        :param bucket_name: Bucket to create
        :param region: String region to create bucket in, e.g., 'us-west-2'
        :return: True if bucket created, else False
        """

        # Create bucket
        try:
            if region is None:
                
                self.s3_client.create_bucket(Bucket=bucket_name)
                logger.info(f'버킷생성 완료: {bucket_name}')
            else:
                
                location = {'LocationConstraint': region}
                self.s3_client.create_bucket(Bucket=bucket_name,
                                        CreateBucketConfiguration=location)
                logger.info(f'버킷생성 완료: {bucket_name}')
        except ClientError as e:
            logger.error('create bucket error: ',e)
            return False
        return True

    def upload_file(self, file_name, bucket, object_name=None):
        """Upload a file to an S3 bucket

        :param file_name: File to upload
        :param bucket: Bucket to upload to
        :param object_name: S3 object name. If not specified then file_name is used
        :return: True if file was uploaded, else False
        """
    # If S3 object_name was not specified, use file_name
        if object_name is None:
            object_name = os.path.basename(file_name)
        try:
            self.s3_client.upload_file(file_name, bucket, object_name)
            logger.info(f'업로드 완료: {file_name}')
        except ClientError as e:
            logger.error('upload_file error: ',e)
            return False
        return True
    
    def download_file(self, file_name, bucket, object_name ):
        BUCKET_NAME=bucket
        OBJECT_NAME=object_name
        FILE_NAME=file_name
        try:
            self.s3_client.download_file(BUCKET_NAME, OBJECT_NAME, FILE_NAME)
            logger.info(f'다운로드 완료: {file_name}')
        except ClientError as e:
            logger.error('download_file error: ',e)
            return False
        return True

거의 복붙수준이고, 로그 기록을 위해 코드만 몇줄 추가해놓았습니다. 

 

한 번 업로드를 해보겠습니다. 

s3sm.upload_file(file_name='s3/test.txt', bucket='dahybucket', object_name=None)

 

버킷을 확인해보니 아래와 같이 test.txt 파일이 잘 업로드 됐네요.

#dahybucket

 

다운로드를 한 번 해보겠습니다.  먼저 기존 test.txt 파일을 삭제했습니다.

 

아래 코드를 실행해보겠습니다.

s3sm.download_file(file_name='s3/test3.txt', bucket='dahybucket', object_name='test.txt')

잘 다운받아졌습니다.

 

 

오브젝트의 삭제는 아래코드로 가능합니다.

s3 = boto3.resource('s3', 
                aws_access_key_id=accessKey, 
                aws_secret_access_key=secretKey, 
                region_name=region)
object = s3.Object('dahybucket','test.txt')
object.delete()

webui 확인해보니 test.txt 파일이 제거됐네요.

 

결론

지금까지 S3에 대한 간단한 설명과 함께 버킷 생성부터 오브젝트 삭제까지 단순한 기능 몇가지를 살펴보았습니다.  boto3 documents 를 확인해보니 오랜 역사를 자랑하는 S3답게 관련해서 기능들이 상당히 많습니다. 이 많은 기능들을 단기간 내에 모두 익히기는 어려울 것이고, 프로젝트를 진행하면서 간단한 작업들은 WEB 에서 하고 손이 많이가거나 자동화가 필요한 부분들만 코드로 작성하는 것이 좋을 듯합니다.(확인해보니 logging 하는 것도 있더군요....)

 

 

댓글