2016.01.12

オブジェクトストレージを活用してみよう(s3cmd編)

160725_obujectst_mv

技術営業でお客さまの悩みをよく聞く立場である、私は日々お客さまの悩みを解決できる方法に貪欲です。その実現方法はさまざま。これを概念実証(PoC:Proof of Concept)って言います。

さて、今回はオブジェクトストレージを使います。
GMOクラウドアカデミーでも紹介記事の多いオブジェクトストレージの利用方法を軸に比較してみましょう。GMOクラウドアカデミーやテクニカルガイドでも取り上げられるものの、まだまだ普及していない感が否めません。物理HDDと異なり、使用量・期間・転送量が影響するため、企業用途では価格メリットは感じても、実際に利用してみないと月額や年額コストは見えにくいため採用される企業さまはまだ少ないです。ただオブジェクトストレージの料金は容量だけではない点は注意が必要です。

オブジェクトストレージ料金(¥) = 「容量」x「利用期間」+「通信料金」

オブジェクトストレージを利用するには一手間掛けてやる必要があり、プログラムを作成しその中でライブラリを経由して使ったり、オブジェクトストレージを扱えるパッケージソフトを利用することになります。そのため日々サーバーを運用するエンジニアであれば大丈夫でも、webデザイナーや兼任情シスさんなどサーバーとあまり縁が無い立場の方は、ちょっと縁遠く感じてしまうかも知れません。そんなあなたの力になれば。

いくつか黒画面を使いますが、失敗したら仮想サーバーを作り直せば大丈夫!

今回は「s3cmd」というもともとはam○zon s3というオブジェクトストレージの先駆け向けに開発されたパッケージですが、s3互換のオブジェクトストレージであれば使用可能です。ALTUSのオブジェクトストレージもs3互換のAPIを搭載しているので、おおかた利用可能です。

【使うもの】
・CentOS7仮想サーバー(6では無理でした)
(今回はALTUS。スナップショットをコマめにとれば再作成が早いですよ!)
→スナップショットから仮想サーバーを作成はコチラ
GMOクラウドサポートサイト - ALTUS Basicシリーズ ディスクスナップショットの作成
・s3cmd (CentOSの拡張版(EPEL)にある最新版) 2015年12月現在 version1.6.0
※追記:2016年6月に1.6.1がリリースされました

進め方としては、こんな感じです。

Ⅰ.CentOS7を作成し、準備する

仮想サーバーのスペックは用途に応じてですが、s3cmdのテストであればミニサーバーでも可。今回検証時には、他の用途もあって「2 vCPU / 4 GB Memory」作ってみました。
ISOイメージからの仮想マシン作成はすいません、割愛しちゃいます。

あとオブジェクトストレージは、利用時は[Access Key]と[Secret Key]と呼ばれる利用ユーザーしか知らない情報と、エンドポイントと呼ばれるURLを知っておく必要があります。これはどのベンダーのオブジェクトストレージでも存在しますが、呼び名がちょっと違う場合もあるのでご注意ください。

ALTUSの場合は、ALTUSポータルの「コンソール」タブから確認できます。
[Access Key] = [アクセスキー]
[Secret Key] = [シークレットキー](クリックして表示)
[エンドポイント](https://st.gmocloud.com/)は機能を使うためのAPI用URLのことです。オンプレミスな環境や弊社別サービス(専用サーバー、Private cloudなど)からはインターネットを経由する必要があるため、普通はこっちを使います。

[iDC内エンドポイント](https://inter-st.gmocloud.com/)も条件によっては利用可能です。通信料がかからない反面、ALTUS内からしか利用できない、性能控えめなど、上記エンドポイントに条件が付いてます。今回のようなPoC利用やアーキテクチャを知り尽くした人には向いてます。
160725_altus-console_scr01


Ⅱ.パッケージを最新に更新

すいません。ここから早速、黒画面です。
作成したサーバーにコンソールやターミナルソフトで接続し、管理者権限(root権限)付きユーザーでログインをして、まずは最新のパッケージに更新をしておきます。

◆最新へ更新

# yum -y update

もし、[y/N]のような画面で止まってもy(Yes)を入力して進みましょう。
ALTUS であれば、最新に更新が終わったタイミングでルートディスクのスナップショットを作成しておくと、あとで失敗してもゲームのセーブポイントのように戻れるので楽なのでおススメです。


Ⅲ.EPELをインストール

次はEPEL(エンタープライズ Linux 用の拡張パッケージ)をインストールします。EPELは実際に何かをするパッケージと言うよりかは、さまざまな拡張用パッケージをインストールできるようにするパッケージです(ややこしくて、すいません)。

◆EPELのインストール

# yum -y install epel-release

◆最新へ更新(EPELも含めて最新へ)

# yum -y update

Ⅳ.s3cmdをインストール

EPELを使えるようにしたので、EPELの中から拡張パッケージがインストールできるようになっているはずです。

◆s3cmdをインストール

# yum -y install s3cmd

もしここでインストール時にエラー(s3cmd が見付からないなど)の場合は、EPELのインストールが正しくできているか確認してみてください。


Ⅴ.s3cmdを使ってみませう

無事にs3cmdがインストールできたならば、初期設定を行います。利用ユーザーごとに行う必要があります。例はrootユーザーですが、その他コマンドを利用するユーザーは設定する必要があります。随所にA○azon S3と出ますが、細かいことは気にしません。

◆設定開始
# s3cmd --configure
◆アクセスキーを入力
Access Key []:
◆シークレットキーを入力
Secret Key []:
◆A○azon 用設定(不要のためデフォルト設定のままエンターキーで継続)
Default Region [US]:
Encryption password:
Path to GPG program [/bin/gpg]:
Use HTTPS protocol [Yes]:
HTTP Proxy server name:
◆アクセスのテストするかを聞かれますが、[n]を選択
Test access with supplied credentials? [Y/n]
◆保存するかを聞かれますので、[y]を選択
Save settings? [y/N]

これでユーザーのホームディレクトリに.s3cfgという設定ファイルが作成されます。
ただこれではまだ弊社オブジェクトストレージには使えないため、設定ファイルを編集します。

◆設定ファイルの編集

# vi ~/.s3cfg

下記の項目をviエディタなどで書き換えます。
ファイルは隠しファイルのため、名前の先頭に.(ドット)があるので気をつけてください。普通にlsコマンドなどで探すと見付からず、ls -a などのオプションが必要です。またlinuxの黒画面でエディタを使いたくない人は、sftpなどでwindowsPCまで.s3cfgファイルを持っていき、メモ帳で編集してください。

[変更前]
host_base = s3.amazonaws.com
host_bucket = %(bucket)s.s3.amazonaws.com
signature_v2 = False
[変更後]
host_base = st.gmocloud.com
host_bucket = %(bucket)s.st.gmocloud.com
signature_v2 = True

◆s3cmdのテスト
初期設定ができたかテストしてみましょう

# s3cmd ls

下記のようなエラーが表示されず、コマンドが終了すれば大丈夫です。
まだバケットも作成していなければ、このコマンド結果は何も出なくてOKです。

「エラー1」

ERROR: /home/nkt/.s3cfg: None
ERROR: Configuration file not available.
ERROR: Consider using --configure parameter to create one.
・s3cmd の初期化/設定ファイルが保存できていない
・アクセスキーが入っていない

「エラー2」

ERROR: S3 error: 403 (InvalidAccessKeyId): The AWS Access Key Id you provided does not exist in our records.
・host_baseかhost_bucketがAm○zon S3用のURLが残っているかも。

「エラー3」

ERROR: S3 error: 403 (AccessDenied): Access Denied
・シークレットキーが間違ってる

◆s3cmdを使って、バケット(データの入れ物)を作成する
さあ、いよいよ利用開始です。ここから課金が発生しますよー

# s3cmd mb s3://apple
Bucket 's3://apple/' created

と表示されると[apple]バケットの作成完了です。

◆作成できたか表示してみる

# s3cmd ls
2016-06-28 15:28 s3://apple

このように、作成日付とバケット名が見えると作成できてます。
ちなみにバケットを作成すると¥1です。

◆その他操作

・英語ですが、マニュアル
# man s3cmd
・バケット作成

# s3cmd mb s3://バケット名
・バケット削除(バケット内が空でなければ削除されない)
# s3cmd rb s3://バケット名
・オブジェクト保存(ファイルの保存)
# s3cmd put ファイル名(local) s3://バケット名/ファイル名
・オブジェクト取り出し(ファイル取り出し)
# s3cmd get s3://バケット名/ファイル名 ファイル名(local)
・ディレクトリ作成(空ディレクトリが作成できないため、ファイルと一緒に作成)
# s3cmd put -r ディレクトリ名/適当なファイル s3://バケット名/
・容量計算
# s3cmd du
・コマンド設定
# s3cmd --configure
・helpコマンド
# s3cmd -h

Ⅵ.使って気付いたこと

s3cmdを使ってまずは、データを保存したり取り出したりできるようになりました。
使う際に、どうも気になったことを記載します。

・空ディレクトリが作成できない
⇒以外と普段から空のディレクトリを作成している自分に気付きました。コツは何でもいいのでファイルと一緒にputすると大丈夫

・ローカルよりは流石に遅い
当たり前なんですが、通信越しにファイルを保存することを意識する。コピー1つが遅いのと、通信が切れると保存が失敗する。
※ftpやscpと同じ考えですね。

・大きなファイルが早い?
気のせいかと思い、中の人間に聞きました。(職業柄役得)
これは弊社オブジェクトストレージ仕様で、大容量ファイルやアーカイブ用途のためにチューニングされてるためでした。「s3cmd」だから、「オブジェクトストレージ」だから、というのはなさそうです。他社さんのオブジェクトストレージはどうなんでしょうか...

・正直、コマンドだらけで使いづらい
私は大丈夫ですが、方々から聞きました。きっと便利なはずだが、このままだと運用できない。
コスト面を考えても、普及の足かせにも見えました。
これは次項で何とかしましょう!


Ⅶ.さらに活用!

弊社のオブジェクトストレージが大容量・アーカイブ向けと分かったので、それに併せて利用方法を考えてみたいと思います。
普通に考えて、アーカイブ向けなので1日1回、や週1回にログやデータベースのダンプを保存するのが良さそうですね。ftpやscpでアーカイブするにせよ、通信は切れることを想定して行います。
ただ、どうやっていいかどうかは。。。難しいのでまずは本家本元を見てみましょう。

◆yum コマンドでパッケージ元を探す

# yum info s3cmd

この結果として表示されたURLを見てみましょう。
s3cmdの中には、sync機能を解説してくれています。
S3cmd S3 Sync How-To(外部サイト)

これはいわゆるLinux系の非同期でのデータをやりとりしたり、アーカイブとして使われるrsync/lsyncといった機能と似ているようです。これを使ってみましょう。
動機させるテスト環境としては、よくありがちな1日1回のバックアップを取得してみましょう。

バックアップするのは、細切れなデータと大きな塊データの2種類。

save/target1 というディレクトリの下に1個100KB程度のdata1.csv,data2.csv … data10.csv
save/target2 というディレクトリの下に1個400MB程度のdump.img

これをmondayというバケット直下に保存していきます。
無駄な転送もしたくないため、条件付きの転送(Conditional transfer)をやってみたいと思います。

◆バックアップ

# s3cmd sync -r --skip-existing --limit-rate=1m ./save/ s3://monday
◆オプション説明
--skip-existing 新しいものだけ転送する
--limit-rate= 秒間で転送するバイト数を指定(kでKB、mでMB)
--stop-on-error  コピーのエラーで停止する

これでできました。
ただし、s3cmdが名前が異なっても同じデータを見分けるため

remote copy: 'target1/data1.csv' -> 'target1/data2.csv'
remote copy: 'target1/data1.csv' -> 'target1/data3.csv'

のように、同一ファイルのコピー元は1カ所となる仕様のようです。
テスト環境のファイル作成をサボったのがs3cmdにばれてビックリしました。

あとはこれをlinuxのcronに登録しておけば、1日1回のバックアップが可能です。
使ってみた感想としては、小さなファイルを転送するのに掛かる時間より、サイズの大きいファイルを転送する時が体感的に早く感じました。(条件によっても変わるのでご注意ください)

通信経由でのバックアップのため、通信切れやタイムアウトによる運用はもう少し考えていく必要はありますが、それでもコストメリットを考えてもオブジェクトストレージを検討してみるのはいいかも。

bna_storage

この記事を書いた人

ユーキ

前職がシステムエンジニア、前々職が組込プログラマ。 インフラもそうだけど、技術はアーリーアダプター。 気が付くと新しい技術で何かできないか?ばっかり考えてます。 オフはFMラジオとバイクをこよなく愛する寂しがり屋。

GMOクラウドアカデミーYouTubeチャンネルはこちらから

アカデミー用バナー

メルマガ会員募集中!

アカデミーの最新情報や会員限定のお得な情報をお届けします。

メルマガ登録はこちら