3266291 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

傀儡師の館.Python

傀儡師の館.Python

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

Recent Posts

Calendar

Keyword Search

▼キーワード検索

Category

Archives

2023.11
2023.10
2023.09
2023.08
2023.07

Freepage List

Profile

kugutsushi

kugutsushi

Free Space

設定されていません。
2007.09.09
XML
カテゴリ:Solaris10
Solaris の ZFS には スナップショット といってファイルシステムの変更部分だけを保存する方法がある。これを使えば差分バックアップを効率的にとることができる。しかし、バックアップは物理的に別なメディア(ハードディスクやテープ、DVD 等) に保存しておかなければ、いざハードディスクがクラッシュしたときには手の打ちようがない。さてどこに保存するか。

バックアップの保存先として、Amazon Simple Storage Service (Amazon S3) を使えば、ハードディスクを新たに購入する必要もないし、テープドライブなどのハードウェアも購入する必要がないし、メンテナンスも必要ない。お手軽で比較的低コストなバックアップメディアとしての Amazon S3 という存在。米Amazon、容量無制限・高速スケーラブルなストレージのWebサービス

ZFS のスナップショットを取って、これを Amazon S3 に保存するための手順が、Storage Utilities in Practice: ZFS Snapshot to Amazon S3 にまとめられている。スナップショットを取るところまでは通常の zfs コマンドを使っての操作。その後実際に Amazon S3 にファイルを送信するのは、Amazon S3 Library for REST in Java を使っている。

実際にコストはどの程度かかるのか。この事例だと 1TB のバックアップを毎月保存(1TB, 2TB, 3TB と毎月、保存量が増えて1年後に12TB を使用)したとき、この1年間コストは、$11,700、送信時の帯域使用量が年間 $1,380。これには、毎月 1TB ずつの送信と、バックアップからの復旧等のために 500GB のデータを取り出すのを年に2回分の料金が含まれる。そうすると、年間で $13,080 という事例が載っている。

ということは、例の 1/10 の使用量 100GB のデータをバックアップするケースであれば、年間 1308ドル。1ドル115円として計算すると 150,420 円ということになる。年間、ほぼ 15万円程度で合計 1.2 TB のバックアップメディアを確保できることになる。もちょっと小さくして、毎月 10GB の転送なら約 1万5千円、1GB なら 1500円。月に直せば、100GB 単位で 12,535 円、10GB単位で 1,254円、1GB単位で 126円程度か。10GB 単位で毎月バックアップをとる約 1,254円 というのは、そこそこよいかもしれない。途中で古い世代のものを消しながら使えば、もっと安くなるだろうし。

ちなみに、料金はストレージの月の使用料が 1GB 単位で 0.15 ドル だから 100GB で 15ドル。これに転送料が最初の 1TB は 1GB 単位で 0.18 ドルだから 100GB で 18ドル。使っただけ課金される。

毎月 10GB のデータを転送し、古い世代のものは 3世代だけ残して削除するとしたら、10GB, 20GB, 30GB, 30GB,.... とストレージ料金がかかるので、1.5ドル、3ドル、4.5ドル..... で延々使い続けると 1ヶ月あたり 4.5ドルとして、月に 516円程度。転送料金は 10GB ずつなので 1.8ドルで 207円。転送で PUT や一覧をチェックするために LIST 等のリクエストを送ると 1000リクエストあたり 0.01ドルだが、これは無視しておき、516 + 207 = 723円。月に 1000円以下で 10GB の 3世代を保存しておけるバックアップ先ができる。

バックアップだけのためにハードディスクを買うとして、バックアップメディア自体の障害を考えて RAIDZ で構成したとしても、750GB x 3 が 25000円 x 3 = 75000円程度としたら高いといえば高いか。でも、Amazon S3 なら、いっときにすべてを払う必要がないことや、電気代や設定やメンテナンス等の手間賃、ハードディスクの騒音、あるいは、火災や地震が起きてもデータは大丈夫とか考えると、リーズナブルかもしれない。データが増えたら増えたで、容量制限はないからハードディスクの拡張とかも気にする必要がない。毎月約 1000円程度かけて、重要なものだけ 10GB のバックアップを取って Amazon S3 に保存するというのもリーズナブルかもしれない。

今のところ実はバックアップ先は困っていないが、地震、火事等の消失に備えて月 1000円というのはありかなとか思いながら、微妙だなぁ。最重要データだけ 1GB に絞り込んで、上記の計算の 1/10 とすれば 100円以下になるから、重要データの災害対策のバックアップ先として考えるとよいか。

とりあえず、ものは試しなのでアカウントを作ってみる。

Amazon S3使ってみた には S3Fox Organizer for Amazon というのが紹介されていて、FireFox からファイルを操作できるようだ。Amazon Simple Storage Service(A3)をバックアップストレージとして利用する をみたら、いろいろなアプリケーションもあるようなのでそういうものを使ってもいいのかもしれない。が、とりあえず、API を使ったプログラミングをするなら、Amazon S3 Library for REST in Java 以外に Perl なら Amazon S3 Authentication Tool for Curl があり、Python もいくつかある。

Amazon S3 Library for REST in Python もあるが、直感的に boto - AWS for Python が楽に使えそうだと思ったので試してみる。download したら、"python setup.py install" でインストールできる。シェルに bash 等を使っているのであれば、

export AWS_ACCESS_KEY_ID=アクセスキーを入れる
export AWS_SECRET_ACCESS_KEY=秘密鍵を入れる

とすると、ファイルの編集をしなくても環境変数からアクセスキー等を取り出してくれるしくみになっている。とりあえず、そうしておいて、「python test.py -t s3」でテストしてみる。

$ python test.py -t s3
--- running S3Connection tests ---
--- tests completed ---
.
----------------------------------------------------------------------
Ran 1 test in 8.458s

OK

OK が出ているのでうまく動いているようだ。サンプル等を参考に適当なものを書いてみると、なんとか使えそうな感じ。ファイルのアップロードとダウンロード、メタデータの設定などできた。メタデータは UTF-8 を使ったら日本語も大丈夫だった。とりあえず、ここまで。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
from boto.s3.connection import S3Connection
from boto.s3.key import Key

# Amazon S3 に接続する
conn = S3Connection('自分のキーを入れる', '秘密鍵を入れる')


# バケットを3つ作る。名前はユニークなものでないとならない。
# 誰かが作った名前と同じではダメ
bucket_name = 'kugutsushi-%d' % int(time.time())
bucket = conn.create_bucket(bucket_name)
bucket_name = 'kugutsushi-%d' % int(time.time())
bucket = conn.create_bucket(bucket_name)
bucket_name = 'kugutsushi-%d' % int(time.time())
bucket = conn.create_bucket(bucket_name)

# bucket をすべて表示する
rs = conn.get_all_buckets()
print "---- buckets: %d ----" % (len(rs))
if rs > 0:
for b in rs:
print b.name

# 最後に作成されたバケットを取り出す
bucket = conn.get_bucket(bucket_name)

# アクセスコントロールを private にする。
#
bucket.set_acl('private')

# 作成したバケットの中に myfile というキーを作る
k = Key(bucket)
k.key = 'myfile'

# ファイル(test.tar.gz) をアップロード
# 別の名前でダウンロード (test2.tar.gz) してあとで確認

k.set_contents_from_filename('test.tar.gz')
print "---- test.tar.gz uploaded ----"
k.get_contents_to_filename('test2.tar.gz')
print "---- test2.tar.gz downloaded ----"

# メタデータを設定する
k.set_metadata('meta1', 'This is the first metadata value')
k.set_metadata('meta2', u'日本語は大丈夫かな')

# メタデータの確認
print "----- meta data ------\n"
print k.get_metadata('meta1')
print k.get_metadata('meta2')

if bucket.lookup('myfile') != None:
print "myfile は存在します"

# すべての bucket の名前と ACL を表示する
print "---- bucket & acl ---"
rs = conn.get_all_buckets()
print len(rs)

for b in rs:
print b.name
acp = b.get_acl()
for grant in acp.acl.grants:
print grant.permission

# キーをすべて削除する
all = bucket.get_all_keys()
print "----- keys ----"
for k in all:
print k.key
bucket.delete_key(k)

# バケットを削除する
conn.delete_bucket(bucket)






お気に入りの記事を「いいね!」で応援しよう

Last updated  2007.09.10 00:55:02
コメント(1) | コメントを書く
[Solaris10] カテゴリの最新記事



© Rakuten Group, Inc.