Skip to main content

Tạo Amazon Simple Storage Service S3 với MinIO và Docker trên môi trường development

Tạo Object Storage Server S3 với MinIO và Docker trên môi trường development là hướng dẫn nhanh tạo S3 giả lập trên local và hướng dẫn kết nối với S3 API bằng Nodejs đơn giản thông qua ví dụ cụ thể

MinIO là gì?

MinIO là một mã nguồn mở viết bằng Go được thiết kế cho cơ sở hạn tầng đám mây riêng, giúp bạn tự tạo một Object Storage Server giống như AWS S3, DigitalOcean Spaces, Backblaze B2, ... dùng để phục vụ lưu trữ dữ liệu với đâỳ đủ các tính năng như các dịch vụ của những tổ chức lớn đó

Image
Kết quả upload file nodejs aws S3 và MinIO

MinIO sẽ giúp bạn có thể tạo chức năng lưu trữ S3 cục bộ, phát triển và thử nghiệm API của mình mà không cần bất kỳ tài khoản S3 thực tế nào. Sau đó khi public sản phẩm, bạn chỉ cần thay đổi thông tin xác thực từ MinIO sang S3 mà không cần thay đổi bất kỳ mã nội bộ nào.

Cấu trúc của MinIO gồm 3 phần chính:

Image
Cấu trúc của MinIO

  • MinIO Server: MinIO Server đóng vai trò là thành phần gốc. (Root Component)
  • MinIO Client: cung cấp giải pháp thay thế cho các lệnh UNIX như ls, cat, cp, mirror, diff, find, v.v.
  • MinIO Client SDK: cung cấp API để truy cập bất kỳ máy chủ lưu trữ đối tượng nào, gồm SDK: Jave, Go, Python, JavaScript , Net

Cài đặt MinIO với Docker

Tạo file docker-compose.yml

version: '3.0'
 minio:
   image: minio/minio
   container_name: minio
   ports:
     - "9000:9000"
     - "9001:9001"
   command: server --console-address ":9001" /data
   environment:
     MINIO_ROOT_USER: minioadmin
     MINIO_ROOT_PASSWORD: minioadmin
   volumes:
     - minio_storage:/data
volumes:
 minio_storage: {}

Sau đó dùng lệnh 

docker-compose up -d

Thông tin config:

  • Port 9000 là endpoint S3 API 
  • Port 9001 là MinOI Dashboad
  • MINIO_ROOT_USER: minioadmin là user 
  • MINIO_ROOT_PASSWORD: minioadmin lá password

Sau đó bạn mở trình duyệt http://localhost:9001/ để vào trang quản trị của MinOI

Image
MioIO login page

Tạo Bucket, Region và Access Keys trong MinIO

Sau khi login => chọn menu => Buckets => Click button "Create Bucket"

Image
Tạo Bucket trên MinIO

Tiếp tục vào trong Menu => Access Keys để tạo một key mới

Image
Tạo Access Key trong MinIO

Chú ý, key generate một lần nên lưu lại nó ngay sau khi tạo

Tương tự tạo Region S3 ở menu > Configuration > Region, có thể bỏ trống để giá trị mặc định là us-east-1

Sử dụng S3 từ MinIO với Nodejs

Tạo file .env với config

S3_UPLOAD_BUCKET_NAME=for-test-bk
S3_ACCESS_KEY=minioadmin
S3_SECRET_ACCESS_KEY=minioadmin
S3_ENDPOINT_OVERRIDE=http://127.0.0.1:9000
S3_REGION=us-east-1

Sau đó cài đặt package aws-sdk,@aws-sdk/lib-storage,@aws-sdk/client-s3 

Giờ có thể test API S3 với MinIO trên local với config

import { S3Client } from "@aws-sdk/client-s3";

const S3Client = new S3Client({
   region: process.env.S3_REGION,
   endpoint: process.env.S3_ENDPOINT_OVERRIDE,
   credentials: {
     accessKeyId: process.env.S3_ACCESS_KEY ?? '',
     secretAccessKey: process.env.S3_SECRET_ACCESS_KEY ?? ''
   },
   forcePathStyle: true // important
});

Bây giờ mình sẽ test upload file vởi API S3


const uuid = v4();
const params = {
 Bucket: process.env.S3_UPLOAD_BUCKET_NAME ?? '',
 Key: `${uuid}/demo.jpg`,
 Body: fs.createReadStream('path/to/demo.jpg')
};
const res = await new Upload({
 client: S3Client,
 params: params,
}).done();

Kết quả:

Image
Kết quả upload file nodejs aws S3 và MinIO

Sản Phẩm

Sản Phẩm & Dịch Vụ Dành cho SME