[AWS] S3 - Using S3 With Boto3
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>',
)
Leave a comment