클라우드 Cloud/아마존웹서비스 AWS

Q. Python으로 AWS S3에서 파일 업로드 다운로드 하는 방법은?

Tap to restart 2022. 8. 5. 19:00
반응형

A. S3 버킷 추가 → S3 업로드 다운로드 권한을 가진 그룹 추가 → S3 사용자 추가해서 Access key ID, Secret access key 얻기 → 업로드 구현 → 다운로드 구현 순으로 진행해보면 된다.

 

S3 버킷 생성하기

먼저 버킷을 생성하자. 버킷 생성하기로 가자.

버킷 이름은 전세계에서 유일해야 한다. 회사이름이나 본인 이름을 접두사로 하거나 본인 도메인을 접두사로 하면 중복을 피할 수 있다. 

테스트를 위한 것이니 내 경우 'taptorestart-test-s3'라고 만들었다. 

 

AWS Create bucket

 

S3 업로드 다운로드 권한을 가진 그룹과 사용자 추가하기

 

우선 그룹을 추가한다. 그룹 명은 S3FullAccess

 

ADD user groups

 

Create group을 눌러서 그룹을 추가한다.

 

AWS Create user gruop

 

이번에는 사용자를 추가한다. 

 

AWS Add user

 

Set permissions에서 앞에서 만든 S3FullAcess Group을 활용한다.

 

AWS Add user to group

쭉쭉 넘어간다.

아래처럼 Access key ID, Secret access key를 얻을 수 있다.

이 두 값을 잘 저장해 둔다.

 

AWS Add user

 

프로젝트 디렉터리를 만들자. 

프로젝트 루트 디렉터리에 .env 파일을 만들고 앞에서 얻은 키값을 넣는다. 

AWS_ACCESS_KEY_ID=앞에서 얻은 AWS_ACCESS_KEY_ID값
AWS_SECRET_ACCESS_KEY=앞에서 얻은 AWS_SECRET_ACCESS_KEY값

 

파일 업로드 구현

S3 업로드 공식 문서를 참고해서 구현하면 아래와 같다.

python-dotenv를 활용했는데 이 팩키지는 .env 파일에 있는 키와 값을 환경변수로 등록해주는 팩키지다. 

예제는 python-dotenv example을 참고하자.

 

환경 변수로 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY를 등록해주면 자동으로 가져와서 사실 

boto3.client('s3') 이렇게 짧게 적어도 된다. 

당연하게도 ACCESS_KEY_ID로 등록하거나, AWS_ACCESS_KEYID로 등록하면 못 찾게 된다. 그런 경우를 방지하고자 코드에 추가한 것이다.

 

import os
import logging
import boto3
from botocore.exceptions import ClientError

from dotenv import load_dotenv

load_dotenv()


if __name__ == '__main__':
    AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
    AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
    REGION_NAME = 'ap-northeast-2'
    s3_client = boto3.client(
        service_name='s3', region_name=REGION_NAME, aws_access_key_id=AWS_ACCESS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY
    )
    filename = 'hello_world.txt'
    bucket = 'taptorestart-test-s3'
    object_name = 'hello_world_in_s3.txt'
    try:
        response = s3_client.upload_file(filename, bucket, object_name)
    except ClientError as e:
        logging.error(e)

 

해당 프로젝트에 있는 파일 목록은 아래와 같다.

.env 파일 위치

실행하면 아래처럼 파일이 업로드 된 것을 확인할 수 있다.

 

다운로드 구현

다운로드 구현도 어렵지 않다. 공식 문서를 참고하자.

 

코드 예

import os
import logging
import boto3
from botocore.exceptions import ClientError

from dotenv import load_dotenv

load_dotenv()


if __name__ == '__main__':
    AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
    AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
    REGION_NAME = 'ap-northeast-2'
    s3_client = boto3.client(
        service_name='s3', region_name=REGION_NAME, aws_access_key_id=AWS_ACCESS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY
    )
    filename = 'hello_world_from_s3.txt'
    bucket = 'taptorestart-test-s3'
    object_name = 'hello_world_in_s3.txt'
    s3 = boto3.client('s3')
    with open(filename, 'wb') as f:
        s3.download_fileobj(bucket, object_name, f)

 

코드를 실행하면 hello_world_from_s3.txt 파일이 생겨난 것을 볼 수 있다. 

 

전체 코드는 python-examples 저장소에서 확인할 수 있다.

반응형