ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬으로 AWS S3 버킷(Bucket) 만들기
    파이썬(Python) 강의 2019. 7. 29. 10:40


    이 포스트에서는 파이썬과 AWS 파이썬 라이브러리인 boto3를 이용해 AWS S3 버킷을 만들어 보도록 한다. 전체 코드는 aws_s3_create_bucket.py 에서 확인할 수 있다. 이 포스트의 독자는 파이썬을 어느정도 활용할 수 있으며 pip과 같은 툴을 이용해 라이브러리 설치를 자유롭게 할 수 있다고 가정한다. 

    AWS S3 버킷을 파이썬으로 만드는게 왜 중요한가? 그냥 AWS Console의 GUI를 이용하면 더 쉽지 않은가? 맞다. 만약 하나의 S3 버킷을 만든다고 하면 AWS 콘솔에서 하는것이 더 간단할 수 있다. 하지만 AWS Console을 이용하면 항상 개발자 또는 오퍼레이터가 콘솔에 접속해 클릭 클릭해야한다. 자바, 파이썬, 루비등의 언어와 boto3 라이브러리를 이용하면 이 과정을 자동화 할 수 있다. 실제로 많은 기업들이 클라우드 인프라(Cloud Infrastructure)를 코드로 자동화 해 관리한다.

    목차

    • AWS Simple Storage Service - AWS S3?
    • S3 권한을 가진 IAM 유저 만들기
    • boto3 설치
    • boto3를 이용해 AWS S3 버킷 만들기

    AWS Simple Storage Service - AWS S3?

    AWS S3에서 S3는 Simple Storage Service의 약자로 말 그대로 데이터을 저장할 수 있는 데이터 저장 서비스이다. 우리가 컴퓨터에 파일을 만들고 저장하듯 S3에 데이터를 저장할 수 있다. 그렇다면 컴퓨터에 저장하는 것과 S3에 저장하는것의 차이점은 무엇인가? AWS S3에 데이터를 저장 한다는 것은 내 컴퓨터가 아니라 AWS의 컴퓨터에 데이터를 저장한다는 뜻이다. 대신 AWS는 그 데이터에 접근할 수 있도록 인터페이스를 제공한다. 인터페이스는 AWS Console, AWS Cli, AWS 라이브러리 등이 있다. AWS S3에 데이터를 저장하면 인터넷이 되는 어느 곳에서나 내가 저장한 데이터에 접근할 수 있다. 네이버 클라우드, 구글드라이브, 또는 드랍박스와 비슷하다고 생각하면 된다. AWS S3가 구글드라이브, 드랍박스등과 다른 점은 AWS S3는 분산 시스템의 장점은 high availability(가용성), scalability(확장성), stability(안정성)을 제공한다. 따라서 기업에서 많이 사용한다.

    S3 권한을 가진 IAM 유저 만들기

    S3버킷을 만들기 전에 첫번째로 해야 할 일은 바로 S3 읽기, 쓰기 권한을 가진 유저를 만드는 것이다. 만약 AWS계정이 없다면 아마존 웹 서비스 가입 및 AWS Cli설정을 통해 AWS 계정을 먼저 만든다. 링크된 포스트에서 AdministratorAccess를 가진 유저를 생성했고 이를 사용하길 원한다면 그 계정을 사용한다. 그렇지 않고 S3만을 위한 유저를 따로 만들고 싶다면 아래의 과정을 진행한다.

    1. https://console.aws.amazon.com/iam/home?region=us-east-2#/users 에 접속해, '사용자 추가' 버튼을 누른다.



    2. 원하는 사용자 이름 넣고, 액세스 유형은 '프로그래밍 방식 엑세스'를 선택한다. 프로그래밍 방식 엑세스를 선택하는 이유는 이 유저를 파이썬 스크립트에서 사용하기 때문이다. 



    3. 다음으로 넘어가 권한 설정에서 AmazonS3FullAccess를 선택한다. 만약 S3와 다른 서비스도 이용할 예정이라면 다른 서비스 정책을 검색하여 같이 추가하면 된다.


    4. 태그를 추가하고 싶다면 추가한다. 여기선 큰 상관 없으므로 그냥 넘어가도록 하겠다.



    5. 마지막으로 세부사항을 검토한 후 사용자 만들기를 누른다.


    사용자 추가를 완료하면 아래처럼 액세스 키 ID와 비밀 액세스 키가 나온다. 이 두 키를 반드시 어딘가에 저장하도록 한다. 액세스 키는 아이디, 비밀 엑세스 키는 비밀번호같은 역할을 한다. 추후에 파이썬 스크립트에서 이 두 액세스 키를 이용해 AWS 리소스(S3)에 접근한다.


    두 액세스 키를 저장했다면 이제 파이썬 스크립트를 작성할 차례이다.

    boto3 설치

    이 포스트에서는 파이참과 python3를 이용한다. python3와 파이참이 없다면 1. 파이썬 설치 및 개발환경 설정을 참고한다. 파이참에서 파이썬 프로젝트를 생성한 후 아래처럼 venv에 boto3를 설치해 준다. 만약 파이참이나 파이썬 가상환경을 이용하지 않는다면 그냥 터미널에서 설치하면 된다.

    명령어:

    $pip install boto3



    boto3를 이용해 AWS S3 버킷 만들기

    boto3은 아마존 웹 서비스의 서비스들을 이용할 수 있도록 도와주는 라이브러리이다. S3뿐만 아니라 아마존 웹서비스에서 제공하는 다른 서비스들도 boto3를 통해 이용할 수 있다. 어떤 웹 서비스를 이용하기 위한 클라이언트 초기화는 아래처럼 할 수 있다.

    import boto3

    __aws_access_key_id__ = '<AWS_ACCESS_KEY_ID>' # 자신의 ACCESS_KEY로 대체
    __aws_secret_access_key__ = '<AWS_SECRET_ACCESS_KEY>' # 자신의 SECRET_ACCESS_KEY로 대체

    s3 = boto3.client(
    's3', # 사용할 서비스 이름, ec2이면 'ec2', s3이면 's3', dynamodb이면 'dynamodb'
    aws_access_key_id=__aws_access_key_id__, # 액세스 키
    aws_secret_access_key=__aws_secret_access_key__) # 비밀 엑세스 키

    이제 변수 s3를 이용해 s3서비스를 이용할 수 있다. boto3가 제공하는 클라이언트는 boto3 documentation 에서 확인 할 수 있다. 이렇게 하면 클라이언트 오브젝트를 초기화 한 것이다. 각 클라이언트는 서비스를 사용할 수 있도록 하는 api를 제공한다. boto3가 제공하는 S3 API는 boto3 S3 documentation에서 확인할 수 있다. 나도 AWS의 공식 문서를 참고하여 이 포스트를 작성하는 것이다. 이 문서 중 create_bucket 부분을 살펴보면 반드시 필요한 파라미터들을 확인할 수 있다.

    위 문서를 보면 String타입의 Bucket이 반드시 필요하면 특정 지역을 명시하기 위해 LocationConstraint를 파라미터로 넘겨줘야 함을 알 수 있다. 

    s3.create_bucket(
    Bucket='my-bucket-name-fsoftwareengineer', # 원하는 버켓 이름을 넣는다. 언더바(_) 또는 스페이스, 특수문자는 사용할 수 없다.
    CreateBucketConfiguration={
    'LocationConstraint': 'us-east-2' # us-east-1을 제외한 지역은 LocationConstraint 명시
    }
    )

    이렇게 하면 아주 간단히 s3 버킷을 만들 수 있다. 

    import boto3

    __aws_access_key_id__ = '<AWS_ACCESS_KEY_ID>'
    __aws_secret_access_key__ = '<AWS_SECRET_ACCESS_KEY>'

    s3 = boto3.client(
    's3', # 사용할 서비스 이름, ec2이면 'ec2', s3이면 's3', dynamodb이면 'dynamodb'
    aws_access_key_id=__aws_access_key_id__, # 액세스 키
    aws_secret_access_key=__aws_secret_access_key__) # 비밀 엑세스 키

    s3.create_bucket(
    Bucket='my-bucket-name-fsoftwareengineer',
    CreateBucketConfiguration={
    'LocationConstraint': 'us-east-2' # us-east-1을 제외한 지역은 LocationConstraint 명시해야
    }
    )

    하지만 이게 끝이 아니다. 실제로 프로덕션에서는 '버킷이 없으면 새로 만드는 로직'을 자주 사용한다. 이 로직은 파이썬 예외처리를 이용해 구현할 수 있다.

    try:
    response = s3.create_bucket(
    Bucket='my-bucket-name-fsoftwareengineer',

    CreateBucketConfiguration={
    'LocationConstraint': 'us-east-2' # us-east-1을 제외한 지역은 LocationConstraint 명시해야
    }
    )
    return response
    except ClientError as e:
    if e.response['Error']['Code'] == 'BucketAlreadyOwnedByYou':
    print("Bucket already exists. skipping..")
    else:
    print("Unknown error, exit..")

    이 모든 기술을 활용하면 다음과 같은 함수를 작성할 수 있다.


    실행 결과

    Creating a bucket... myfirstbucket-fsoftwareengineer
    Bucket : {'ResponseMetadata': {'RequestId': 'C99D27D167E2E6A5', 'HostId': ...', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': '...', 'x-amz-request-id': '...', 'date': 'Mon, 29 Jul 2019 01:19:29 GMT', 'location': 'http://myfirstbucket-fsoftwareengineer.s3.amazonaws.com/', 'content-length': '0', 'server': 'AmazonS3'}, 'RetryAttempts': 0}, 'Location': 'http://myfirstbucket-fsoftwareengineer.s3.amazonaws.com/'}

    이제 AWS S3 console https://s3.console.aws.amazon.com/s3/home?region=us-east-2 에서 생성된 버킷을 확인할 수 있다.


    댓글

f.software engineer @ All Right Reserved