AWSでいうとこのS3ですが、OCIでは、オブジェクトストレージっていうんです。
やってることは同じなんですが、値段と種類が違うんですよ。
このオブジェクトストレージは、1Gバイト単位で値段が違っていて、アーカイブというやつが一番安いんです。
じゃー、とりあえずアーカイブで保存すりゃ良いじゃんと思うんですが、デメリットがあるんですね。
そりゃーそうですよ。
アーカイブは、1ファイル単位で設定出来るんですが、一度アーカイブすると、リストアするまで使えなくなります。
しかも、このリストア処理は、最短1時間から、23時間程度はかかるので、すぐに利用しないといけない場合、使えません。
なので、基本バックアップ用だと思って下さい。
リストアを行う時に、ダウンロード時間を指定するのですが、何のことかわかりにくいです。
ここでいうダウンロード時間とは、リストアが完了してから、再びアーカイブされるまでの時間のことのようです。
ダウンロードというか、自由に読み出せる時間を指定するといった意味になります。
使い方は、OCIのWEB画面から、アップロード、ダウンロードが一番簡単な使い方です。
その他は、OCI CLIといったコマンドや、各言語用のAPIを使ったり、直接REST APIを使ったり出来ます。
最もユーザーよりの使い方は、StorageGatewayを使った、NFSマウントも使えます。
基本的に、S3互換なので、S3FS等を利用することも可能です。
S3FSを使ってマウントし、Sambaで共有してみましたが、普通に使えました。
但し、ブロックストレージとオブジェクトストレージ(標準)の1GB単価が同じなので、ブロックストレージをSamba共有した方が良いかと思います。
そんなオブジェクトストレージですが、アーカイブ、リストアするのが、Webだと めちゃくちゃ面倒です。
なので、一括でアーカイブ、リストアを行うPython3を作成しました。
環境)
python3とOCI CLIをセットアップしておいて下さい。
pip3 install oci-cli
使い方)
バケット名のdir1/ 以降をアーカイブする
./ociosarchive.py 'namespace' 'バケット名' --startmatch 'dir1/'
バケット名のdir1/ 以降をダウンロード時間 24時間でリストアする
./ociosarchive.py 'namespace' 'バケット名' --startmatch 'dir1/' --restore 24
ociosarchive.py
#!/usr/bin/python3
import sys
import oci
import argparse
namespace='hogehogename'
bucket='test1'
startmatchstr=None
dryrun=False
limitcount=1000
restore=None
#デバッグ用
DEBUG=False
parser = argparse.ArgumentParser(description="using \n [namespace] [bucketname] \nex)\n ociosarchive.py 'hogehogename' 'test1'")
parser.add_argument('namespace',help='Bucket namespace')
parser.add_argument('bucketname',help='Bucket Name')
parser.add_argument('--restore',type=int , help='Restore hours')
parser.add_argument('--startmatch',help='Name start match')
parser.add_argument('--dryrun', action='store_true', help='Dryrun')
parser.add_argument('--limit', type=int ,help='Count limit', default=1000)
if DEBUG==False:
args = parser.parse_args()
namespace = args.namespace
bucket = args.bucketname
restore = args.restore
startmatchstr = args.startmatch
dryrun = args.dryrun
limitcount = args.limit
config = oci.config.from_file("~/.oci/config","DEFAULT")
objstragecl:oci.object_storage.ObjectStorageClient = oci.object_storage.ObjectStorageClient(config)
#ロード
def load(callback) :
try:
start_after=None
while True:
#オブジェクト一覧
if start_after is None :
res:oci.response.Response = objstragecl.list_objects(namespace,bucket_name=bucket,start=startmatchstr,limit=limitcount, fields="name,storageTier,archivalState")
else :
res:oci.response.Response = objstragecl.list_objects(namespace,bucket_name=bucket,start=start_after,limit=limitcount, fields="name,storageTier,archivalState")
listobjs:oci.object_storage.models.ListObjects = res.data
for obj in listobjs.objects:
summary:oci.object_storage.models.ObjectSummary = obj
#条件ヒット
if( startmatchstr is not None ):
idx = summary.name.startswith(startmatchstr)
if idx == False :
continue
callback(summary)
start_after = listobjs.next_start_with
if start_after is None:
break
except Exception as e :
print('Exception {0} '.format(e))
#OnTarget
def OnTarget(summary:oci.object_storage.models.ObjectSummary) :
if( restore is not None):
if( summary.storage_tier==oci.object_storage.models.ObjectSummary.STORAGE_TIER_ARCHIVE and summary.archival_state == oci.object_storage.models.ObjectSummary.ARCHIVAL_STATE_ARCHIVED ):
if ( dryrun==False):
#リストア
res:oci.response.Response = objstragecl.restore_objects(namespace,bucket_name=bucket,restore_objects_details=oci.object_storage.models.RestoreObjectsDetails(
object_name=summary.name,
hours=restore
))
print("{0}\t[{1},{2}]->Restore".format(summary.name,summary.storage_tier,summary.archival_state))
else:
if( summary.storage_tier==oci.object_storage.models.ObjectSummary.STORAGE_TIER_STANDARD ):
if ( dryrun==False):
#アーカイブ
res:oci.response.Response = objstragecl.update_object_storage_tier(namespace,bucket_name=bucket,update_object_storage_tier_details=oci.object_storage.models.UpdateObjectStorageTierDetails(
object_name=summary.name,
storage_tier=oci.object_storage.models.UpdateObjectStorageTierDetails.STORAGE_TIER_ARCHIVE
))
print("{0}\t[{1},{2}]->Archive".format(summary.name,summary.storage_tier,summary.archival_state))
load(OnTarget)