S3FS를 이용한 OCI Object Storage 파일 시스템 마운트

S3FS를 이용한 OCI Object Storage 파일 시스템 마운트

클라우드 서비스에서 데이터를 관리하는 핵심 저장소는 Object Storage입니다. OCI(Oracle Cloud Infrastructure)는 Object Storage에 파일을 저장하고 사용하는 다음과 같은 인터페이스를 제공합니다.

  • OCI Console의 UI: OCI 웹 사이트
  • REST API
  • OCI SDK: Java, Python, Ruby, Go
  • CLI 툴: OCI CLI

이러한 인터페이스는 애플리케이션에서 Object Storage에 저장된 파일을 접근하거나 자동화 프로세스에서 Object Storage를 사용하는 경우에는 효과적입니다. 반면, 이 인터페이스를 사람이 사용하는 것은 상당히 불편합니다. 일반 사용자에게는 Object Storage를 파일 시스템에 마운트하는 방식이 가장 효율적입니다. FUSE 모듈을 이용하면 Object Storage를 파일 시스템에 마운트 할 수 있습니다. 리눅스와 맥에서 FUSE 모듈을 이용하면 OCI Object Storage 버킷을 일반 디렉터리 처럼 사용할 수 있습니다. 이 문서는 리눅스와 Mac OS X에 OCI Object Storage 버킷을 마운트하는 방법을 소개합니다.

Linux Fuse

파일시스템을 개발하기 위해서는 리눅스 커널 개발이 필요합니다. 리눅스 커널을 직접 편집하는 파일 시스템 개발은 매우 복잡합니다. FUSE를 이용하면 사용자 커널 코드를 편집하지 않고 새로운 파일 시스템을 만들수 있습니다. 물론 FUSE 모듈의 편리한 개발 댓가로 20-30% 성능 저하가 발생합니다. FUSE는 Filesystem in USEr space의 약자입니다. FUSE 모듈은 파일 시스템을 구현한 코드가 User Space(유저 스페이즈)에서 실행될 수 있도록 커널 인터페이스와 User Space를 연결하는 브릿지 역할을 담당합니다.FUSE는 리눅스를 비롯해, Mac OS X, 윈도우즈, 솔라리스에서 사용 가능합니다.

- 출처: https://cs.wikipedia.org/wiki/Filesystem_in_Userspace

OCI Object Storage를 지원하는 Fuse 모듈을 리눅스 운영체제에 설치하면, OCI Object Storage 버킷을 파일 시스템의 디렉터리로 마운트할 수 있습니다.

s3fs-fuse

OCI Object Storage가 리눅스에 마운트하기 위해서 s3fs-fuse 모듈을 이용합니다. s3fs-fuse는 AWS S3를 지원하는 FUSE 모듈입니다. OCI Object Storage는 S3 호환성을 제공합니다. 따라서 AWS S3용 FUSE 모듈을 OCI Object Storage에 적용할 수 있습니다. s3fs-fuse는 리눅스와 Mac OS X를 지원합니다.

s3fs-fuse의 프로젝트 홈페이지는 https://github.com/s3fs-fuse/s3fs-fuse 입니다.

s3fs-fuse는 yum, apt, brew 패키지 관리툴로 빌드한 이미지를 제공합니다.

s3fs-fuse의 한계

s3fs-fuse를 이용하면 CI Object Storage 버킷을 파일시스템으로 마운트할 수 있습니다. s3fs-fuse의 한계는 다음과 같습니다.

  • Hard Link를 만들 수 없음
  • 하나의 파일에 대한 동시에 여러 클라이언트의 동시 접근을 방지하지 못함

Demo 사전 준비

OCI Object Storage의 버킷을 리눅스와 Mac OS 파일시스템에 디렉터리로 마운트하기 위해서 다음과 같은 준비가 필요합니다.

  1. OCI Object Storage에 버킷 2개 생성
    • demo_bucket01
    • demo_bucket02
  2. s3fs-fuse를 설치할 리눅스
    • 데모를 진행할 리눅스 서버는 OCI VM 인스턴스를 사용합니다.

실습을 진행하기 위해서는 OCI 계정과 OCI Object Storage 버킷을 생성할 Compartment가 필요합니다. OCI 계정이 없거나 실습에 사용할 Compartment가 없다면, 다음 문서를 참조하여 게정을 생성하고 실습에 사용할 Compartment를 미리 만드시기 바랍니다.

1. 사전 준비: OCI Object Storage

OCI Object Storage에 실습에 사용할 2개의 버킷을 만들겠습니다. root 컴파트먼트 아래의 sandbox 컴파트먼트에 2개의 OCI Object Storage Bucket을 생성합니다. Bucket은 OCI Object Storage에서 파일을 보관하고 묶는 최상위 단위입니다. OCI Object Storage에 파일을 저장하기 위해서는 파일을 등록할 2개 Bucket(demo-bucket01, demo-bucket02)를 만듭니다.

OCI Object Storage Bucket를 만들기 위해서, OCI Console에서 다음 메뉴 패스로 Object Storage 관리 페이지로 이동합니다.

  • OCI 햄버그 아이콘 >> Object Storage >> >> Object Storage >> sanbox Compartment 선택 >> Create Bucket 버튼 클릭

Object Storage 관리 페이지에서 sanbox Compartment를 선택하고 Create Bucket 버튼 클릭하면 다음 이미지와 같이 bucket 생성 폼이 출력됩니다. 다음 그림과 같이 demo_bucket01, demobucket02 2개의 버킷을 만듭니다.

Object Storage 관리 페이지의 sanbox Compartment 아래에 다음 이미지와 같이 2개 버킷을 만듭니다.

2. 사전 준비: 리눅스 인스턴스

데모를 진행할 리눅스 인스턴스를 만듭니다. OCI 리눅스 VM를 다음 문서를 참조하여 만듭니다.

위 문서를 참조하고 다음 테이블의 값을 사용해서 OCI 리눅스 VM을 만듭니다.

설정 항목 설정 값 설명
VM 생성 Compartment sandbox
Name your instance demo_linux_vm
Choose an operating system or image source Oracle Linux 7.7
Availability Domain AD 1
Instance Type Virtual Box
Instance Shape VM.Standard2.1 (Virtual Machine) Shape 선택은 자유롭습니다. 이용 가능한 Shape을 자유롭게 선택하시기 바랍니다.
Virtual cloud network compartment sandbox
Virtual cloud network demo-vcn
Subnet compartment sandbox
Subnet Public Subnet-demo-vcn
Assign a public IP address 체크 공개 IP를 설정하기 위해서 체크
Choose SSH Key file 체크 아래 Choose Files를 클릭하고 미리 준비한 id_rsa.pub 파일을 업로드

위 테이블의 설정값을 입력한 실제 입력 폼은 다음 링크에서 확인할 수 있습니다.

Oracle Linux VM이 만들어지면, 다음과 같이 Public IP로 서버에 접근할 수 있습니다. 아래 이미지와 같이 ssh 접근이 가능다하면 Linux 서버 준비는 완료됐다고 판단할 수 있습니다.

s3fs-fuse 설치

s3fs-fuse는 간편한 설치를 돕는 다양한 Package Manager를 운영체제 별로 지원합니다. 운영 체제 별로 다음과 같이 설치할 수 있습니다.

1. Mac OS X에 설치

brew cask install osxfuse
brew install s3fs

Mac OS X에서는 다음과 같이 설치됩니다.

2. Oracle Linux 7 설치

Oracle Linux 7.x에서는 다음과 같은 명령으로 s3fs-fuse를 설치합니다.

sudo yum install -y s3fs-fuse

Oracle Linux VM에서 위 명령을 실행하면 다음과 같이 실행됩니다.

3. 다른 리눅스에 s3fs-fuse 설치

다른 리눅스 패키지의 설치 방법은 다음과 같습니다.

  • RHEL/CentOS 7.X
sudo yum install epel-release
sudo yum install s3fs-fuse
  • Debian / Ubuntu
sudo apt install s3fs

s3fs-fuse 설정

이제 s3fs-fuse를 설정하기 위해서는 다음과 같은 정보가 필요합니다.

  • Tenancy 명
  • OCI 리전 ID
  • OCI 사용자 Customer Secret Key와 Access key
  • Object Storage 버킷 명

각 정보를 확인하는 방법을 정리합니다.

1. Tenancy 명

현재 사용하는 Tenancy 명은 OCI Consle의 오른쪽 위의 사용자 프로파일에서 확인할 수 있습니다.

위 이미지에서 Tenancy명은 apackrsct01 입니다.

2. OCI 리전 ID

현재 사용하는 OCI 리전 이름은 OCI Consle의 오른쪽 위 메뉴에서 확인할 수 있습니다.

위 이미지에서 현재 사용중인 리전은 Ashburn입니다. Ashburn 리전의 리전 ID는 다음 페이지에서 확인할 수 있습니다.

위 참조 페이지에서 Ashburn 리전의 Region ID가 us-ashburn-1이라는 것을 확인할 수 있습니다.

3. OCI 사용자 Customer Secret Key와 Access Key

OCI Consle의 오른쪽 위의 사용자 프로파일에서 OCI 사용자 관리 페이지로 이동할 수 있습니다. OCI 사용자 관리 페이지의 왼쪽 하단 메뉴에서 Customer Secret Key 메뉴를 통해서 Secret Key를 생성하는 페이지로 이동합니다.

Secret Key를 생성하는 페이지에서 “Generate Secret Key” 버튼을 클릭하고, 이름이 “for s3fs“를 설정한 다음에 Secret Key를 생성합니다. 여기에서 만든 Secret key는 Copy링크로 복사할 수 있습니다. 그리고 팝업 창을 닫으면 Secret Key를 확인할 수 없습니다.

앞에서 만든 Secret key는 다음과 같은 형태를 갖습니다.

gftWSxfCfmTdsBDDqUqyPPEXJSYXX2OGKdpxNkhlAYU=

Secret Key 생성 팝업을 닫으면 Custom Secret Keys 블록에서 Secret Key 목록을 확인할 수 있습니다. 이 목록에서는 Secret Key를 다시 확인할 수는 없습니다. 단지, Secret Key에 대한 Access Key만을 확인할 수 있습니다.

위 이미지와 같이 “for s3fs“의 Secret Key에 대한 Access Key는 다음과 같은 형태를 갖습니다.

8fd53118140f9f0b2b6599aa9547e5102479b550

Object Storage 버킷 명

실습에 사용할 Object Storage 명은 다음과 같습니다.

  • demo_bucket01
  • demo_bucket02

s3fs-fuse 설정

OCI Object Storage를 마운트하는 s3fs-fuse 설정은 다음과 같은 단계로 진행됩니다.

  1. 인증 파일 만들기
    • 파일명: ~/.s3fs-password
  2. Mount Point 디렉터리 만들기
    • ~/oci-fs/demo_bucket01
    • ~/oci-fs/demo-bucket02
  3. 두 Bucket을 2번 디렉터리에 각각 마운트

s3fs-fuse로 OCI Object Storage를 마운트하는 단계에서 Linux와 Mac OS X의 설정 과정이 동일합니다. 설정 과정이 같기 때문에 Linux를 기준으로 설명하겠습니다.

1. 인증 파일 만들기

s3fs-fuse가 사용하는 인증 파일이 필요합니다. 실습에서 사용할 인증 파일명은 ~/.s3fs-password입니다. 인증 파일에는 : 형식의 인증 정보가 기록됩니다. 인증 파일에 앞에서 수집한 정보를 다음과 같은 형태로 저장합니다.

# <access key>:<secret key>
8fd53118140f9f0b2b6599aa9547e5102479b550:gftWSxfCfmTdsBDDqUqyPPEXJSYXX2OGKdpxNkhlAYU=

인증 파일의 퍼미션은 600으로 설정합니다. 앞에서 만든 Oracle Linux 7 VM 인스턴스에 다음과 같이 설정 됩니다.

[opc@demo-linux-vm ~]$ cat ~/.s3fs-password
#<access key>:<secret key>
8fd53118140f9f0b2b6599aa9547e5102479b550:gftWSxfCfmTdsBDDqUqyBBEXJSY1U2OGKdpxNkhlAYU=

[opc@demo-linux-vm ~]$ chmod 600 ~/.s3fs-password
[opc@demo-linux-vm ~]$ ls -al ~/.s3fs-password
-rw-------. 1 opc opc 114  2월 29 11:25 /home/opc/.s3fs-password
[opc@demo-linux-vm ~]$

Mac OS X에서도 위와 같은 방식으로 인증 파일이 설정됩니다.

2. Mount Point 디렉터리 만들기

Object Storage 2개 버킷을 마운트할 디렉터리를 다음과 같이 만듭니다.

[opc@demo-linux-vm ~]$ mkdir -p ~/oci-fs/demo_bucket01
[opc@demo-linux-vm ~]$ mkdir -p ~/oci-fs/demo_bucket02
[opc@demo-linux-vm ~]$ ls -al ~/oci-fs/
합계 4
drwxrwxr-x. 4 opc opc   48  2월 29 11:29 .
drwx------. 6 opc opc 4096  2월 29 11:29 ..
drwxrwxr-x. 2 opc opc    6  2월 29 11:29 demo_bucket01
drwxrwxr-x. 2 opc opc    6  2월 29 11:29 demo_bucket02
[opc@demo-linux-vm ~]$

3. Bucket 마운트

리눅스에서 s3fs 명령을 실행하여 2개 object storage 버킷을 마운트하는 과정을 정리합니다. s3fs 명령을 실행하기 전에 s3fs가 접근할 Object Storage의 Region API Endpoint를 확정해야 합니다. OCI Object Storage의 Region API Endpoint 패턴은 다음과 같습니다.

https://<tenancy>.compat.objectstorage.<region id>.oraclecloud.com

앞에서 조사한 Tenancy 명과 Region ID로 만든 Region API Endpoint는 다음과 같습니다.

https://apackrsct01.compat.objectstorage.us-ashburn-1.oraclecloud.com

다음 두 명령을 실행하여 demo_bucket01 버킷과 demo_bucket02 버킷을 ~/oci-fs/demo_bucket01과 ~/oci-fs/demo_bucket02 디렉터리에 각각 마운트 합니다.

  • demo_bucket01 마운트 명령
sudo s3fs demo_bucket01 $HOME/oci-fs/demo_bucket01 \
-o passwd_file=$HOME/.s3fs-password \
-o url=https://apackrsct01.compat.objectstorage.us-ashburn-1.oraclecloud.com/ \
-o allow_other  \
-o nomultipart -o use_path_request_style
  • demo_bucket02 마운트 명령
sudo s3fs demo_bucket02 $HOME/oci-fs/demo_bucket02 \
-o passwd_file=$HOME/.s3fs-password \
-o url=https://apackrsct01.compat.objectstorage.us-ashburn-1.oraclecloud.com/ \
-o allow_other  \
-o nomultipart -o use_path_request_style

리눅스 인스턴스에서 train.csv 파일을 다운로드하고 demo_bucket01 버킷에 파일을 복사하여 업로드하는 작업을 다음과 같이 수행합니다.

  1. wget으로 train.csv 파일 다운로드
  2. oci object storage의 demo_bucket01 버킷을 마운트한 디렉터리에 파일 복사
  3. 2개 버킷 목록 조회
[opc@demo-linux-vm ~]$ wget https://raw.githubusercontent.com/nybbles/kaggle/master/train.csv
--2020-02-29 11:49:14--  https://raw.githubusercontent.com/nybbles/kaggle/master/train.csv
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 199.232.64.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|199.232.64.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 57726 (56K) [text/plain]
Saving to: ‘train.csv’

100%[=======================================================================>] 57,726      --.-K/s   in 0.002s

2020-02-29 11:49:14 (28.6 MB/s) - ‘train.csv’ saved [57726/57726]

[opc@demo-linux-vm ~]$ ls -al ./train.csv
-rw-rw-r--. 1 opc opc 57726  2월 29 11:49 ./train.csv
[opc@demo-linux-vm ~]$ cp ./train.csv ~/oci-fs/demo_bucket01
[opc@demo-linux-vm ~]$ ls -alR ~/oci-fs/
/home/opc/oci-fs/:
합계 5
drwxrwxr-x. 4 opc  opc    48  2월 29 11:29 .
drwx------. 6 opc  opc  4096  2월 29 11:49 ..
drwxrwxrwx. 1 root root    0  1월  1  1970 demo_bucket01
drwxrwxrwx. 1 root root    0  1월  1  1970 demo_bucket02

/home/opc/oci-fs/demo_bucket01:
합계 57
drwxrwxrwx. 1 root root     0  1월  1  1970 .
drwxrwxr-x. 4 opc  opc     48  2월 29 11:29 ..
-rw-rw-r--. 1 opc  opc  57726  2월 29 11:49 train.csv

/home/opc/oci-fs/demo_bucket02:
합계 1
drwxrwxrwx. 1 root root  0  1월  1  1970 .
drwxrwxr-x. 4 opc  opc  48  2월 29 11:29 ..
[opc@demo-linux-vm ~]$

OCI Object Storage의 demo_bucket01 버킷을 마운트한 디렉터리에 cp 명령으로 복사한 파일(train.csv)은 OCI Console에서 확인할 수 있습니다.

이 설정을 Mac OS X에 적용하여 Object Storage 버킷을 디렉터리로 마운트하면, 다음 이미지와 같이 터미널과 Finder로 버킷을 접근할 수 있습니다.

현재 Mac OS X 버전의 s3fs-fuse는 리눅스 버전 s3fs-fuse에 비교하여 성능이 상당히 떨어집니다. 크기가 작은 여러 파일을 s3fs-fuse로 마운트한 디렉터리에 복사하는 작업은 현실적으로 불가능합니다.

Object Storage 마운트 포인트 제거

Object Storage 마운트를 제거하는 명령은 다음과 같습니다.

sudo fusermount -u <mount_point>

참고자료

김태완 avatar
작성자: 김태완
1999년 부터 Java, Framework, Middleware, SOA, DB Replication, Cache, CEP, NoSQL, Big Data, Cloud를 키워드로 살아왔습니다. 현재는 빅데이터와 Machine Learning을 중점에 두고 있습니다.
E-mail: taewanme@gmail.com

이 저작물은 Oracle과 관계없이 개인으로서 개인의 시간을 할애하여 작성된 글 입니다. 본 글의 내용, 입장, 예측은 Oracle을 공식적으로 절대 대변하지 않습니다.