Python SDK for Swift API

OpenStack에서 제공하는 Python SDK를 이용하여 네이버 클라우드 플랫폼 Archive Storage를 사용하는 방법을 설명합니다.

이 문서는 python-swiftclient 3.6.0, python-keystoneclient 3.17.0 버전을 기준으로 작성되었습니다.

설치

pip install python-swiftclient==3.6.0
pip install python-keystoneclient==3.17.0

python-swiftclient

python-keystoneclient

예제

예제에서 사용하는 username, password는 포탈 마이페이지 > 계정 관리 > 인증키 관리에서 생성한 API 인증키를 사용합니다. (Access Key ID는 username, Secret Key는 password) project_id와 domain_id 정보는 Archive Storage 콘솔에서 이용 신청 후 [API 이용 정보 확인] 버튼을 통해 확인할 수 있습니다.

인증

인증정보를 포함하고 있는 keystoneauth Session 오브젝트를 이용하여 swiftclient Connection 객체를 생성합니다. swiftclient Connection 객체는 재시도 기능과 토큰관리 기능을 제공하여 오퍼레이션을 손쉽게 사용할 수 있습니다. 한번 발급된 토큰을 재사용하여 불필요한 인증 요청을 하지 않을 수 있고, 토큰이 유효하지 않거나 만료된 경우 토큰 재발급 요청을 통해 갱신합니다. 기본 재시도 설정은 5회입니다.

import swiftclient
from keystoneauth1 import session
from keystoneauth1.identity import v3

endpoint = 'https://kr.archive.ncloudstorage.com:5000/v3'
username = 'ACCESS_KEY_ID'
password = 'SECRET_KEY'
domain_id = 'DOMAIN_ID'
project_id = 'PROJECT_ID'

auth = v3.Password(auth_url=endpoint, username=username, password=password, project_id=project_id, user_domain_id=domain_id)
auth_session = session.Session(auth=auth)

swift_connection = swiftclient.Connection(retries=5, session=auth_session)

모든 오퍼레이션 예제는 위에서 생성한 swiftclient Connection을 이용합니다.

컨테이너(버킷) 목록 조회

account = swift_connection.get_account()
for container in account[1]:
    pprint.pprint(container)

컨테이너(버킷) 생성

container_name = 'sample-container'

swift_connection.put_container(container_name)

컨테이너(버킷) 삭제

container_name = 'sample-container'

swift_connection.delete_container(container_name)

오브젝트 업로드

container_name = 'sample-container'
object_name = 'sample-object'

content_type = 'text/plain'

local_file_name = '/tmp/test.txt'

with open(local_file_name) as local_file:
    swift_connection.put_object(container_name, object_name,
                                contents=local_file.read(),
                                content_type=content_type)

디렉토리 오브젝트 생성

container_name = 'sample-container'
object_name = 'sample-directory'

content_type = 'application/directory'

swift_connection.put_object(container_name, object_name,
                            contents='',  # empty content
                            content_type=content_type)

오브젝트 목록 조회

container_name = 'sample-container'

container = swift_connection.get_container(container_name)
for obj in container[1]:
    pprint.pprint(obj)

오브젝트 다운로드

container_name = 'sample-container'
object_name = 'sample-object'

local_file_name = '/tmp/test'

obj = swift_connection.get_object(container_name, object_name)
with open(local_file_name, 'wb+') as local_file:
    local_file.write(obj[1])

오브젝트 삭제

container_name = 'sample-container'
object_name = 'sample-object'

swift_connection.delete_object(container_name, object_name)

대용량 파일 업로드(SLO)

container_name = 'sample-container'
object_name = 'sample-big-file.mp4'
content_type = 'video/mp4'

segment_container_name = 'segment-container'
segment_object_prefix = 'segments-for-sample-big-file.mp4/segment-'

local_file_path = '/tmp/sample.mp4'
segment_size = 10 * 1024 * 1024  # 10MB
manifest = []

with open(local_file_path, 'rb') as local_file:
    segment_number = 1
    while True:
        data = local_file.read(segment_size)
        if not len(data):
            break

        segment_object_name = '%s%d' % (segment_object_prefix, segment_number)
        etag = swift_connection.put_object(segment_container_name, segment_object_name, contents=data)
        manifest.append({
            "path": '%s/%s' % (segment_container_name, segment_object_name),
            "etag": etag
        })
        segment_number += 1

body = json.dumps(manifest)

swift_connection.put_object(container_name, object_name,
                            contents=body,
                            content_type=content_type,
                            query_string='multipart-manifest=put')

대용량 파일 Segments 조회(SLO)

container_name = 'sample-container'
object_name = 'sample-big-file.mp4'

obj = swift_connection.get_object(container_name, object_name, query_string='multipart-manifest=get')
pprint.pprint(json.loads(obj[1]))

대용량 파일 삭제(SLO)

container_name = 'sample-container'
object_name = 'sample-big-file.mp4'

swift_connection.delete_object(container_name, object_name, query_string='multipart-manifest=delete')

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...