Node.js를 사용하여 Microsoft Azure Blob Storage를 관리하는 방법
노드 및 Blob Storage로 시작하는 방법을 알아보고 가장 자주 볼 수 있는 사례를 다룹니다.
Node.js는 개발을 위한 가장 인기 있는 성장 플랫폼 중 하나입니다. Node.js와 함께 사용되는 언어는 JavaScript입니다 –GitHub에서 가장 많이 사용되는 언어 #1 이며 이러한 추세는 계속 증가할 것입니다(Forbes, 2014년 7월 14일).
Microsoft Azure Blob Storage
Microsoft Azure 스토리지 서비스를 사용하면 Windows 클라우드 환경에서 NON RELATIONAL 데이터를 저장/검색할 수 있습니다. Microsoft Azure Storage에서 데이터는 4가지 형식(v.i.z. Blob, 테이블 및 큐, 파일 스토리지(미리 보기))으로 저장할 수 있습니다.
블롭이란 무엇인가요?
Azure Blob Storage는 HTTP 또는 HTTPS를 통해 전 세계 어디에서나 액세스할 수 있는 대량의 비정형 데이터를 저장하기 위한 서비스입니다. 단일 Blob의 크기는 수백 기가바이트일 수 있습니다.
Blob 서비스에는 다음과 같은 구성 요소가 포함되어 있습니다.
스토리지 계정: Azure Storage에 대한 모든 액세스는 스토리지 계정을 통해 수행됩니다.
컨테이너: 컨테이너는 Blob 집합의 그룹화를 제공합니다. 모든 Blob은 컨테이너에 있어야 합니다. 계정에는 컨테이너를 무제한으로 포함할 수 있습니다. 컨테이너는 Blob을 무제한으로 저장할 수 있습니다.
블롭: 모든 유형 및 크기의 파일입니다. Azure Storage에 저장할 수 있는 Blob에는 블록 및 페이지 Blob의 두 가지 유형이 있습니다. 대부분의 파일은 블록 Blob입니다. 단일 블록 Blob의 크기는 최대 200GB일 수 있습니다. 이 자습서에서는 블록 Blob을 사용합니다. 또 다른 Blob 유형인 페이지 Blob은 크기가 최대 1TB일 수 있으며 파일의 바이트 범위를 자주 수정할 때 더 효율적입니다.
Blob은 원시 바이트의 배열인 'Binary Large Object'의 약자입니다. 다음 그림에서는 Windows Azure의 Blob 저장소에 사용되는 계층 구조를 보여 줍니다.

Azure Storage 계정에는 여러 컨테이너가 있을 수 있습니다. 컨테이너는 하나 이상의 Blob으로 구성된 배열 또는 컬렉션으로 간주될 수 있습니다. 또한 각 Blob에는 Blob 콘텐츠의 모든 내용을 정의하는 하나 이상의 메타데이터 속성이 있을 수 있습니다. 메타데이터 속성은 문자열의 Name-Value 컬렉션입니다.
앞에서 언급했듯이 Microsoft Azure에 있는 모든 Blob의 콘텐츠는 해당 URI(REST)를 탐색하여 액세스할 수 있습니다. URI의 형식은 일반적으로 다음과 같습니다.
https://<Account>.blob.core.windows.net/<Container>/<BlobName>
Blob Storage 및 Node.JS 사용하는 방법?
다른 NodeJS 패키지를 사용하여 Azure Blob Storage를 처리할 수 있습니다. 이 게시물에서는 azure 노드 패키지(공식 Microsoft Azure SDK)에 대해 설명합니다.
Microsoft Azure SDK for Node.js
Node.js 용 공식 Microsoft Azure SDK(npm page: https://www.npmjs.org/package/azure, homepage: http://github.com/WindowsAzure/azure-sdk-for-node). Microsoft Azure 서비스를 쉽게 사용하고 관리할 수 있는 Node.js 패키지를 제공합니다.
아래 나열된 코드 조각은 Microsoft Azure SDK for Node.js를 사용하여 Azure Blob 서비스를 관리하는 방법을 보여 줍니다.
Create an Azure Blob Service
Azure Table Service와 동일한 방식으로 자격 증명을 저장하기 위해 환경 변수를 사용하여 Azure Blob Service를 만들 수 있습니다.
List Blobs in Azure Blob Storage
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

Upload File To Azure Blob Storage
한 가지 방법은 다자간 노드 모듈을 사용하는 것입니다. 스트리밍을 지원하는 multipart/form-data 파서입니다. 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에 파일을 업로드하는 방법을 보여 줍니다.


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에서 파일을 다운로드하는 방법을 보여 주는 샘플 앱의 스크린샷입니다.



전문가는 Azure Blob 서비스 및 Node에 대해 훨씬 더 자세히 알아볼 수 있습니다. Microsoft는 Blob Storage를 계속 확장하고 개선하고 있습니다. 이 게시물에서는 Azure Blob Storage의 기본 사례 및 가장 인기 있는 Node.js 모듈을 다루며 시작하는 방법을 설명합니다. Microsoft Azure에 대한 경험이 없는 JavaScript 개발자와 JavaScript 및/또는 Node.js에 대한 경험이 적은 Azure 개발자 모두에게 유용합니다.
Microsoft Azure 플랫폼의 개발자는 Azure Blob Storage의 작동 방식과 Microsoft 클라우드에서 비정형 데이터를 처리하는 방법에 대해 잘 알고 있어야 합니다. Blob Storage의 작동 방식을 알면 특정 요구 사항에 적합한지 확인하는 데 도움이 됩니다.
Git 저장소에서 소스 코드를 다운로드할 수 있습니다.

If you want more information about how to use Microsoft Azure Storage & Node.js feel free to contact me at mmateev@infragistics.com
Twitter에서 팔로우하고 Facebook@mihailmateev Google + LinkedIn 및 Infragistics Friends 사용자 그룹에서 연락을 유지하면 Node.js, Microsoft Azure 및 Azure Bootcamp Bulgaria와 같은 관련 이벤트에 대해 자세히 알아볼 수 Infragistics.