「PythonでConoHaのオブジェクトストレージ操作を行う方法」の続きです。
Pythonを用いた、以下の操作をご紹介します。
- コンテナの作成/削除
- オブジェクトのアップロード/ダウンロード
- オブジェクトのコピー/削除
条件
- ConoHaオブジェクトストレージ
- Windows 10 64bit
- Python 3.7.0
サンプルソース全体
Pythonのサンプルソースを以下に示します。
次のような処理を関数として作成しています。
- コンテナの作成/削除
- オブジェクトのアップロード/ダウンロード
- オブジェクトのコピー/削除
from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler
logger = getLogger("オブジェクトストレージ操作")
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'
DWONLOAD_PATH = 'C:\\test\\downlaod.jpg'
'Accept': 'application/json',
data = '{"auth":{"passwordCredentials":{"username":"%s","password":"%s"},"tenantId":"%s"}}' % (USER_NAME, PASSWORD, TENANT_ID)
response = requests.post(URL, headers=headers, data=data)
return json.dumps(data["access"]["token"]["id"], indent=4)
def createContainer(token):
'Accept': 'application/json',
response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers)
def deleteContainer(token):
'Accept': 'application/json',
response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers)
'Accept': 'application/json',
with open(UPLOAD_FILE, 'rb') as image:
response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers, data=image)
def downloadObject(token):
'Accept': 'application/json',
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は任意で指定可能
'Accept': 'application/json',
'Destination': CONTAINER1 + '/' + UPLOAD_FILE,
response = requests.request(method='COPY', url=OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)
'Accept': 'application/json',
response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)
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__':
# 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()
# 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):
'Accept': 'application/json',
response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers)
def createContainer(token):
"""
コンテナの作成
"""
headers = {
'Accept': 'application/json',
'X-Auth-Token': token,
}
response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers)
return response
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>python objectCRUD.py
2019-09-03 10:29:22,019 - オブジェクトストレージ操作 - DEBUG - コンテナの作成:<Response [201]>
C:\test>
C:\test>python objectCRUD.py
2019-09-03 10:29:22,019 - オブジェクトストレージ操作 - DEBUG - コンテナの作成:<Response [201]>
C:\test>
「sample2」というコンテナが作成されました。

コンテナの削除
ソース抜粋
以下の関数を実行します。
「sample2」というコンテナを削除します。
def deleteContainer(token):
'Accept': 'application/json',
response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2, headers=headers)
def deleteContainer(token):
"""
コンテナの削除
"""
headers = {
'Accept': 'application/json',
'X-Auth-Token': token,
}
response = requests.delete(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
実行結果
実行前
「sample2」というコンテナが存在します。

実行後
C:\test>python objectCRUD.py
2019-09-03 10:33:15,518 - オブジェクトストレージ操作 - DEBUG - コンテナの削除:<Response [204]>
C:\test>python objectCRUD.py
2019-09-03 10:33:15,518 - オブジェクトストレージ操作 - DEBUG - コンテナの削除:<Response [204]>
C:\test>
C:\test>python objectCRUD.py
2019-09-03 10:33:15,518 - オブジェクトストレージ操作 - DEBUG - コンテナの削除:<Response [204]>
C:\test>
「sample2」というコンテナが削除されました。

オブジェクトのアップロード
ソース抜粋
以下の関数を実行します。
コンテナ「sample2」に「2.jpg」というオブジェクトをアップロードします。
'Accept': 'application/json',
with open(UPLOAD_FILE, 'rb') as image:
response = requests.put(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers, data=image)
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 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>python objectCRUD.py
2019-09-03 10:41:26,255 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]>
C:\test>
C:\test>python objectCRUD.py
2019-09-03 10:41:26,255 - オブジェクトストレージ操作 - DEBUG - オブジェクトのアップロード:<Response [201]>
C:\test>
「2.jpg」というオブジェクトがアップロードされました。

オブジェクトのダウンロード
ソース抜粋
以下の関数を実行します。
- コンテナ「sample2」の「2.jpg」というオブジェクトをダウンロードします。
- 今回はダウンロードオブジェクトを以下のパスで保存しています。
C:\test\downlaod.jpg
def downloadObject(token):
'Accept': 'application/json',
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は任意で指定可能
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 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>python objectCRUD.py
2019-09-03 10:48:49,391 - オブジェクトストレージ操作 - DEBUG - オブジェクトのダウンロード:<Response [200]>
C:\test>
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」としてコピーします。
'Accept': 'application/json',
'Destination': CONTAINER1 + '/' + UPLOAD_FILE,
response = requests.request(method='COPY', url=OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)
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 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>python objectCRUD.py
2019-09-03 10:56:59,353 - オブジェクトストレージ操作 - DEBUG - オブジェクトのコピー:<Response [201]>
C:\test>
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」というオブジェクトを削除します。
'Accept': 'application/json',
response = requests.delete(OBJECT_STORAGE + '/' + CONTAINER2 + '/' + UPLOAD_FILE, headers=headers)
def deleteObject(token):
"""
オブジェクトの削除
"""
headers = {
'Accept': 'application/json',
'X-Auth-Token': token,
}
response = requests.delete(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
実行結果
実行前

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


“PythonでConoHaのオブジェクトストレージ操作を行う方法2” に対して2件のコメントがあります。