내 컴퓨터에 S3 설치하기 - MinIO

Pien·2023년 11월 6일
0

home-server

목록 보기
7/7
post-thumbnail

웹 개발에서 가장 쉽게 적용할 수 있는 이미지 저장 공간이라고 하면 보통 AWS의 S3를 떠올릴 것이다.
AWS를 사용할 때는 좋지만, AWS를 사용하지 못하는 환경이 되거나 온 프레미스 환경에서 이미지 저장을 하고자 하면 기존에 S3를 사용하는 코드를 수정해야 하고, 이미지 저장에 대한 아키텍처 구성을 새로 해야 한다.
이번에 소개할 minio를 사용하면 기존의 S3에서 사용했던 코드를 그대로 사용하며 S3의 기능을 사용할 수 있다.
이번 포스팅엔 이전에 설치한 Xpenology에 MinIO를 설치해 볼 것이다.

MinIO

MinIO는 S3와 완벽한 호환을 갖춘 객체 저장소로 S3에서 사용했던 기능과 외부 API를 모두 호환해 사용 가능하다.
MinIO는 간편함과 고성능 그리고 쿠버네티스와의 호환을 자랑으로 하고 있으며, 다운로드 한 후 별다른 설정 없이 구성을 할 수 있다는 것이 큰 장점이다.

객체 저장소를 쓰는 이유

클라이언트에서 이미지를 보기 위해선 다운로드를 진행한 뒤 이미지가 출력 된다.
이런 파일들은 API 서버에 직접 저장하지 않고 외부 저장 공간에 저장한 후, 저장 공간의 주소를 DB에 저장한다.
클라이언트에서 이미지를 요청하면 API 서버는 저장 공간의 주소를 반환하고, 클라이언트는 해당 주소를 통해 이미지를 다운로드한 뒤 화면에 출력한다.

왜 이런 식으로 이미지를 주는 것일까? API 서버에서 응답 값으로 이미지를 주면 편하지 않을까?

API 서버에서 이미지를 바로 반환하지 않는 이유는

  1. API 서버의 용량보다 객체 저장소의 용량이 저렴하다.
  2. API 서버에 이미지를 저장할 경우 scale-out 시 다른 컴퓨터에 있는 이미지를 가져오기 힘들다.
  3. API 서버의 부하가 줄어들어 유지비가 줄어든다.

이외에도 객체 저장소는 파일별 버전을 매겨, 수정되기 전 파일로 돌아갈 수 있거나, 스냅샷을 통해 이전 상태로 돌아갈수 있는 등 많은 기능을 지원한다.

Synology 세팅

데이터 저장 공간을 구역화하기 위해서 이전에 설치한 Xpenology에 MinIO를 설치할 것이다.
Synology는 Docker 컨테이너를 지원해 MinIO를 쉽게 설치할 수 있다.

Synology에서 컨테이너를 사용하기 위해선 패키지 센터에서 Container Manager를 설치해야 한다.
Synology 버전이 7.1 이하인 경우에는 Docker를 검색해 설치해 준다.

설치 후 Container Manager의 레지스트리에 진입해 MinIO를 검색 후 latest 태그를 가진 MinIO docker 이미지를 다운로드한다.

MinIO 이미지가 정상적으로 다운로드 된 모습이다.

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 컨테이너가 동작하는 것을 확인한 후 브라우저에서 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 업로드

MinIO를 이용한 이미지 업로드는 기존에 AWS-SDK 라이브러리를 사용했다면 라이브러리는 그대로 사용하고, 엔드 포인트와 s3ForcePathStyle을 추가해준다.

그 후 S3에 사용하는 것과 동일하게 이미지를 업로드하면, 링크를 반환받으며 해당 링크로 접속 시 이미지를 다운로드할 수 있다.

업로드한 이미지 또한 버킷에 저장된 것을 볼 수 있다.

0개의 댓글