python boto3 사용해서 bucket 만들기, 파일 올리기, 다운받기, 삭제하기까지!

ay.zip·2022년 5월 15일
0

AWS

목록 보기
4/8
post-thumbnail

✅ 포스트 목차 ✅

(1) AWS IAM 만들기
(2) Boto3 다운받고 IAM과 연결하기
(3) bucket을 region 별로 만들어보기
(4) Upload
(5) Download
(6) Delete


AWS IAM 만들기

(1) 검색창에 IAM 검색하고 해당 페이지로 들어간다

(2) Add users 버튼을 눌러서 계정을 만든다.

(3) 3번 페이지는 그냥 패스
(4) 4번 페이지에서도 그냥 create user

(5) 마지막 페이지에서 나오는 csv를 꼭 다운받아두자.


Boto3를 다운받고 계정을 연결하기

pip install boto3
pip install awscli

asw configure <- 여기서 아까 다운 받은 csv가 필요

AWS Access Key ID [None]: csv에 나온대로 입력
AWS Secret Access Key [None] : csv에 나온대로 입력
// 나는 서울로 나와있어서 이렇게 작성
Default region name [None] : ap-northeast-2
Default output format [None]: 빈칸으로 남김

잘 연결되었는지 확인해보기

import boto3

s3 = boto3.resource('s3')

for bucket in s3.buckets.all():
    print(bucket.name)


만약 만들어 놓은 bucket이 있다면 이름이 나와야하고, 없다면 종료된다. 별 다른 에러가 뜨지 않는다면 잘 만들어진 것이라고 보면 되겠다.


bucket을 region 별로 만들어보기

교수님께서 한 번 해보라고 하셔서 몇 개 만들어보려고 한다.
https://aws.amazon.com/ko/sdk-for-python/
여기로 들어가면 참조할 수 있는 api가 나온다.

s3에 관련된 것을 써야 하니까 ⤵️
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html

import boto3

s3 = boto3.resource('s3')

s3.create_bucket(Bucket="cchw6",CreateBucketConfiguration={'LocationConstraint':'ap-northeast-2'})

for bucket in s3.buckets.all():
    print(bucket.name)

✨ 삽질한 부분 ㅎ

다른 지역을 넣고 for 문을 돌려 bucket을 만드려고 했는데 계속
에러가 났다. 이유도 모른채 몇 번을 삽질하다가 결국 stackoverflow의 도움으로 해결할 수 있었다.

https://stackoverflow.com/questions/57146311/unable-to-create-s3-bucketin-specific-region-using-aws-python-boto3

This happens you configured a different region during aws configure in specifying a different region in s3 client object initiation.

configure에서 설정한 지역과 내가 만들고자 하는 리전이 같아야 만들어지는 것 같았다. 그래서 stackoverflow에서 하라는 대로 잘 따라했고, 다음과 같은 코드를 만들 수 있었다.

import logging
import boto3
from botocore.exceptions import ClientError


def create_bucket(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:
            s3_client = boto3.client('s3')
            s3_client.create_bucket(Bucket=bucket_name)
        else:
            s3_client = boto3.client('s3', region_name=region)
            location = {'LocationConstraint': region}
            s3_client.create_bucket(Bucket=bucket_name,
                                    CreateBucketConfiguration=location)
    except ClientError as e:
        logging.error(e)
        return False
    return True

regions = [
    "ap-northeast-1",
    "ap-northeast-2",
    "ap-south-1",
    "ap-southeast-2",
    "eu-central-1",
    "eu-west-1",
    "sa-east-1",
    "us-west-2",
]

for region in regions:
    response = create_bucket(bucket_name='khucchw6'+region,region=region)
    print(str(response))

성공적으로 bucket들을 만들 수 있었다.


각 bucket에 파일들 올려보기 - Upload

우선은 하나의 bucket에 하나의 파일을 올려보자

import boto3

s3 = boto3.client('s3')
bucket_name = 'khucchw6us-west-2'
// 나는 폴더에 들어가 있어서 경로도 써줬다.
file_name = '1kb/helloWorld copy.txt'
s3.upload_file(file_name,bucket_name,file_name)

해당 bucket을 찾아서 들어가보니 잘 올라가졌다.

이제 여러개를 한 번 올려보자.

import boto3,os,glob

s3 = boto3.client('s3')
s3_list = s3.list_buckets()

files = dict(up=[])

os.chdir("hw6/1Kb")
// glob.glob은 파일들의 리스트를 뽑을 때 쓰는 것
for file in glob.glob("*.pdf"):
    files["up"].append(file)
    
my_buckets=[]
for bucket in s3_list['Buckets']:
    my_buckets.append(bucket['Name'])

for buc in my_buckets:
    for key,val in files.items():
        for filenm in val:
            s3.upload_file(filenm,buc,filenm)

upload_file 은 boto3.client에 속한다.       

각 bucket으로부터 다운로드 받기 - Download

bucket으로부터 로컬로 파일들을 다운받는 것

import boto3,os

s3_client = boto3.client('s3')
s3_resource= boto3.resource('s3')
s3_list = s3_client.list_buckets()

my_buckets=[]
for bucket in s3_list['Buckets']:
    my_buckets.append(bucket['Name'])

for bucket in my_buckets:
    start = time.time()
    myBucket = s3_resource.Bucket(bucket)
    for obj in myBucket.objects.all():
        path,filename= os.path.split(obj.key)
        s3_client.download_file(myBucket.name,obj.key,filename)

각 bucket의 파일들 삭제하기 - Delete

import boto3,time

s3_client = boto3.client('s3')
s3_resource= boto3.resource('s3')
s3_list = s3_client.list_buckets()

my_buckets=[]
for bucket in s3_list['Buckets']:
    my_buckets.append(bucket['Name'])

for bucket in my_buckets:
    myBucket = s3_resource.Bucket(bucket)
    for obj in myBucket.objects.all():
        s3_client.delete_object(Bucket=myBucket.name,Key=obj.key)
            

s3.client()와 s3.resource()의 차이

이 모든 것을 하다가 제일 삽질을 오래한 부분이
client와 resource의 구분이였다.

검색하다가 본 것이 여기

client는

  • 실제의 aws API와 1:1로 매치가 된다.
  • 모든 aws 서비스는 clients에 의해 서포트 된다.
s3 = boto3.client("s3")
response = s3.list_buckets()

-> 내 생각에는 전체적인 서비스를 볼 수 있게 하는 것 같다.

Resource는

  • Identifier랑 attribute가 필요하다.
bucket = s3.Bucket(name="something")
obj = s3.Object(bucket_name="my_bucket",key="test.py")

-> resource가 들어가면 세부적인 정보를 다룰 수 있게 되는 것 같다.

0개의 댓글