Bluemix의 Object Storage 문서를 먼저 참조하십시오. 이 링크가 공식적인 문서이며 이 포스팅은 어플리케이션 연동법에 대해서만 다룹니다.

3.1 서비스 신임정보 생성하기

1) 서비스 신임정보 탭으로 이동합니다. 새 신임정보 버튼을 클릭합니다.

2) 추가 버튼을 클릭합니다.

3) 생성된 신임정보의 신임 정보 보기 버튼을 클릭하여 정보를 확인합니다.

3.2 pkgCloud 사용하여 어플리케이션 연동하기

블루믹스의 오브젝트 스토리지는 Openstack API Spec을 따릅니다. 따라서 Openstack Swift를 지원하는 다양한 library를 활용할 수 있습니다. 그중에서도 pkgCloud는 node.js기반의 대표적인 library입니다.

먼저 pkgCloud를 설치합니다. 이 문서 작성시에는 1.4.0(latest)을 사용했습니다.

npm install pkgcloud --save

환경 변수를 이용하기 위해 cfenv와 dotenv도 설치합니다.

"cfenv": "*",
"dotenv": "^2.0.0",

3.2.1 API Client 생성

1) .env 파일에 credential 정보 입력

위에서 생성한 서비스 신임정보를 환경 변수로 등록합니다. 이미 기 등록된 OS 환경변수를 사용하지 않도록 주의합니다. Bluemix Object Storage는 keystone 인증을 사용하며 v3의 버전을 지원합니다.

# Object Storage Environment Variables
auth_url=https://lon-identity.open.softlayer.com
keystone_version=v3
project=object_storage_d21f009xxxxxxxxxxxxxxxxxxx
project_id=89fxxxxxxxxxxxxxxxxxxxxxx
region=london
user_id=ead08xxxxxxxxxxxxxxxxxxxx
user_name=admin_613759f6xxxxxxxxxxxxxxxxxxxxxxxxxxxx
password=xJH.xxxxxxxxxxxxxxxx
domain_id=41937b584b7344f58xxxxxxxxxxxxxx
domain_name=1111111
role=admin

2) Client 생성
위 단계에서 설정한 환경변수로 API Client를 생성합니다. 만약 아래 코드를 사용하여 어플리케이션을 실행했을 때 Console에 에러가 출력된다면, credential 정보 중 값이 잘못 들어갔을 확률이 가장 큽니다. pkgcloud를 사용하면 인증 토큰 관리를 라이브러리가 알아서 해주므로 편리합니다.

'use strict';

const pkgcloud = require('pkgcloud');

let config = {
    provider: 'openstack',
    useServiceCatalog: true,
    useInternal: false,
    keystoneAuthVersion: process.env.keystone_version,
    authUrl: process.env.auth_url,
    tenantId: process.env.project_id,    //projectId from credentials
    domainId: process.env.domain_id,
    username: process.env.user_name,
    password: process.env.password,
    region: process.env.region   //dallas or london region
};

let client = pkgcloud.storage.createClient(config);

client.auth(err => {
	console.log(err);
})

3.2.2 Container 리스트 가져오기

pkgcloud의 Container api를 사용하여 Container 목록을 가져옵니다.

client.getContainers((err, containers) => {
		//implement code
	});

3.2.3 Container 생성하기

pkgcloud의 Container api를 사용하여 Container를 생성합니다.

client.createContainer("New Container Name", (err, container) => {
		//implement code
	});

3.2.4 Object 목록 가져오기

pkagecloud의 File api를 사용하여 Object 목록을 가져옵니다.

client.getFiles("Container Name", (err, container) => {
		//implement code
	});

3.2.5 파일 업로드 하기

multiparty는 웹 클라이언트에서 올라오는 multipart 형식의 데이터를 처리하기 위한 라이브러리 입니다. 다음은 multiparty를 활용하여 Cloud로 파일을 업로드 하는 예제입니다.

multiparty를 설치합니다.

  npm install multiparty --save

먼저 Client 코드입니다. 다음을 참조하여 file input을 받는 html 을 작성합니다.

<form encType="multipart/form-data">
	<div>
	      <label for="container_name">Container Name:<span class="ibm-required">*</span></label>
	      <span>
	        <input type="text" value="" size="40" id="container_name" name="container_name">
	      </span>
	 </div>
	 <div>
		<label for="object">File attachment:</label>
		<span>
		        <input id="object" type="file" data-widget="fileinput" data-multiple="false" />
		</span>
		<span class="ibm-item-note">Upload size limit (5 GB)</span>
	</div>
	<button class="ibm-btn-small ibm-btn-blue-50 ibm-btn-pri ibm-margin-top-1" type="button">OK</button>
</form>

Form 데이터를 서버로 전송합니다.

var input = document.querySelector(selector.overlay_object.input); // 컨테이너 이름을 위한 text input
var file = document.querySelector(selector.overlay_object.file); // 업로드할 file input

var formData = new FormData();
formData.append("object", file.files[0]);

var qs = "container=" + input.value; 

var promise = new Promise(function(resolve, reject){
    var http = new XMLHttpRequest();
    http.open('POST', uri.object + "?" + qs, true);
    http.onreadystatechange = function() {
	if (http.readyState === 4 && http.status === 200 && http.responseText) {
	    resolve(JSON.parse(http.responseText));
	}
    };
    http.send(formData);
});

return promise;

서버 코드입니다. 클라이언트로부터 받은 파일을 multiparty를 활용하여 클라우드로 바로 업로드 합니다. multiparty가 제공하는 part 는 ReadableStram 타입입니다. 따라서 pipe함수를 사용하여 바로 업로드가 가능합니다.

const url = require('url');
const multiparty = require('multiparty');

let uploadObject = (req, res) => {
	let form = new multiparty.Form();
	let queryObject = url.parse(req.url,true).query; // query parameter로 파일을 업로드 할 container를 지정합니다. 

	form.on('part', part => {
	    var upload = client.upload({
               container: queryObject.container,
               remote: part.filename
            });

            upload.on('error', function(err) {
               return res.status(err.code || 500).json(err.message);
            });
            upload.on('success', function(file) {
               return res.json({
                  status' : 'success'
               })
            });

	    part.pipe(upload);
	});

	form.parse(req);
}

3.3 샘플 코드 및 테스트

위 단계에서 설명한 샘플 코드는 돌아가는 어플리케이션으로 확인할 수 있습니다.
Bluemix Object Storage Sample 레파지토리를 folk하여 테스트하십시오.

pkgcloud 문서를 참고하여 더 다양한 api를 사용할 수 있습니다.