[AWS] S3 - Using S3 With Boto3

2 minute read

AWS-S3 python-version-3.6.6

Amazon S3

Amazon Simple Storage Service


Boto3

Python용 AWS SDK

SDK : Software Development Kit


Install

$ pip install boto3


IAM

Identity and Access Management

Boto3 의 경우는 AWS Management Console 에서 작업하는 것이 아니기 때문에 사용자임을 인증하기 위한 증명과정이 필요하다.
IAM 에서는 이러한 자격증명을 위한 계정을 관리할 수 있다.


Create Account

서비스의 IAM 으로 웹페이지를 이동시킨다.
IAM 으로 이동하게되면 사용자 를 클릭하여 사용자 목록페이지로 이동한다.
그리고 사용자 추가 를 클릭


1단계

  • 사용자 이름 : 본인이 희망하는 값으로 설정

  • AWS 액세스 유형 선택 : 프로그래밍 방식 액세스 체크
    중복 체크 가능하므로, 필요하다면 둘다 체크한다.
    (AWS Management Console 액세스에 체크할 경우 추가설정필드가 나타난다.)


2단계

  • 권한 설정 : 기존 정책 직접 연결 선택 → S3 검색 → AmazonS3FullAccess 체크
    • 여러가지 권한을 줄 수 있지만, 최소한의 권한만 설정한다.


  • 권한 경계 설정 : Default 로 Pass


3단계

태그 추가(선택 사항) → Pass


4단계

검토단계이다. 설정값이 맞는지 다시한번 확인한다.


5단계

사용자가 생성되었음을 알려주는 페이지가 나타난다.
여기서 중요한 것은 아래의 두가지 항목이다.

  • 액세스 키 ID

  • 비밀 액세스 키

    • 이 값은 해당 페이지를 넘어가면 다시 확인불가능하다. 따로 저장하여 관리하도록 하자.


이렇게 5가지 단계를 거쳐서 IAM 의 사용자를 추가하였다.



credentials & config File

홈 디렉토리에 .aws 디렉토리를 생성하고 그 안에 credentials, config 파일을 생성한다.
~/.aws 안에 생성한 파일들은 Boto3 에서 자동으로 읽어오게 된다.


  • ~/.aws/credentials (확장자명이 없음에 유의)
[default]
aws_access_key_id = <YOUR_ACCESS_KEY>
aws_secret_access_key = <YOUR_SECRET_KEY>

<YOUR_ACCESS_KEY> : IAM 사용자 추가 5단계에서의 액세스 키 ID
<YOUR_SECRET_KEY> : IAM 사용자 추가 5단계에서의 비밀 액세스 키


  • ~/.aws/config (확장자명이 없음에 유의)
[default]
region = <YOUR_REGION>

<YOUR_REGION> : ap-northeast-2 == 아시아 태평양(서울)



Create Bucket

import boto3

client = boto3.client('s3')

response = client.create_bucket(
    Bucket='<BucketName>',
    CreateBucketConfiguration={
        'LocationConstraint': '<YourRegion>',
    },
)
  • Bucket : 필수항목이다. 다른 Bucket 이름과 중복되지 않는 고유한 이름이어야한다.

  • 'LocationConstraint' : 필수항목은 아니지만, 구체적으로 명시하지 않으면 US Standard 에 Bucket 이 생성되므로 작성하도록 하자.



Delete Bucket

import boto3

response = client.delete_bucket(
    Bucket='<BucketName>'
)
  • Bucket 이 비어있지 않을 경우 에러가 발생한다.



Upload File To Bucket

import boto3

s3 = boto3.resource('s3')
s3.meta.client.upload_file('<FileUpload>', '<BucketName>', '<KeyName>')
  • '<UploadFile>' : 업로드할 파일의 경로

  • '<BucketName>' : 업로드할 Bucket 의 이름

  • '<KeyName>' : Key 이름 (업로드할 파일의 고유이름)

upload_file 메서드로 파일을 올리게 되면 해당 Bucket 에 파일이 업로드된 것을 확인할 수 있다.
하지만 해당 파일의 링크를 클릭하면 AccessDenied 가 뜨는 것을 알 수 있다.
기본값으로 올리게 될 경우 Everyone 에게 읽기권한이 없기 때문이다. (해당 파일 권한탭의 퍼블릭 액세스를 보면 알 수 있다.)
이러한 문제는 아래와 같이 ExtraArgs(dict) 를 키워드 인수로 전달하는 것으로 해결할 수 있다.

import boto3

s3 = boto3.resource('s3')
s3.meta.client.upload_file('<FileUpload>', '<BucketName>', '<KeyName>', ExtraArgs={'ACL':'public-read'})



Delete Object From Bucket

import boto3

response = client.delete_object(
    Bucket='<BucketName>',
    Key='<KeyName>',
)



Reference

Leave a comment