サイトアイコン 知的好奇心

PythonでConoHaのオブジェクトストレージ操作を行う方法2

「PythonでConoHaのオブジェクトストレージ操作を行う方法」の続きです。

Pythonを用いた、以下の操作をご紹介します。

条件

サンプルソース全体

Pythonのサンプルソースを以下に示します。

次のような処理を関数として作成しています。

# objectCRUD.py

import requests
import json
from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler
from os import path

## ログ出力設定
logger = getLogger("オブジェクトストレージ操作")
logger.setLevel(DEBUG)

# コンソール出力設定
stream_handler = StreamHandler()
formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)

# 接続パラメータ
USER_NAME = "gncu00000000"
PASSWORD = "passpasspass"
TENANT_ID = "9999999999999999999999999"
URL = 'https://identity.tyo2.conoha.io/v2.0/tokens'
OBJECT_STORAGE = 'https://object-storage.tyo2.conoha.io/v1/nc_9999999999999999999999999999'

# オブジェクトストレージ情報
CONTAINER1 = 'sample1'
CONTAINER2 = 'sample2'
OBJECT = '1.jpg'
UPLOAD_FILE = '2.jpg'
DWONLOAD_PATH = 'C:\\test\\downlaod.jpg'

def getToken():
    """
    tokenの取得
    """
    
    headers = {
        'Accept': 'application/json',
    }

    data = '{"auth":{"passwordCredentials":{"username":"%s","password":"%s"},"tenantId":"%s"}}' % (USER_NAME, PASSWORD, TENANT_ID)
    #logger.debug(data)

    response = requests.post(URL, headers=headers, data=data)
    data = response.json()

    return json.dumps(data["access"]["token"]["id"], indent=4)


def createContainer(token):
    """
    コンテナの作成
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }
    response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers)

    return response


def deleteContainer(token):
    """
    コンテナの削除
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }
    response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers)

    return response


def uploadObject(token):
    """
    オブジェクトのアップロード
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }

    with open(UPLOAD_FILE, 'rb') as image:
        response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers, data=image)

    return response


def downloadObject(token):
    """
    オブジェクトのダウンロード
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }

    response = requests.get(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)
    
    if response.status_code == 200:
        with open(DWONLOAD_PATH, 'wb') as f:
            for chunk in response.iter_content(1024):  # chunk sizeは任意で指定可能
                f.write(chunk)

    return response


def copyObject(token):
    """
    オブジェクトのコピー
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
        'Destination': CONTAINER1 + '/' + UPLOAD_FILE,
    }

    response = requests.request(method='COPY', url=OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)

    return response


def deleteObject(token):
    """
    オブジェクトの削除
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }

    response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)

    return response


def main():
    """
    実処理(main)
    """
    
    token = getToken().replace('\"', '')  # tokenの取得

    result = createContainer(token)  # コンテナの作成
    logger.debug('コンテナの作成:' + str(result))
    
    result = deleteContainer(token)  # コンテナの削除
    logger.debug('コンテナの削除:' + str(result))
    
    result = uploadObject(token)  # オブジェクトのアップロード
    logger.debug('オブジェクトのアップロード:' + str(result))

    result = downloadObject(token)  # オブジェクトのダウンロード
    logger.debug('オブジェクトのダウンロード:' + str(result))

    result = copyObject(token)  # オブジェクトのコピー
    logger.debug('オブジェクトのコピー:' + str(result))

    result = deleteObject(token)  # オブジェクトの削除
    logger.debug('オブジェクトの削除:' + str(result))


if __name__ == '__main__':
    """
    main関数を実行
    """
    
    main()

コンテナの作成

ソース抜粋

以下の関数を実行します。
作成するコンテナ名は任意です。(ここでは「sample2」としています。)

def createContainer(token):
    """
    コンテナの作成
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }
    response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers)

    return response

実行結果

実行前

以下のようなコンテナが存在するものとします。
(オブジェクトストレージの確認には、Cyberduckを使用しています。)

実行後

C:\test>python objectCRUD.py
2019-09-03 10:29:22,019 - オブジェクトストレージ操作 - DEBUG - コンテナの作成:<Response [201]>

C:\test>

「sample2」というコンテナが作成されました。

コンテナの削除

ソース抜粋

以下の関数を実行します。
「sample2」というコンテナを削除します。

def deleteContainer(token):
    """
    コンテナの削除
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }
    response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers)

    return response

実行結果

実行前

「sample2」というコンテナが存在します。

実行後

C:\test>python objectCRUD.py
2019-09-03 10:33:15,518 - オブジェクトストレージ操作 - DEBUG - コンテナの削除:<Response [204]>

C:\test>

「sample2」というコンテナが削除されました。

オブジェクトのアップロード

ソース抜粋

以下の関数を実行します。
コンテナ「sample2」に「2.jpg」というオブジェクトをアップロードします。

def uploadObject(token):
    """
    オブジェクトのアップロード
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }

    with open(UPLOAD_FILE, 'rb') as image:
        response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers, data=image)

    return response

実行結果

実行前

「sample2」という空のコンテナが存在します。

実行後

C:\test>python objectCRUD.py
2019-09-03 10:41:26,255 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]>

C:\test>

「2.jpg」というオブジェクトがアップロードされました。

オブジェクトのダウンロード

ソース抜粋

以下の関数を実行します。

def downloadObject(token):
    """
    オブジェクトのダウンロード
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }

    response = requests.get(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)
    
    if response.status_code == 200:
        with open(DWONLOAD_PATH, 'wb') as f:
            for chunk in response.iter_content(1024):  # chunk sizeは任意で指定可能
                f.write(chunk)

    return response

実行結果

実行前

実行後

C:\test>python objectCRUD.py
2019-09-03 10:48:49,391 - オブジェクトストレージ操作 - DEBUG - オブジェクトのダウンロード:<Response [200]>

C:\test>

「downlaod.jpg」というオブジェクトがダウンロードされました。

オブジェクトのコピー

ソース抜粋

以下の関数を実行します。
コンテナ「sample2」の「2.jpg」というオブジェクトを、コンテナ「sample1」の「2.jpg」としてコピーします。

def copyObject(token):
    """
    オブジェクトのコピー
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
        'Destination': CONTAINER1 + '/' + UPLOAD_FILE,
    }

    response = requests.request(method='COPY', url=OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)

    return response

実行結果

実行前

実行後

C:\test>python objectCRUD.py
2019-09-03 10:56:59,353 - オブジェクトストレージ操作 - DEBUG - オブジェクトのコピー:<Response [201]>

C:\test>

コンテナ「sample1」の「2.jpg」というオブジェクトが作成(コンテナ「sample2」の「2.jpg」からコピー)されていることがわかります。

オブジェクトの削除

ソース抜粋

以下の関数を実行します。
コンテナ「sample2」の「2.jpg」というオブジェクトを削除します。

def deleteObject(token):
    """
    オブジェクトの削除
    """
    
    headers = {
        'Accept': 'application/json',
        'X-Auth-Token': token,
    }

    response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)

    return response

実行結果

実行前

実行後

C:\test>python objectCRUD.py
2019-09-03 11:01:16,888 - オブジェクトストレージ操作 - DEBUG - オブジェクトの削除:<Response [204]>

C:\test>

コンテナ「sample2」の「2.jpg」というオブジェクトが削除されました。

参考

stackoverflow:transpose curl PUT to requests.put

https://stackoverflow.com/questions/17256463/transpose-curl-put-to-requests-put

stackoverflow:How to download image using requests

https://stackoverflow.com/questions/13137817/how-to-download-image-using-requests

python-requests.org

https://2.python-requests.org//en/v0.5.0/api/#functions

ConoHa API Documantation

https://www.conoha.jp/docs/



モバイルバージョンを終了