Server Side/AWS

Boto3 - 기본 설정 및 사용법

navill 2020. 1. 13. 18:46

Boto3는 AWS에서 제공하는 SDK이다. python 애플리케이션과 AWS 서비스를 연결시키기 위해 사용된다. 본 포스트는 coding for entreprenures에서 제공하는 AWS-S3 강의에서 s3에 대한 boto3 부분만 정리한 내용이다. 학원에서 배울 때 그냥 boto3 패키지 설치하면 다 되는 줄 알았는데 강의를 보면서 Boto3가 무엇인지, 어떻게 사용하는지 조금은 이해할 수 있었다. boto3에서 정말 많은 양을 다루기 때문에 모든 항목에 대한 완전한 이해보다는 기본적인 부분들을 다뤄보면서 이런 게 있구나 하는 정도로만 정리해보았다.

 

IAM 정책(IAM - 공식문서)

IAM: AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스

IAM 정책은 AWS에서 제공하는 시각적 편집기를 이용하거나 사용자가 직접 JSON 형태로 구성하는 방법이 있다.

JSON 형태의 IAM정책 설정(testserver_s3_policy)

boto3.client(Low-level) - AWS

Client는 AWS에 접근하기 위해 낮은 레벨에서 제어할 수 있다. 기능은 Resource와 유사하지만 디테일한 설정을 위해서는 Client를 이용해야하는 것 같다. (참고- boto3.resource와 boto3.client의 차이 from PlanB)

 

아래는 S3에 설정된 Bucket에 접근하기 위한 기본적인 코드이다. 

client.list_buckets()

 

import boto3

AWS_ACCESS_KEY_ID ="[access_key]"
AWS_SECRET_ACCESS_KEY = "[secret_key]"
AWS_DEFAULT_REGION = "ap-northeast-2"
client = boto3.client('s3',
                      aws_access_key_id=AWS_ACCESS_KEY_ID,
                      aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                      region_name=AWS_DEFAULT_REGION
                      )
response = client.list_buckets() # bucket 목록
print(response)

[testserver_s3_policy - IAM 권한 부여 시]

[testserver_s3_policy - IAM 권한 제거 시]

 

boto3.Session - AWS

Session은 설정상태를 저장하고 client & resource 서비스를 생성하기 위한 권한을 부여하기 위해 사용된다.

session = boto3.Session(
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    region_name=AWS_DEFAULT_REGION
)
s3 = session.resource('s3')  # s3에 대한 권한 및 상태를 s3(변수)에 저장

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

# output
aws-jihoon-testserver
media.navill.online
static.navill.online

사용 가능한 resource(위 예제에서 'S3')는 아래와 같다.
   - cloudformation
   - cloudwatch
   - dynamodb
   - ec2
   - glacier
   - iam
   - opsworks
   - s3
   - sns
   - sqs

 

boto3.Bucket - AWS

Bucket은 S3에 저장된 특정 bucket에 접근하기 위해 사용된다.

AWS_BUCKET_NAME = "aws-jihoon-testserver"

buckets = s3.Bucket(name=AWS_BUCKET_NAME)
print(buckets)
# 출력: s3.Bucket(name='aws-jihoon-testserver')

for obj in buckets.objects.all():
    print(obj)
    print(obj.key)
    # error 발생: An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied    
        

현재 IAM에는 ListObjects(ListObjects의 권한 키워드는 'ListBucket')에 대한 접근 권한이 등록되어있지 않기 때문에 에러가 발생한다.  (AWS-버킷 작업에 대한 권한)

# 정책 수정
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::aws-jihoon-testserver"
            ]
        }
    ]
}

정책 적용 후 정상 출력된다(obj=파일 객체, obj.key=파일 이름).

 

 

boto3.Object - AWS

Object는 bucket에 저장된 객체(파일)에 접근하기 위해 사용된다.

AWS_BUCKET_NAME = "aws-jihoon-testserver"
object_key = "abc/img/스크린샷 2020-01-09 오후 9.05.02.png"

s3 = boto3.resource('s3')
object_ = s3.Object(AWS_BUCKET_NAME, object_key)

# output
s3.Object(bucket_name='aws-jihoon-testserver', key='abc/img/스크린샷 2020-01-09 오후 9.05.02.png')