(1) AWS IAM 만들기
(2) Boto3 다운받고 IAM과 연결하기
(3) bucket을 region 별로 만들어보기
(4) Upload
(5) Download
(6) Delete
(1) 검색창에 IAM 검색하고 해당 페이지로 들어간다
(2) Add users 버튼을 눌러서 계정을 만든다.
(3) 3번 페이지는 그냥 패스
(4) 4번 페이지에서도 그냥 create user
(5) 마지막 페이지에서 나오는 csv를 꼭 다운받아두자.
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이 있다면 이름이 나와야하고, 없다면 종료된다. 별 다른 에러가 뜨지 않는다면 잘 만들어진 것이라고 보면 되겠다.
교수님께서 한 번 해보라고 하셔서 몇 개 만들어보려고 한다.
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의 도움으로 해결할 수 있었다.
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에 하나의 파일을 올려보자
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으로부터 로컬로 파일들을 다운받는 것
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)
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)
이 모든 것을 하다가 제일 삽질을 오래한 부분이
client와 resource의 구분이였다.
검색하다가 본 것이 여기
client는
s3 = boto3.client("s3")
response = s3.list_buckets()
-> 내 생각에는 전체적인 서비스를 볼 수 있게 하는 것 같다.
Resource는
bucket = s3.Bucket(name="something")
obj = s3.Object(bucket_name="my_bucket",key="test.py")
-> resource가 들어가면 세부적인 정보를 다룰 수 있게 되는 것 같다.