MinIO 는 S3 API 를 그대로 쓰므로 S3 용 클라이언트가 다 통한다. 아래는 서명을 직접 만드는 curl, MinIO 공식 minio 라이브러리, AWS SDK 인 boto3 세 가지 예다. 값은 실제 테스트 환경의 기록이다.
bucket=test
file=orders.json
host=vminio01.encore.encore:9000
s3_key='encore'
s3_secret='${REDACTED}'
resource="/${bucket}/${file}"
content_type="application/octet-stream"
date=`date -R`
_signature="GET\n\n${content_type}\n${date}\n${resource}"
signature=`echo -en ${_signature} | openssl sha1 -hmac ${s3_secret} -binary | base64`
curl -v -X GET \
-H "Host: $host" \
-H "Date: ${date}" \
-H "Content-Type: ${content_type}" \
-H "Authorization: AWS ${s3_key}:${signature}" \
http://$host${resource}
## 결과
{"id":1,"amount":1000}
{"id":2,"amount":2000}
pip install minio 로 설치한다.
from minio import Minio
#from minio.error import ResponseError
minioClient = Minio('vminio01.encore.encore:9000', # ip:port or URL
access_key='${REDACTED}',
secret_key='${MASKED}',
secure=False)
minioClient.list_buckets()
## 결과
[Bucket('gtc'),
Bucket('gtc-new'),
Bucket('harbor'),
Bucket('orders'),
Bucket('test')]
boto3 는 AWS SDK 다. endpoint_url 에 MinIO 주소를 주면 그대로 쓸 수 있다.
import boto3
s3 = boto3.resource(
's3',
endpoint_url='http://vminio01.encore.encore:9000',
aws_access_key_id='${REDACTED}',
aws_secret_access_key='PyN51DsBKy3gHp8jCu4PicRsd3HUVPmhHMLsBG9c',
)
# 업로드: 로컬 파일을 버킷 'test' 에 'orders1.json' 으로
s3.Bucket('test').upload_file('/home/encore/hgkim/orders.json', 'orders1.json')
# 다운로드
s3.Bucket('test').download_file('orders.json', '/home/encore/hgkim/orders.json')
# 목록
bucket = s3.Bucket('test')
for obj in bucket.objects.all():
print(obj.key)
## 결과
bcrport.parquet/_SUCCESS
bcrport.parquet/part-00000-36b52361-f2ea-4562-b726-04b254c51d72-c000.snappy.parquet
bcrport.parquet/part-00001-36b52361-f2ea-4562-b726-04b254c51d72-c000.snappy.parquet
bcrport.parquet/part-00002-36b52361-f2ea-4562-b726-04b254c51d72-c000.snappy.parquet
bcrport.parquet/part-00003-36b52361-f2ea-4562-b726-04b254c51d72-c000.snappy.parquet
orders.json
orders1.json
test.parquet/_SUCCESS
test.parquet/part-00000-a38a371c-d19c-436b-85a9-8f9daa94a4ee-c000.snappy.parquet