Azure Storage (blob)を使う


.NET Coreで利用したかったのですが、2016年11月26日時点では依存ライブラリが微妙に対応してないとのことで、一旦、.NET Frameworkでのコードを書いておきます。実装は、

* Blobへのアップロード、ダウンロード（既存ファイル操作）
* Blobへの追記（新規作成＋追記）

の２つを試してみたいと思います。

とりあえずC#のコンソールアプリからblobで操作します。

##準備

VisualStudio 2015を利用する場合、NuGetで、WindowsAzure.Storageを追加する必要がります。

##Blobへのアップロード・ダウンロード

特に難しい点はありません。

```csharp
using System;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //storageAccountの作成（接続情報の定義）
            //アカウントネームやキー情報はAzureポータルから確認できる。
            var accountName = "teststorage";
            var accessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            var credential = new StorageCredentials(accountName, accessKey);
            var storageAccount = new CloudStorageAccount(credential, true);
            
            //こういう書き方もできるし、Configから読み込むこともできる。
            //CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=アカウントネーム;AccountKey=アクセスキー");
            
            ////////////////// ここまでは各Storageサービス共通 //////////////////////////////////

            //blob
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            //container
            CloudBlobContainer container = blobClient.GetContainerReference("images");
			
            //もし無かったら作る
            //container.CreateIfNotExists();

            //upload

            //アップロード後のファイル名を指定（無くてよい）
            CloudBlockBlob blockBlob_upload = container.GetBlockBlobReference("aaa.jpg");

            //アップロード処理
            //アップロードしたいローカルのファイルを指定
            using (var fileStream = System.IO.File.OpenRead(@"C:\Users\hoge\Desktop\bbb.jpg"))
            {
                blockBlob_upload.UploadFromStream(fileStream);
            }

            //download

            //ダウンロードするファイル名を指定
            CloudBlockBlob blockBlob_download = container.GetBlockBlobReference("ccc.jpg");

            //ダウンロード処理
            //ダウンロード後のパスとファイル名を指定。
            blockBlob_download.DownloadToFile(@"C:\Users\hoge\Desktop\ddd.jpg", System.IO.FileMode.CreateNew);

            //削除
            //blockBlob_download.Delete();

            Console.WriteLine("処理を完了しました。");

            Console.ReadLine();
        }
    }
}
```

blobを始めとする各種ストレージへのアクセス方法は[こちら](https://docs.microsoft.com/ja-jp/azure/storage/storage-dotnet-how-to-use-blobs)が参考になります。

##Blobへの追記

以前から「追記できたらログ管理とかで使えるのに」と思っていましたが2015年に追記に対応しました。
今更ながら試してみます。[ここ](https://blogs.technet.microsoft.com/thbrown/2015/08/26/azure-blob-now-has-append/)が参考になりました。
ログの恒久化が必要な実運用ではいろいろ使えそうです。

```csharp
using System;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

namespace AppendTest
{
    class Program
    {
        static void Main(string[] args)
        {

            //アカウントネームやキー情報はAzureポータルから確認できる。
            var accountName = "teststorage";
            var accessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            var credential = new StorageCredentials(accountName, accessKey);
            var storageAccount = new CloudStorageAccount(credential, true);
            
            //ここまではstorage共通

            //blob
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            //container
            CloudBlobContainer container = blobClient.GetContainerReference("logs");

            //無かったら作る
            container.CreateIfNotExistsAsync();
            
            //ここまではblob共通

            //appendblob
            //BlockBlobではなくAppenDBlobのリファレンスを取得する
            CloudAppendBlob appendBlob = container.GetAppendBlobReference("server01.log");

            //無かったら作る
            if(!appendBlob.Exists()) appendBlob.CreateOrReplace();

            //書き込み
            appendBlob.AppendText(DateTime.Now+" Log message.\n");

            //内容表示
            Console.WriteLine(appendBlob.DownloadText());

            //待つ
            Console.ReadLine();

        }
    }
}
```