コンテンツへスキップ
Node.jsでMicrosoft Azure Blobストレージを管理する方法

Node.jsでMicrosoft Azure Blobストレージを管理する方法

Node Storage と Blob Storage から始める方法を学び、最も頻繁に見られるケースについて説明します。

7min read

Node.jsは、開発のための最も人気のある成長プラットフォームの1つです。Node.jsで使用される言語はJavaScriptです -彼は#GitHubで最も使用されている言語であり、この傾向は増加の一途をたどっています(Forbes、2014年7月14日)。

Microsoft Azure Blob ストレージ

Microsoft Azureストレージサービスを使用すると、Windowsクラウド環境との間でNON RELATIONAL データを保存/取得できます。Microsoft Azure Storage では、データを 4 つの異なる形式 (v.i.z. Blob、Tables and Queues、File Storage (プレビュー段階) ) で保存できます。

ブロブとは

Azure Blob Storage は、HTTP または HTTPS を介して世界中のどこからでもアクセスできる大量の非構造化データを格納するためのサービスです。1 つの BLOB のサイズは数百ギガバイトになる場合があります。

BLOB サービスには、次のコンポーネントが含まれています。

  • ストレージ アカウント: Azure Storage へのすべてのアクセスは、ストレージ アカウントを通じて行われます。

  • コンテナ:コンテナーは、BLOB のセットをグループ化します。すべての BLOB はコンテナー内にある必要があります。アカウントに含めることができるコンテナの数に制限はありません。コンテナには、格納できるブロブの数に制限はありません。

  • ブロッブ:任意の種類とサイズのファイル。Azure Storage に格納できる BLOB には、ブロック BLOB とページ BLOB の 2 種類があります。ほとんどのファイルはブロック BLOB です。1 つのブロック BLOB の最大サイズは 200 GB です。このチュートリアルでは、ブロック BLOB を使用します。ページ BLOB は、別の BLOB タイプで、最大 1 TB のサイズにすることができ、ファイル内のバイト範囲が頻繁に変更される場合に効率的です。

Blobは「バイナリラージオブジェクト」の略で、生のバイトの配列です。次の図は、Windows Azure の BLOB ストレージに使用される階層構造を示しています。

Azure Storage アカウントは、複数のコンテナーを持つことができます。コンテナは、1つ以上のブロブの配列またはコレクションと見なすことができます。また、各 Blob は、Blob コンテンツの内容を定義するための 1 つ以上のメタデータ プロパティを持つことができます。メタデータ プロパティは、文字列の名前と値のコレクションです。

前述のように、Microsoft Azure 上のすべての BLOB の内容には、対応する URI (REST) を参照することでアクセスできます。通常、URI は次の形式です。

https://<Account>.blob.core.windows.net/<Container>/<BlobName>

Blob StorageとNode.JSの使い方は?

さまざまな NodeJS パッケージを使用して、Azure Blob Storage を処理できます。この投稿では、Azure Nodeパッケージ(公式のMicrosoft Azure SDK)について説明します。

Microsoft Azure SDK for Node.js

Node.js用の公式Microsoft Azure SDK(npmページ: https://www.npmjs.org/package/azure、ホームページ: http://github.com/WindowsAzure/azure-sdk-for-node)。 は、Microsoft Azure サービスの利用と管理を容易にする Node.js パッケージを提供します。

次に示すスニペットは、Microsoft Azure SDK for Node.js を使用して Azure Blob Service を管理する方法を示しています。

Azure BLOB サービスを作成する

環境変数を使用して Azure Blob Service を作成し、Azure Table Service と同じ方法で資格情報を格納できます。

Azure Blob Storage の BLOB を一覧表示する

JavaScript code:

var azure = require('azure');

exports.blobs = function (request, response) {

    var accessKey = '[accountKey]';
    var storageAccount = '[accountName]';
    var container = 'nodejs';

    var blobService = azure.createBlobService(storageAccount, accessKey);
    // render blobs with blobs.jade view
    blobService.listBlobs(container, function (error, blobs) {
        response.render('blobs', {
            error: error,
            container: container,
            blobs: blobs
        });
    });
}

A jade view ( using Express.js )

extends layout

block content
    h1 Blob listing for #{container}

    if error
        h3= error

    if blobs
        h3= container
        table
            tr
                th Name
                th Properties
            - each blob in blobs
                tr
                    td= blob.name
                    td
                        ul
                            - each value, name in blob.properties
                                if value
                                    li= name + ":" + value
blob listing for nodejs

Azure Blob Storage へのファイルのアップロード

1 つの方法は、マルチパーティ ノード モジュールを使用することです。これは、ストリーミングをサポートするマルチパート/フォームデータパーサーです。 マルチパートデータには、FormidableのフォークであるMultiparty(npm install multiparty)を使用してアクセスできます。このモジュールは、あなたが指示しない限り、ファイルをディスクにストリームしません。

// upload a file to azure blob storage
app.get('/upload', function (req, res) {
    res.send(
        '<form action="/upload" method="post" enctype="multipart/form-data">' +
        '<input type="file" name="snapshot" />' +
        '<input type="submit" value="Upload" />' +
        '</form>'
    );
});

app.post('/upload', function (req, res) {
    var multiparty = require('multiparty');
    var accessKey = '[accountKey]';
    var storageAccount = '[accountName]';

    var container = 'nodejs';    
    var blobService = azure.createBlobService(storageAccount, accessKey);
    var form = new multiparty.Form();
    
    form.on('part', function (part) {
        if (part.filename) {
            var size = part.byteCount - part.byteOffset;
            var name = part.filename;
            
            blobService.createBlockBlobFromStream(container, name, part, size, function (error) {
                if (error) {
                    res.send('Blob create: error');
                }
            });
        } else {
            form.handlePart(part);
        }
    });

    form.parse(req);
    res.send('OK');
});
// end of upload a file to azure blob storage

次の画面は、サンプル デモ アプリケーションを使用して Azure Blob Storage にファイルをアップロードする方法を示しています。

サンプル デモ アプリケーション 1 を使用して Azure Blob Storage にファイルをアップロードする方法を示します

サンプル デモ アプリケーション 2 を使用して Azure Blob Storage にファイルをアップロードする方法を示します

Azure Blob Storage からのファイルのダウンロード

BLOB をダウンロードしてファイル システムに書き込むには、同様の getBlob メソッドまたは getBlobToFile メソッドを使用できます。

以下の部分では、getBlob の使用方法を示します。

var azure = require('azure');
var fs = require('fs');

var blobService = azure.createBlobService();

// using getBlob to save a file from Azure Blob
blobService.getBlob('[containerName]', '[blobName]').pipe(fs.createWriteStream('[myFileName]'));

次のコードはデモ アプリケーションの一部であり、getBlobToFile を使用して Azure Blob Storage からファイルをダウンロードする方法を示しています。

// download azure blob storage content
app.get('/downloadBlob', function (req, res) {
    res.send(
        '<form action="/downloadBlob" method="post">' +
        '<input type="text" name="blobFile" value="C:\\temp" />' +
        '<input type="submit" value="Download" />' +
        '</form>'
    );
});

app.post('/downloadBlob', function (req, res) {
    var fs = require('fs');

    if (!fs.existsSync) {
        fs.existsSync = require('path').existsSync;
    }

    var destinationDirectoryPath = req.body.blobFile;
    var accessKey = '[accountKey]';
    var storageAccount = '[accountName]';
    var containerName = 'nodejs';

    var blobService = azure.createBlobService(storageAccount, accessKey);

    if (!fs.existsSync(destinationDirectoryPath)) {
        console.log(destinationDirectoryPath + ' is an invalid directory path.');
    } else {
        downloadFilesParallel(res, blobService, containerName, destinationDirectoryPath);
    }
});

downloadFilesParallel 関数を上記のコードで使用します。

function downloadFilesParallel(res, blobService, containerName, destinationDirectoryPath) {
    blobService.listBlobs(containerName, function (error, blobs) {
        if (error) {
            console.log(error);
        } else {
            var blobsDownloaded = 0;
            res.writeHead(200, { 'Content-Type': 'text/plain' });

            blobs.forEach(function (blob) {
                blobService.getBlobToFile(containerName, blob.name, destinationDirectoryPath + '/' + blob.name, function (error2) {
                    blobsDownloaded++;

                    if (error2) {
                        console.log(error2);
                    } else {
                        res.write('\nBlob ' + blob.name + ' download finished.');

                        if (blobsDownloaded === blobs.length) {
                            // Wait until all workers complete and the blobs are downloaded
                            res.end('\nAll files downloaded');
                        }
                    }
                });
            });
        }
    });
}

サンプル アプリのスクリーンショットで、Blob Storage からファイルをダウンロードする方法を示します。

Blob Storage からファイルをダウンロードする方法を示すサンプル アプリ

 

Blob Storage 2 からファイルをダウンロードする方法を示すサンプル アプリ

ダウンロードした BLOB は、ローカル コンピューター上にあります

スペシャリストは、Azure Blob サービスと Node についてさらに詳しく知ることができます。 Microsoft は、BLOB ストレージの成長と改善を続けています。この投稿では、Azure Blob Storage の基本ケースと最も一般的な Node.js モジュールについて説明し、開始方法について説明します。Microsoft Azureの経験がないJavaScript開発者と、JavaScriptやNode.jsの経験が少ないAzure開発者の両方にとって便利です。

Microsoft Azure Platform の開発者は、Azure Blob Storage のしくみと、Microsoft クラウドでの非構造化データの処理方法に精通する必要があります。BLOB ストレージのしくみを知ることは、特定の要件に適しているかどうかを判断するのに役立ちます。

ソースコードはGitリポジトリからダウンロードできます。

 node js

Microsoft Azure Storage の使用方法の詳細についてはNode.js mmateev@infragistics.comまでお気軽にお問い合わせください。

Node.js、Microsoft Azure、Azure Bootcamp Bulgariaなどの関連イベントの詳細については、Twitterでフォローしたり@mihailmateev​ ​FacebookGoogle+LinkedIn​ ​@Infragistics​ ​Infragistics Friends User Groupで連絡を取り合ったりすると知ることができます。

デモを予約