本文へジャンプします。

ストレージサービス間でデータの移行を行う方法

こんにちは、富士通クラウドテクノロジーズ 小林です。

ニフティクラウドには
ニフティクラウドストレージ (旧)
ニフティクラウド オブジェクトストレージ

という2種類のストレージサービスが存在します。
それぞれS3ベースの互換APIであることは変わりませんが、オブジェクトストレージはアップロードの転送量がリージョンに関わらず完全に無料であったり、昨今のデータ増加傾向に合わせたコストメリットが大きい料金設計のサービスになっております。
※ちなみに、両方のサービスともリクエスト量による課金は一切ございません。料金についての詳細はこちらを御覧ください。

この2種類のストレージサービスですが、オブジェクトをそれぞれのサービス間で移行するには少々工夫が必要ですので今回はいくつかやり方をご紹介したいと思います。

方法1. s3fs及びaws cli(syncコマンド)を利用する方法

まず1つ目の方法ですが、s3fsとAWS コマンドラインインターフェイス (以降 AWS CLI) というAWS用のツールを利用します。データの流れは下記のようになります。

クラウドストレージ(旧)→ s3fs → AWS CLI(syncコマンド) → オブジェクトストレージ

導入準備

  • AWS CLIのインストールはこちらをご参照ください。
  • fuseのインストール
# yum groupinstall "Development Tools" 
# wget https://github.com/libfuse/libfuse/releases/download/fuse-2.9.7/fuse-2.9.7.tar.gz
# tar xvfz fuse-2.9.7.tar.gz 
# cd fuse-2.9.7
# ./configure --prefix=/usr
# make
# make install
  • s3fsのインストール
# wget https://github.com/s3fs-fuse/s3fs-fuse/archive/v1.80.tar.gz
# tar xvfz v1.80.tar.gz
# cd s3fs-fuse-1.80
# ./autogen.sh
# ./configure --prefix=/usr
# make
# make install
# echo "APIアクセスキー:シークレットキー" > ~/.passwd-s3fs 

実行例

クラウドストレージ(旧)の バケットsrcbucket からオブジェクトストレージの バケットdstBucket に転送する場合

  • s3fsマウント
# mkdir /src_dir
# s3fs -f srcbucket  /src_dir -o sigv2 -o url=https://ncss.nifty.com
  • aws cliでsync実行
# aws s3 sync --endpoint-url https://jp-east-2.os.cloud.nifty.com . s3://dstBucket

方法2. aws-sdkを利用したプログラムで移行

方法1で説明したようなツールを使った方式では、実行に関しての細かな制御ができないため、小さな容量のバケットであれば十分ですが、大規模になるに従って確認方法などに不安が残ります。下記の例はS3互換APIであることを利用して、rubyのaws-sdkを使用したプログラムによる移行を行うことものですが、当然途中でログなどを自由に出力できますので、確認もしやすくなります。

require 'aws-sdk'
require 'nokogiri'
require 'yaml'

# migrate_storate_tool.rb
class MigrateStorageTool

    def initialize
        src_storage = AWS::S3.new(
          :access_key_id = ENV['ACCESS_KEY'] ,
          :secret_access_key = ENV['SECRET_KEY'],
          :s3_endpoint = ENV['SRC_ENDPOINT']
        )

        dst_storage = AWS::S3.new(
          :access_key_id = ENV['ACCESS_KEY'] ,
          :secret_access_key = ENV['SECRET_KEY'],
          :s3_endpoint = ENV['DST_ENDPOINT']
        )

        @src_bucket = src_storage.buckets[ENV['SRC_BUCKET_NAME']]
        @dst_bucket = dst_storage.buckets[ENV['DST_BUCKET_NAME']]
    end

    def migrage
        @src_bucket.objects.each do |src_obj|
           put_dst_storage src_obj
        end
    end

private

    def put_dst_storage(src_obj)
       puts "key: #{src_obj.key} "
       data = src_obj.read
       dst_obj = @dst_bucket.objects[src_obj.key]
       dst_obj.write(data, :multipart_threshold => 100 * 1024 * 1024)
       dst_obj.acl = set_src_acl(src_obj)
    end

    def authenticated_users_acl?(acl)
      acl.xpath('//xmlns:URI').to_s.include? "AuthenticatedUsers"
    end

    def public_read_acl?(acl)
      acl.xpath('//xmlns:URI').to_s.include? "AllUsers"
    end

    def private_acl?(acl)
      !public_read_acl?(acl) && !authenticated_users_acl?(acl)
    end

    def set_src_acl(obj)
        src_acl ||= Nokogiri::XML(obj.acl.to_s)
        return :public_read if public_read_acl?(src_acl)
        return :authenticated_read if authenticated_users_acl?(src_acl)
        return :private if private_acl?(src_acl)
        src_acl = nil
        :private
    end
end

ms = MigrateStorageTool.new
ms.migrage

実行方法

  • rubyが実行できる環境に上記コードを配置します。
  • 環境変数で、下記の値を設定しておきます。
    ※アクセスキー・シークレットキーはニフティクラウド・コントロールパネルのアカウント管理ページより取得できます。
export ACCESS_KEY=[アクセスキー]                    #ニフティクラウドAPIのアクセスキー
export SECRET_KEY=[シークレットキー]                #ニフティクラウドのシークレットキー
export SRC_ENDPOINT=ncss.nifty.com                #移行元のストレージエンドポイント(今回はクラウドストレージ(旧))
export DST_ENDPOINT=jp-east-2.os.cloud.nifty.com  #移行先のストレージエンドポイント(今回はオブジェクトストレージ)
export SRC_BUCKET_NAME=bucketname                 #移行元のバケット名
export DST_BUCKET_NAME=bucketname                 #移行先のバケット名
  • その後rubyスクリプトを実行すると、オブジェクトのコピーを行います。
# ruby migrate_storage_tool.rb 

上記プログラムでは、比較的小規模のバケットを想定してるので、エラーハンドリングなど細かい制御など行っておりませんが、データ量などに応じて、通信エラー等発生時のリトライ・一時停止・再開といった処理などを追記すると使い勝手もより向上すると思います。

また今回はaws-sdkのv1を使用したシンプルなサンプルになっていますが、可能であればv2を利用したほうがよりきめ細かいAPI操作を実装できるので移行の際に独自の要件などがある場合はv2を使用した方が良いかもしれません。

ニフティクラウド 導入相談窓口
ニフティクラウド 無料セミナー

閉じる

閉じる

クラウドブログ編集部

クラウドブログ編集部

ニフティクラウド ユーザーブログ編集部のアカウントです。 編集部からのお知らせや、レギュラーライター以外のゲストによる寄稿記事を掲載していきます。

浜中 慶

浜中 慶

1980年、神奈川県生まれ。2003年ニフティ入社。 ポータルサイト開発を中心に、音楽配信サービス、CGMサービスなど様々なプロジェクトに企画/デザイン/システム担当として参加。現在は@niftyのポータルサービス向けコンテンツ管理システムの企画/開発/運用を担当。

吉田 雄哉

吉田 雄哉

株式会社co-meetingの創業メンバー。「取締役&External- facing Technologist」と名乗り新しいIT技術を広く伝える活動とWebアプリケーション開発を行う毎日。パッケージベンダーでのSaaS立上げ・製造業の情報システム部門で企画やPM・受託開発と従事してきたため、ベンダーサイドとユーザサイド の両方の視点を持ち合わせる。

石田 健亮

石田 健亮

株式会社ドリーム・アーツで小売事業者向けSaaS「Shopらん」を企画、開発。メインの仕事はプログラマーだがサーバー管理や営業もこなすユーティリティプレイヤー。最近好きな事はパフォーマンスチューニング。特に並列化プログラミングがマイブーム。キライなことはデータセンターでの作業。騒音と乾燥が弱点。ニフティクラウドでデータセンターに行く必要が無くなったことが本当の利点だ と思っている。

五月女 雄一

五月女 雄一

ニフティでは「インフラを守る簡単な様で奥が深いお仕事」をしています。 夢はインフラの気持ちが読めるエンジニアになること。

わたなべ かずひろ

わたなべ かずひろ

専門学校卒業後、ソフトウェア開発会社で電力系統制御システムの開発に従事。その後、CD-ROM等マルチメディア系PCソフトの開発を経て、1998年フリーランスに。 2000年8月に株式会社イーツーの設立に参画。携帯を含む様々なWeb系のシステム開発に携わる。現在はiPhone/Androidアプリなどの開発も手がけている。

市角

市角

ニフティクラウドのコントロールパネル設計・開発をメインに、たまにインフラの運用やお手伝いもやっていたりします。コントロールパネルや新機能の活用方法、アイデアなどを中心に書いていく予定です。

仲山 昌宏

仲山 昌宏

歌って踊れるインフラエンジニア兼、PHPもRubyもJavaも書くPerl使い。 物理サーバの運用に飽きて、フルラックに格安サーバ詰めて自宅プライベートクラウドを構築中。 今年は個人的には分散処理を攻めていきます。

猪飼 賢広

猪飼 賢広

1984年、愛知県名古屋市生まれ。大学は福島県にある某大学。2008年ニフティに入社。 開発系部署に配属後、主に各種テーマサイト開発のシステム面調整、開発進行管理役などとして参加。 現在もPC・ガラケーサイトの開発まわりを担当。インフラまわりを触る案件にも携わっており、日々修行中。 好きな芸人はなかやまきんに君とレイザーラモンRG。

久江 裕之

久江 裕之

ニフティクラウドのインフラ運用、OS提供の仕事をしています。 新しいOSやイメージが出る時にこのブログでご紹介いたします。入社5年目。一流のインフラエンジニアを目指して日々勉強中。

竹内 豪

竹内 豪

ニフティクラウド エンジニア

山口

山口

ニフティクラウドの基盤設計、新サービス/アライアンス/インフラ企画、その他雑用全般を担当しています。 クラウドに欲しい機能や、こんなふうに使ってほしいという想いが共有できれば良いですね。

芳中 隆幸

芳中 隆幸

ニフティクラウドの開発、運用を担当しています。

酒井 浩平

酒井 浩平

ニフティクラウドの中にいます。 ネットワークまわりの運用・開発や自動化などに取り組んでいます。 すべてのエンジニアを幸せにすることを目指しています。

higebu

higebu

ニフティクラウド IaaSのエンジニアです。 ネットワーク、DRサービス with VMware vCloud® Air™ Technology辺りの担当をしています。

武田

武田

ニフティクラウドの開発・運用を担当しています。 各種機能の内容についてなどで執筆させていただく予定です。

福澤真

福澤真

ニフティクラウドのコンパネ開発、運用をしています。

森藤 大地

森藤 大地

データに関する仕事が好きです。

宮原徹

宮原徹

日本仮想化技術株式会社 代表取締役社長兼CEO。仮想化技術に関するコンサルタントとして長年活動しており、特にベンチマークテストによる性能評価を得意としている。

荒谷翔

荒谷翔

株式会社はてなでMackerelのセールスデベロッパーとして勤務しています

東條 望

東條 望

2014年にニフティへ中途入社。 入社後から現在まで、ニフティクラウドのサービス企画・開発を担当しています。 各サービスの紹介を執筆させていただく予定です。

世良迪夫

世良迪夫

ニフティクラウドのRDBなどを担当しています