반응형

이번 시간에는 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 리스트를 받아오고, (파일) 오브젝트를 생성하고, 읽어오는 예제들을 살펴보았습니다. 

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

반응형
반응형

먼저 min.io 는 무엇인가? 그리고 어디에 쓰면 좋은가? 에 대해서 살펴보도록 하겠습니다.

 

https://min.io/

 

MinIO | High Performance, Kubernetes Native Object Storage

MinIO's High Performance Object Storage is Open Source, Amazon S3 compatible, Kubernetes Native and is designed for cloud native workloads like AI.

min.io

 

홈페이지에 따르면, min.io는 (aws) S3와 호환되는 고성능의 오브젝트 스토리지 라고 소개하고 있습니다. 즉, 스토리지 서비스를 구축하는데 사용할 수 있는 오픈 소스 솔루션 입니다. S3와 사용법이 거의 유사하게 되어 있어서, S3를 써 보셨던 분들은 매우 쉽게 사용이 가능하며, 스토리지를 처음 써보시는 분들은 약간의 적응이 필요합니다.

 

서비스를 시작하는 방법은 여러가지가 있지만, 저는 docker를 사용해서 서비스를 시작해 보겠습니다. (docker 설치 필요)

 

min.io 서비스를 시작하기 위해서는 docker를 사용하면 되는데, min.io 에서는 podman 커맨드를 제시하고 있어서 혼선을 주고 있습니다. podman 을 별도로 설치하기 귀찮아서 docker-compose.yml 파일을 아래와 같이 작성해 보았습니다.

 

version: '3'
services:
  s3:
    image: minio/minio
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: changeme
    volumes:
      - ./storage/minio:/data
    command: server /data --console-address ":9001"

 

서비스 명은 편의상 s3로 하였습니다. 그리고, docker에서 사용할 image 를 지정해 주었고 (minio/minio), 서비스에서 사용될 포트를 매핑해 주었습니다. (9000, 9001)

환경변수로 user, password 를 지정해 주었으며, volume을 지정하여 재시작을 해도 기존에 저장했던 스토리지 정보가 남을 수 있게 해 주었습니다.

시작 커맨드는 버전에 따라 약간씩 상이하다고 하니, 추후에는 변경이 될 수도 있습니다.

 

커맨드 윈도우에서 아래 명령어를 이용해서 서비스를 시작합니다.

> docker-compose -f docker-compose.yml up -d

 

도커 컨테이너가 제대로 실행되어 돌아가면, 브라우저를 열어서 http://localhost:9000 으로 접속을 시도합니다.

요청은 http://localhost:9001로 redirect 되며, 아래와 같은 admin 페이지 로그인 창이 뜹니다.

위의 docker-compose.yml 파일에 설정했던, username, password 를 이용해서 로그인을 합니다.

 

로그인을 하면, 아래와 같은 화면이 나옵니다.

 

위의 화면에서 우측 상단의 Create Bucket 버튼을 클릭해서 Bucket을 생성해 봅니다.

Bucket Name 에 'test'를 입력하고, Create Bucket 버튼을 클릭하여 bucket을 생성합니다. 제대로 생성되면 아래와 같은 화면이 나오게 됩니다.

 

생성된 bucket 에 파일을 드래그해서 업로드 해 봅니다. 아래와 같은 화면이 나오면서 파일이 올라간 것이 화면에 표시됩니다. 업로드 버튼을 클릭해서 폴더도 생성할 수 있고, 파일을 업로드 할 수도 있습니다.

 

업로드 된 파일을 클릭해보면, 화면 우측에 파일을 다운로드, 공유, 삭제하거나 정보를 확인 할 수 있는 창이 나타납니다.

 

Share 아이템을 클릭하면 아래와 같이 특정 기간 동안 유효한 URL을 생성하여 파일을 공유할 수 있습니다.

 

이번 시간에는 docker를 이용해서 min.io 서비스를 설치하고, bucket을 생성하고, 간단하게 파일 업로드 및 공유 기능에 대해서 살펴 보았습니다. 다음 시간에는 node.js를 이용해서 프로그래밍으로 bucket 을 관리하고, 파일 업로드 및 다운로드를 하는 예시를 살펴 보겠습니다.

반응형

+ Recent posts