웹 개발에서 가장 쉽게 적용할 수 있는 이미지 저장 공간이라고 하면 보통 AWS의 S3를 떠올릴 것이다.
AWS를 사용할 때는 좋지만, AWS를 사용하지 못하는 환경이 되거나 온 프레미스 환경에서 이미지 저장을 하고자 하면 기존에 S3를 사용하는 코드를 수정해야 하고, 이미지 저장에 대한 아키텍처 구성을 새로 해야 한다.
이번에 소개할 minio를 사용하면 기존의 S3에서 사용했던 코드를 그대로 사용하며 S3의 기능을 사용할 수 있다.
이번 포스팅엔 이전에 설치한 Xpenology에 MinIO를 설치해 볼 것이다.
MinIO는 S3와 완벽한 호환을 갖춘 객체 저장소로 S3에서 사용했던 기능과 외부 API를 모두 호환해 사용 가능하다.
MinIO는 간편함과 고성능 그리고 쿠버네티스와의 호환을 자랑으로 하고 있으며, 다운로드 한 후 별다른 설정 없이 구성을 할 수 있다는 것이 큰 장점이다.
클라이언트에서 이미지를 보기 위해선 다운로드를 진행한 뒤 이미지가 출력 된다.
이런 파일들은 API 서버에 직접 저장하지 않고 외부 저장 공간에 저장한 후, 저장 공간의 주소를 DB에 저장한다.
클라이언트에서 이미지를 요청하면 API 서버는 저장 공간의 주소를 반환하고, 클라이언트는 해당 주소를 통해 이미지를 다운로드한 뒤 화면에 출력한다.
API 서버에서 이미지를 바로 반환하지 않는 이유는
이외에도 객체 저장소는 파일별 버전을 매겨, 수정되기 전 파일로 돌아갈 수 있거나, 스냅샷을 통해 이전 상태로 돌아갈수 있는 등 많은 기능을 지원한다.
데이터 저장 공간을 구역화하기 위해서 이전에 설치한 Xpenology에 MinIO를 설치할 것이다.
Synology는 Docker 컨테이너를 지원해 MinIO를 쉽게 설치할 수 있다.
Synology에서 컨테이너를 사용하기 위해선 패키지 센터에서 Container Manager를 설치해야 한다.
Synology 버전이 7.1 이하인 경우에는 Docker를 검색해 설치해 준다.
설치 후 Container Manager의 레지스트리에 진입해 MinIO를 검색 후 latest 태그를 가진 MinIO docker 이미지를 다운로드한다.
MinIO 이미지가 정상적으로 다운로드 된 모습이다.
MinIO를 Synology에 설치하지 않을 경우엔 관련 세팅을 ubuntu나 로컬 PC에 세팅 후 설치를 진행하면 된다.
MinIO 컨테이너를 만들 차례다.
컨테이너 탭에서 생성 아이콘을 클릭해 컨테이너 생성을 시작한다.
이미지는 MinIO 이미지를 선택하고 컨테이너 이름을 정해준다.
컨테이너가 비정상적으로 종료될 때를 대비해 자동 재시작 활성화 또한 ON을 하고 다음으로 넘어간다.
포트는 9000, 9090번 2개의 포트를 포워딩 해준다. 9000번 포트는 API를 사용하는 포트, 9090번 포트는 웹 UI 용 포트다.
볼륨은 Minio의 데이터를 저장할 로컬 볼륨에 /data
를 매핑 시켜준다.
환경 변수엔 MINIO_ROOT_USER
, MINIO_ROOT_PASSWORD
두 개의 환경 변수를 추가해 준다. 추후 해당 ID와 PW로 MinIO의 Web UI에 접근할 수 있다.
그 후 화면을 아래로 스크롤 해 실행 명령에 아래 내용을 붙여 넣고 다음으로 진행한다.
minio server /data --console-address :9090
설정을 모두 마치면 MinIO 컨테이너가 정상적으로 동작하는 모습을 볼 수 있다.
MinIO 컨테이너가 동작하는 것을 확인한 후 브라우저에서 MinIO가 설치된 PC의 9090번 포트로 진입한다. ( 로컬 PC에 설치했을 경우 localhost:9090
)
MinIO 환경 변수에 설정한 ID와 PW를 입력해 메인화면을 진입한다.
버킷은 객체 저장소의 파일을 담기 위한 공간이다.
버킷은 각자의 권한과 정책을 가지고 있어 원하는 대로 사용이 가능하다.
버킷을 만들기 위해선 메인 화면에서 Create a Bucket를 클릭해 버킷 생성을 진행한다.
버킷 네임을 지정해 준 뒤, 하단에 버킷의 기능을 정할 수 있다.
Versioning은 파일에 버전을 지정해 여러 버전의 파일을 하나의 저장소에서 저장할 수 있다.
Object Locking은 파일이 삭제되는 것을 방지하며 Quota는 저장소의 용량 제한을 설정할 수 있다.
생성된 버킷은 현재 저장된 용량을 확인할 수 있고, 아무것도 저장하지 않았기 때문에 Usage가 0.0B로 표시된 것을 볼 수 있다.
MinIO를 설치하는 이유는 API에서 파일 업로드를 하는 이유가 대부분이다.
외부 API에서 MinIO를 호출하기 위해선 액세스 키와 시크릿 키가 필요하다.
좌측 탭에서 Access Keys 메뉴에서 Create access key 버튼을 통해 액세스 키를 생성한다.
키를 생성하면 Access Key와 Secret Key가 나오게 되는데 Secret Key의 경우는 이 화면을 벗어나면 확인할 수 없기 때문에 다른 곳에 기록해 둔다.
로컬 PC에 설치하기 때문에 리전의 개념이 없지만, MinIO를 호출하는 API의 경우 리전을 요구하기 때문에 필수적으로 설정해준다.
어느 리전을 해도 상관 없지만, 서울 리전인 ap-northeast-2
를 설정해 줬다.
리전을 설정했다면, 서버를 재시작 해야 설정이 완료된다.
마지막으로 외부에서 SSL 접속을 위한 리버스 프록시를 설정해 준다.
MinIO를 이용한 이미지 업로드는 기존에 AWS-SDK 라이브러리를 사용했다면 라이브러리는 그대로 사용하고, 엔드 포인트와 s3ForcePathStyle을 추가해준다.
그 후 S3에 사용하는 것과 동일하게 이미지를 업로드하면, 링크를 반환받으며 해당 링크로 접속 시 이미지를 다운로드할 수 있다.
업로드한 이미지 또한 버킷에 저장된 것을 볼 수 있다.