Amazon GlacierをWindows .Net C#で使ってみる

AmazonからGlacier(氷河)がリリースされましたね。1ヶ月、1GBあたり1円! この低価格がすごいですね。ダウンロード可能になるまで3.5~4.5時間かかるというのがキモで、低価格を実現しているようですが…、あれですかね、ほとんどのHDDは電源オフになってて、リクエストされたデータのあるHDDからは、常時電源オンのHDDにデータをしばらく移すとかそんな仕組みですかね?(まあ、分かりませんが…) ともかく、このような低価格、大容量のオンラインドライブが欲しいと思ってました。デジカメ写真のバックアップ用として(笑)。今、デジカメの写真のバックアップは、自宅のファイルサーバーにとっているのですが、もし、自宅が火事とかになったら、貴重なこどもの写真とかが決して戻ることがない。なので、できればオンラインにバックアップしたかった。でも100GB近くあるのでSkyDriveとかDropboxは候補になりませんでした。

なので、早速Windowsで試してみました。Windowsだと、.NetのC#が使えます。現状は、自分でプログラムつくらないといけません(^_^;)。まあ、あれですね、いずれAmazon謹製のクライアントプログラムとか提供してくれるんでしょうか。まあ、時間があれば、.自分でつくってみたい気もします。

すいません、以下はメモ書きレベルで…。

まずは、このへんのドキュメントを読みます。

What Is Amazon Glacier
http://docs.amazonwebservices.com/amazonglacier/latest/dev/introduction.html

Amazon Glacier Developer Guide
http://awsdocs.s3.amazonaws.com/glacier/latest/glacier-dg.pdf

基本的には、Glacier Management ConsoleでVaultを作成して、そのVaultに対して、クライアントプログラムからファイルのアップロード、ダウンロードを行うということのようですね。

クライアントプログラムの作成には、AWS SDK for .NETをダウンロードしてインストールします。

http://aws.amazon.com/jp/sdkfornet/

それで、Visual Studioの新規プロジェクの作成で、AWS Enpty Projectを選択します。

サンプルコードは、AWSのサイトに載ってますが、こんな感じです。コンフィグファイルは、アップロード、ダウンロードプログラム共通です。

コンフィグファイル
App.config

<?xml version="1.0"?>
<configuration>
    <appSettings>
        <add key="AWSAccessKey" value="*** provide AccessKeyID ***"/> // アクセスキー ID
        <add key="AWSSecretKey" value="*** provide SecretKey ***"/>   // シークレットアクセスキー
    </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

アップロードプログラム
Program.cs

using System;
using Amazon.Glacier;
using Amazon.Glacier.Transfer;
using Amazon.Runtime;
namespace glacier.amazon.com.docsamples
{
  class ArchiveUploadHighLevel
  {
    static string vaultName = "*** provide vault name ***";                     // ボールト名
    static string archiveToUpload = ""*** provide name of file to upload***";   // ファイル名
    public static void Main(string[] args)
    {
       try
      {
          var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.APNortheast1); // 東京リージョン
          // Upload an archive.
          string archiveId = manager.Upload(vaultName, "fujisan", archiveToUpload).ArchiveId;
          Console.WriteLine("Archive ID: (Copy and save this ID for the next step) : {0}", archiveId);
          Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }
  }
}

ダウンロードプログラム
Program.cs

using System;
using Amazon.Glacier;
using Amazon.Glacier.Transfer;
using Amazon.Runtime;
namespace glacier.amazon.com.docsamples
{
  class ArchiveDownloadHighLevel
  {
    static string vaultName = "*** provide vault name ***";     // ボールト名
    static string archiveId = "*** provide archive ID ***";     // アーカイブID
    static string downloadFilePath = ""*** provide location to downloadarchive ***";    // ダウンロードパス
    public static void Main(string[] args)
    {
      try
      {
        var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.APNortheast1); //東京リージョン
        var options = new DownloadOptions();
        options.StreamTransferProgress += ArchiveDownloadHighLevel.progress;
        // Download an archive.
        manager.Download(vaultName, archiveId, downloadFilePath, options);
        Console.ReadKey();
      }
      catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
      catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
      catch (Exception e) { Console.WriteLine(e.Message); }
      Console.WriteLine("To continue, press Enter");
      Console.ReadKey();
    }
    static int currentPercentage = -1;
    static void progress(object sender, StreamTransferProgressArgs args)
    {
      if (args.PercentDone != currentPercentage)
      {
        currentPercentage = args.PercentDone;
        Console.WriteLine("Downloaded {0}%", args.PercentDone);
      }
    }
  }
}

環境にあわせて変更しなければいけないのは、コメントをつけた部分です。最初、東京リージョンの指定がわからなかった。東京リージョンは、APNortheast1になります。

上記のダウンロードプログラムは高レベルAPI使用ということで、ダウンロード要求と、実際のダウンロード命令が特に分かれてません。一命令になってます。つまり、このプログラムを実行すると、3.5~4.5時間、実行しっぱなしでしょう。たぶん、低レベルAPIを使えば、まずダウンロード要求を出して、その後、通知を受けてからダウンロード開始なんてのが、できるんだと思います。

アーカイブIDは、アップロードプログラムを実行すると得られます。そのアーカイブIDをダウンロードプログラムで指定しています。

さて、これで実際に動くのかな? アップロードプログラムは実行したら、アーカイブIDを得られましたが、ダウンロードプログラムは、実行してまだ3時間ぐらいしか経過してなくて、まだダウンロードは実行されてません。