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)

 

Joomla templates by a4joomla