본문 바로가기

학교공부/클라우드

python boto3 s3 upload & download (region별 시간 측정)

region별로 s3 생성 후 파일 업로드 밑 다운로드 해보면서 시간비교해보기

 

 일단 s3 접속을 위한 IAM을 만든다.

 

 

s3 접속해야되니까 권한 설정하기

 

 

csv 다운해서 잘 저장해둔다.

 

csv에 Access key ID, Secret access key를 복사해서 사용해야한다.

 

일단 나는 과제가 1kb 10kb 1mb 10mb 파일을 10개씩 업로드 및 다운로드 해보는 거였다. 

대충 txt로 용량만 맞춰서 만들었다.

 

그럼 이제 python boto3를 이용하여 업로드 및 다운로드를 해보자

 

구글 코랩에서 진행하였다.

 

파일 드래그하면 자동으로 옮겨진다. zip파일로만 옮겨야됨

 

!unzip -qq "test.zip" 이렇게 코랩에 치면 압축이 풀린다.

 

 

create bucket

import boto3
from botocore.exceptions import ClientError
import logging

ACCESS_KEY = blahblah
SECRET_KEY =  blahblah

def create_bucket(bucket_name, region=None):
    # Create bucket
    try:
        s3_client = boto3.client('s3', region_name=region,
                                  aws_access_key_id=ACCESS_KEY,         # 액세스 ID
        aws_secret_access_key=SECRET_KEY)
        location = {'LocationConstraint': region}

        s3_client.create_bucket(Bucket=bucket_name,
                                CreateBucketConfiguration=location)
        
    except ClientError as e:
        logging.error(e)
        return False
    return True


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

]


for region in regions:
  response = create_bucket(bucket_name="bkhhw2239"+region,region = region)
  if not response:
    sys.exit()
  print("Bucket : " + str(response))

리전이 상황에 따라서 되는곳도 안되는곳도있어서 해보면서 안되는건 뺐다. 

 

 

이렇게 생성된걸 볼 수 있다.

 

일일이 삭제하기 귀찮으니 리스트보기 및 삭제도 코드로 진행하자

모든 bucket 및 object 삭제하기

s3 = boto3.resource('s3',
    aws_access_key_id=ACCESS_KEY,         
  aws_secret_access_key=SECRET_KEY
)
s3_client = boto3.client(
  's3',  
  aws_access_key_id=ACCESS_KEY,         
  aws_secret_access_key=SECRET_KEY)

response = s3_client.list_buckets()

# 리스트 보기
print('Existing buckets:')
myregion = []
for bucket in response['Buckets']:
    myregion.append(bucket["Name"])

# 삭제
for i in myregion:

  bucket = s3.Bucket( i )
  # object 비우기
  bucket.objects.all().delete()
  #버킷삭제
  s3_client.delete_bucket(
      Bucket = i)

 

 

 

 

 

파일 이름 가져오기

import glob, os



files = dict(_1KB=[],_10KB=[],_1MB=[],_10MB=[])


os.chdir("/content/1KB")
for file in glob.glob("*.txt"):
    files["_1KB"].append(file)

os.chdir("/content/10KB")
for file in glob.glob("*.txt"):
    files["_10KB"].append(file)

os.chdir("/content/1MB")
for file in glob.glob("*.txt"):
    files["_1MB"].append(file)

os.chdir("/content/10MB")
for file in glob.glob("*.txt"):
    files["_10MB"].append(file)

 

아마 로컬에서도 비슷하게 하면 될것같다.

 

 

UPLOAD

import time
import sys
def upload_file(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 = file_name

    # Upload the file
    try:
        response = s3_client.upload_file(file_name, bucket, object_name)
    except ClientError as e:
        logging.error(e)
        return False
    return True

response = s3_client.list_buckets()

print('Existing buckets:')
myregion = []
for bucket in response['Buckets']:
    myregion.append(bucket["Name"])




for region in myregion:
  print(f"{region} 업로드 시작 ")
  for key,value in files.items():
    os.chdir('/content/'+key[1:])
    start = time.time()
    
    for filename in value:
      
      upload_file(filename,region)



    print(f"region : {region} | data : {key} 소요시간  :", time.time() - start)  


bucket list에 차례대로 파일을 넣고 시간을 잰다. 

 

리전별로 시간이 다른걸 확인할 수 있다.

신기한건 꼭 가깝다고 소요시간이 적은건 아니다.

 

Download

s3 = boto3.resource('s3',
    aws_access_key_id=ACCESS_KEY,         
  aws_secret_access_key=SECRET_KEY
)

for bucket in myregion:
# select bucket
  my_bucket = s3.Bucket(bucket)
  start = time.time()

  for s3_object in my_bucket.objects.all():
    # Need to split s3_object.key into path and file name, else it will give error file not found.
    path, filename = os.path.split(s3_object.key)
    my_bucket.download_file(s3_object.key, filename)
  print(f"region : {bucket} |  소요시간  :", time.time() - start)  

다운로드 시간 마찬가지로 이것도 리전마다 다름 ㅇㅇ 

 

 

 

 

 

 

다 끝났으면 아까 위에 코드를 활용해서 버켓을 삭제하고 aws의 iam도 삭제하자

끝~

'학교공부 > 클라우드' 카테고리의 다른 글

serverless  (0) 2021.06.04
CloudNoSQL  (0) 2021.05.27
7장 CloudStorage  (0) 2021.05.22
AWS VPC, instance, 보안그룹, ec2, putty 실습  (0) 2021.05.18
7장(EBS)  (0) 2021.05.16