반응형

이번 시간에는 node.js 를 이용해서 min.io 스토리지에 접근해서 파일을 읽고, 쓰는 예제 코드를 작성해 보겠습니다.

 

이번 포스트는 작성시 아래 url 을 참고하였습니다.

https://northflank.com/guides/connecting-to-a-minio-database-using-node-js

 

Connecting to a MinIO database using Node.js — Northflank

MinIO is a highly-available, S3 compatible object storage solution. Through this guide you will learn how to connect a MinIO instance to your Node.js project.

northflank.com

 

먼저 node.js 를 설치해야 합니다. 설치가 필요하신 분들은 아래 사이트를 참고하셔서 설치하시기 바랍니다.

https://nodejs.org/

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

다음으로는 node.js 프로젝트를 생성합니다.

 

폴더하나 생성하고, 폴더로 가서 아래와 같이 입력합니다.

> npm init

 

몇 가지 물어보는 것에 성실히 답을 하면 프로젝트가 생성됩니다. 그리고나서 아래 명령어들을 차례로 입력해서, 필요한 모듈을 설치합니다.

> npm install
> npm install minio

 

minio 모듈은 minio 서버에 접속해서 필요한 기능을 수행할 수 있게 해주는 모듈입니다.

 

 

min.io 서버에 접속하기 위해서는 서버의 host, port 와 함께, access key, secret key 정보가 필요합니다.

 

min.io 에서 javascript Client API 및 예제를 제공하고 있으므로, 아래 링크 참조하세요.

https://docs.min.io/docs/javascript-client-api-reference.html

 

MinIO | JavaScript Client API Reference

JavaScript Client API Reference Initialize MinIO Client object. MinIO var Minio = require('minio') var minioClient = new Minio.Client({ endPoint: 'play.min.io', port: 9000, useSSL: true, accessKey: 'Q3AM3UQ867SPQQA43P2F', secretKey: 'zuf+tfteSlswRu7BJ86wek

docs.min.io

 

min.io 서버에 접속하기 위한 코드는 다음과 같습니다. 여기서 필요한 세팅 정보를 변경해 줘야 합니다.

var Minio = require('minio')

var minioClient = new Minio.Client({
    endPoint: 'play.min.io',
    port: 9000,
    useSSL: true,
    accessKey: 'Q3AM3UQ867SPQQA43P2F',
    secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'
});

 

먼저 endPoint 는 min.io 서버의 IP 주소를 입력하면 됩니다. 

port는 min.io 서비스의 port를 적어주면 됩니다. 서비스 default 값은 9000 입니다.

useSSL은 실제 서비스에서는 true 로 해줘야겠지만,  SSL 설정이 되어 있지 않은 테스트 환경에서는 false 로 지정합니다.

나머지 access key 와 secret key 는 min.io 콘솔에서 생성합니다.

 

콘솔에 로그인한 후에, 오른쪽 메뉴에서 Identity 를 선택하고, Service Accounts 를 선택합니다.

 

화면 오른쪽 상단에 있는 Create service account 버튼을 클릭합니다. 아래와 같이 Access Key와 Secret Key가 생성됩니다. 

 

Create 버튼을 눌러서 생성하면, 아래처럼 Access Key와 Secret Key가 공개되는데, Secret Key는 여기서만 보여주고, 다시 확인이 불가능하니, Download for import 버튼을 눌러서 백업해 두는 것이 좋습니다.

 

Access Key와 Secret Key 가 생성되고 나면, 연결 설정 정보들을 변경해줍니다.

 

그리고 아래와 같이 코드를 작성해서, "test-bucket" 을 생성하고, bucket 리스트를 받아와서 console에 출력해 봅니다.

const bucketName = "test-bucket";

(async () => {
  console.log(`Creating Bucket: ${bucketName}`);
  await minioClient.makeBucket(bucketName, "hello-there").catch((e) => {
    console.log(
      `Error while creating bucket '${bucketName}': ${e.message}`
     );
  });

  console.log(`Listing all buckets...`);
  const bucketsList = await minioClient.listBuckets();
  console.log(
    `Buckets List: ${bucketsList.map((bucket) => bucket.name).join(",\t")}`
  );
})();

 

다음 코드는 문자열을 텍스트 (파일) 오브젝트를 생성해서 스토리지에 저장하는 예제입니다.

(async () => {
  // create object with string data
  const objectName = "file.txt";
  const result = await minioClient
    .putObject(bucketName, objectName, "Hello There!")
    .catch((e) => {
      console.log("Error while creating object: ", e);
      throw e;
    });

  console.log("Object uploaded successfully: ", result);
})();

 

다음 코드는 파일을 읽어서 스토리지에 저장하는 예제입니다.

const fs = require('fs');

(async () => {
  // create object from file data
  const objectFileName = "file-object.txt";
  const fileData = fs.readFileSync("./file.txt");
  const submitFileDataResult = await minioClient
    .putObject(bucketName, objectFileName, fileData)
    .catch((e) => {
      console.log("Error while creating object from file data: ", e);
      throw e;
    });

  console.log("File data submitted successfully: ", submitFileDataResult);
})();

 

마지막으로 스토리지에 저장되어 있는 오브젝트를 읽어와서 로컬 폴더에 저장하는 예제입니다.

const fs = require('fs');

(async () => {
  // read object in chunks and store it as a file
  const fileStream = fs.createWriteStream("./read-in-chunks.txt");
  const fileObjectKey = "file-object.txt";

  const object = await minioClient.getObject(bucketName, fileObjectKey);
  object.on("data", (chunk) => fileStream.write(chunk));

  object.on("end", () => console.log(`Reading ${fileObjectKey} finished`));
})();

지금까지 node.js 코드를 이용해서, min.io 스토리지에 bucket 을 생성하고, bucket 리스트를 받아오고, (파일) 오브젝트를 생성하고, 읽어오는 예제들을 살펴보았습니다. 

여기에 나온 예제들은 예외처리가 제대로 되어 있지 않아서, 실제 사용시에는 조금 더 주의를 기울여서 살펴봐야 합니다.

반응형

+ Recent posts