본문 바로가기

Dot Programming/Python

[Python] Python Boto3로 AWS S3 사용법 간단 정리

    aws s3 버킷 생성 및 iam user 생성 과정 보러가기

    1. Boto3 기본 설정하기

    1. dotenv를 설치하여 .env파일에 IAM USER정보 넣기

    $ pip install python-dotenv
    AWS_ACCESS_KEY_ID=MYACCESSKEYID
    AWS_ACCESS_KEY_SECRET=MYACCESSKEYSECRET

     

    aws_session()함수를 만든 다음 .env파일의 값을 불러와서(os.gotenv(..)) 인증된 새션 객체를 생성하여 반환한다.

    # file_manager.py
    
    import os
    import boto3
    
    from dotenv import load_dotenv
    load_dotenv(verbose=True)
    
    def aws_session(region_name='ap-northeast-2'):
        return boto3.session.Session(aws_access_key_id=os.getenv('AWS_ACCESS_KEY_ID'),
                                    aws_secret_access_key=os.getenv('AWS_ACCESS_KEY_SECRET'),
                                    region_name=region_name)
    

     

    2. awscli를 사용하여 cmd에 IAM USER 정보 넣기

    cmd창에 aws configure를 입력하여 정보를 입력한다. 

    $ aws configure
    AWS Access Key ID [None]: {자신의 IAM Access KEY}
    AWS Secret Access Key [None]: {자신의 IAM Secret Access KEY}
    Default region name [None]: ap-northeast-2
    Default output format [None]: 

     

    그러면 해당 awscli가 설치되어있는 Python 내부에서는 해당 aws계정에 접근이 가능하다.

    import boto3
    
    # Let's use Amazon S3
    s3 = boto3.resource('s3')  # s3에 대한 권한 및 상태를 s3(변수)에 저장
    for bucket in s3.buckets.all():
        print(bucket)

     

    2. Boto3를 사용하여 S3 버킷 생성 및  파일 업로드

    1.  resource 클래스의 create_bucket()로 버킷 생성

    boto3 resource 클래스의 create_bucket 메서드를 사용하여 AWS 이름 지정 규칙을 준수하는 문자열 이름과 함께 액세서 제어 목록 정책(ACL)을 다시 설정하는 문자열을 입력하여 버킷을 생성한다.

    def make_bucket(name, acl):
        session = aws_session()
        s3_resource = session.resource('s3')
        return s3_resource.create_bucket(Bucket=name, ACL=acl)
    
    s3_bucket = make_bucket('tci-s3-demo', 'public-read')

     

    2. resource 클래스의 Bucket()으로 파일 업로드

    children.csv 데모파일 

    name, age
    Kallin, 3
    Cameron, 0

     

    여기에서는 Bucket 리소스 클래스의 upload_file (...) 메서드 를 사용하여 children.csv 파일을 업로드한다.

    매개변수는 filename, s3객체 고유 식별자인 key가 있다. key는 s3 버킷과 유사한 AWS 객체 명명 규칙을 확인해야한다.

    def upload_file_to_bucket(bucket_name, file_path):
        session = aws_session()
        s3_resource = session.resource('s3')
        file_dir, file_name = os.path.split(file_path)
    
        bucket = s3_resource.Bucket(bucket_name)
        bucket.upload_file(
          Filename=file_path,
          Key=file_name,
          ExtraArgs={'ACL': 'public-read'}
        )
    
        s3_url = f"https://{bucket_name}.s3.amazonaws.com/{file_name}"
        return s3_url
    
    s3_url = upload_file_to_bucket('tci-s3-demo', 'children.csv')
    print(s3_url) # https://tci-s3-demo.s3.amazonaws.com/children.csv

     

     

    3. Boto3를 사용하여 S3 버킷 생성 및  파일 업로드

    데이터를 로컬에 저장할 필요없이 즉시 처리 한 다음 폐기하기 위해 S3 객체 데이터 만 다운로드하는 경우 메모리 스트림을 처리하는 io 모듈에서 유용한 스트리밍 클래스 BytesIO 사용한다.

     

    이러한 방식으로 S3 객체 데이터를 다운로드하려면 이전에 인 메모리 데이터에서 업로드된 about.txt 파일을 다운로드하여 아래에 설명 된대로 S3 객체 리소스 클래스  download_fileobj (...) 메서드 를 사용하는 것이 좋다.

    def download_data_from_bucket(bucket_name, s3_key):
        session = aws_session()
        s3_resource = session.resource('s3')
        obj = s3_resource.Object(bucket_name, s3_key)
        io_stream = io.BytesIO()
        obj.download_fileobj(io_stream)
    
        io_stream.seek(0)
        data = io_stream.read().decode('utf-8')
    
        return data
    
    
    about_data = download_data_from_bucket('tci-s3-demo', 'about.txt')
    print(about_data)

     

     

    그런 다음 데이터를 인쇄한다.

    My name is Adam
    I live in Lincoln
    I have a beagle named Doc Holiday

     


    ※ 참고

    https://thecodinginterface.com/blog/aws-s3-python-boto3/