CLI, REST API, SDK를 통해 Minio 버킷에 접근해 보자
docker run -d \
--name minio \
-p 9000:9000 \
-p 9001:9001 \
-e MINIO_ROOT_USER=admin \
-e MINIO_ROOT_PASSWORD=admin123 \
-v ~/minio/data:/data \
quay.io/minio/minio server /data --console-address ":9001"
도커 설치 시 사용되는 ROOT 사용자 ID, Password는 웹 콘솔 로그인 시 사용한다. API 호출 시에는 웹콘솔 (localhost:9001)에 접속하여 키를 생성한다. 저장 시 json으로 내려받을 수 있다.
4Kj6Q3rWIrab0PVHGQLh
j980yntyJFvGQuvBC6ItSmeGpA0O3usxSmzHFvG8
{"url":"http://localhost:9001/api/v1/service-account-credentials","accessKey":"4Kj6Q3rWIrab0PVHGQLh","secretKey":"j980yntyJFvGQuvBC6ItSmeGpA0O3usxSmzHFvG8","api":"s3v4","path":"auto"}
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
ubuntu@DESKTOP-SCOK45O:~$ mc --version
mc version RELEASE.2025-03-12T17-29-24Z (commit-id=c1d5d4cbb4caf05afef3ea06a91a56bd778336de)
Runtime: go1.24.1 linux/amd64
Copyright (c) 2015-2025 MinIO, Inc.
License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
ubuntu@DESKTOP-SCOK45O:~$ mc alias set myminio http://localhost:9000 admin admin123
mc: Configuration written to `/home/ubuntu/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/home/ubuntu/.mc/share`.
mc: Initialized share uploads `/home/ubuntu/.mc/share/uploads.json` file.
mc: Initialized share downloads `/home/ubuntu/.mc/share/downloads.json` file.
Added `myminio` successfully.
mc alias set myminio http://localhost:9000 4Kj6Q3rWIrab0PVHGQLh j980yntyJFvGQuvBC6ItSmeGpA0O3usxSmzHFvG8
mc alias set myminio2 http://localhost:9000 4Kj6Q3rWIrab0PVHGQLh j980yntyJFvGQuvBC6ItSmeGpA0O3usxSmzHFvG8
ubuntu@DESKTOP-SCOK45O:~$ mc ls myminio
[2025-03-25 20:10:51 KST] 0B myjobskill/
ubuntu@DESKTOP-SCOK45O:~$ mc mb myminio/mybucket
Bucket created successfully `myminio/mybucket`
ubuntu@DESKTOP-SCOK45O:~$ mc cp mybucket.py myminio/mybucket/
...tu/mybucket.py: 292 B / 292 B ┃┃ 23.14 KiB/s 0s
ubuntu@DESKTOP-SCOK45O:~$ mc ls myminio/mybucket/
[2025-03-26 11:52:31 KST] 292B STANDARD mybucket.py
ubuntu@DESKTOP-SCOK45O:~$ mc mb myminio2/mybucket2
Bucket created successfully `myminio/mybucket`
| 명령어 | 설명 | 예제 |
|---|---|---|
| mc alias set | MinIO(S3 호환) 서버를 별칭(alias)으로 등록 | mc alias set myminio http://localhost:9000 admin password |
| mc alias list | 등록된 MinIO(S3) 서버 목록 조회 | mc alias list |
| mc alias remove | 등록된 서버(alias) 삭제 | mc alias remove myminio |
| 명령어 | 설명 | 예제 |
|---|---|---|
| mc ls | 버킷 및 파일 목록 조회 | mc ls myminio/ |
| mc mb | 새로운 버킷 생성 | mc mb myminio/mybucket |
| mc rb | 버킷 삭제 (비어 있어야 함) | mc rb myminio/mybucket |
| mc rm | 파일 또는 폴더 삭제 | mc rm myminio/mybucket/myfile.txt |
| mc cp | 파일 복사 (로컬 <-> MinIO 간 복사 가능) | mc cp myfile.txt myminio/mybucket/ |
| mc mv | 파일 이동 | mc mv myfile.txt myminio/mybucket/ |
| mc stat | 파일 또는 버킷 정보 조회 | mc stat myminio/mybucket/myfile.txt |
| mc find | 파일 검색 | mc find myminio/mybucket --name "*.txt" |
| mc tree | 버킷 및 폴더 구조 트리 형태로 출력 | mc tree myminio/mybucket |
| 명령어 | 설명 | 예제 |
|---|---|---|
| mc mirror | 로컬과 MinIO 간 동기화 | mc mirror /local/path myminio/mybucket/ |
| mc cat | 파일 내용 출력 | mc cat myminio/mybucket/myfile.txt |
| mc head | 파일의 앞부분 일부 출력 | mc head myminio/mybucket/myfile.txt |
| mc diff | 두 개의 버킷/디렉터리 차이 비교 | mc diff myminio/mybucket1 myminio/mybucket2 |
| 명령어 | 설명 | 예제 |
|---|---|---|
| mc policy list | 버킷 정책 목록 조회 | mc policy list myminio/mybucket |
| mc policy set | 버킷 정책 변경 (public, private, readonly 등) | mc policy set public myminio/mybucket |
| mc admin user add | 새로운 사용자 추가 | mc admin user add myminio newuser newpassword |
| mc admin user list | 등록된 사용자 목록 조회 | mc admin user list myminio |
| mc admin user remove | 사용자 삭제 | mc admin user remove myminio newuser |
| 명령어 | 설명 | 예제 |
|---|---|---|
| mc admin info | MinIO 서버 정보 확인 | mc admin info myminio |
| mc admin config get | MinIO 서버 설정 조회 | mc admin config get myminio |
| mc admin config set | MinIO 서버 설정 변경 | mc admin config set myminio logger_webhook enable=on |
| mc admin service restart | MinIO 서버 재시작 | mc admin service restart myminio |
| mc admin heal | 손상된 오브젝트 복구 | mc admin heal myminio/mybucket |
| 명령어 | 설명 | 예제 |
|---|---|---|
| mc encrypt set | 버킷 또는 파일 암호화 활성화 | mc encrypt set sse-s3 myminio/mybucket |
| mc encrypt info | 버킷 또는 파일의 암호화 상태 조회 | mc encrypt info myminio/mybucket |
| 명령어 | 설명 | 예제 |
|---|---|---|
| mc admin trace | MinIO 요청 로그 실시간 조회 | mc admin trace myminio |
| mc admin log | MinIO 서버 로그 조회 | mc admin log myminio |
| 명령어 | 설명 | 예제 |
|---|---|---|
| mc version | mc 버전 확인 | mc version |
| mc help | 전체 명령어 목록 및 설명 확인 | mc help |
| mc help <명령어> | 특정 명령어 사용법 확인 | mc help cp |
sudo apt update
sudo apt install unzip curl
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
ubuntu@DESKTOP-SCOK45O:~$ aws --version
aws-cli/2.25.3 Python/3.12.9 Linux/5.15.167.4-microsoft-standard-WSL2 exe/x86_64.ubuntu.24
ubuntu@DESKTOP-SCOK45O:~$ aws --endpoint-url http://localhost:9000 --no-verify-ssl s3 ls
2025-03-25 20:10:51 myjobskill
vi .s3cfg
host_base = localhost:9000
host_bucket = myjobskill
access_key = 4Kj6Q3rWIrab0PVHGQLh
secret_key = j980yntyJFvGQuvBC6ItSmeGpA0O3usxSmzHFvG8
use_https = False
ubuntu@DESKTOP-SCOK45O:~$ s3cmd ls
2025-03-25 11:10 s3://myjobskill
AWS의 API 도구를 그래도 사용 하는 Minio 는 REST API 호출 시 AWS Signiture를 만드는 작업이 필요하다. 문제는 Signiture 만드는 과정이 매우 복잡하다. 이 문제 때문에 CLI 도구를 통해 API 호출을 하거나 script 로 minio SDK를 통해 호출하는 방법을 사용하는 것이 효율적이다.
아래와 같이 REST API 호출 시 AWS Signature V4 서명 생성을 해서 입력을 해야 하나 이 과정이 매우 복잡하고 실수할 가능성이 크다.
curl -X GET \
-H "Authorization: AWS4-HMAC-SHA256 Credential=minioadmin/$(date +%Y%m%d)/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-date, Signature=<signature>" \
-H "x-amz-date: $(date -u +"%Y%m%dT%H%M%SZ")" \
http://localhost:9000/
aws-cli나 mc 도구는 이 서명 생성을 자동으로 처리하므로, 직접 서명을 생성할 필요 없이 해당 도구들을 사용할 수 있다. 하지만 CLI를 사용하면 매번 프로세스를 실행하는 방식이기 때문에, 그에 따른 성능이나 효율성 문제는 있을 수 있다. 특히 고빈도 요청이나 실시간 처리가 필요한 경우, 프로세스마다 외부 시스템과 통신을 하게 되는 구조가 성능 상 불리할 수 있다.이 문제를 해결하려면, 클라이언트 라이브러리나 API를 직접 호출하는 방식을 사용하여 매번 프로세스를 시작하지 않도록 할 수 있다.
vi mybucket.pyfrom minio import Minio
from minio.error import S3Error
client = Minio(
"localhost:9000",
access_key="4Kj6Q3rWIrab0PVHGQLh",
secret_key="j980yntyJFvGQuvBC6ItSmeGpA0O3usxSmzHFvG8",
secure=False
)
buckets = client.list_buckets()
for bucket in buckets:
print(bucket.name)
root@DESKTOP-SCOK45O:~# python3 mybucket.py
myjobskill
ubuntu@DESKTOP-SCOK45O:~$ mc alias set local http://localhost:9000 admin admin123
Added `local` successfully.
ubuntu@DESKTOP-SCOK45O:~$ mc admin policy list local
writeonly
consoleAdmin
diagnostics
readonly
readwrite
docker logs minio --tail 50
journalctl -u minio --no-pager --lines=50