ㅍㅍㅋㄷ

s3fs를 이용해 AWS S3 mount 해서 사용하기 본문

IT/AWS

s3fs를 이용해 AWS S3 mount 해서 사용하기

클쏭 2016. 4. 26. 17:54

s3fs를 이용해 AWS S3 mount 해서 사용하기




S3는 AWS 라인업 중 가장 유용한 서비스 중 하나라고 생각한다. 

하지만 S3 자체가 일반적인 파일 시스템과는 좀 다른 object 기반이기도 하고 REST http 기반이다 보니 사용성에서 약간의 불편함을 느낄 수 있다. 


그래서 최근에는 Storage Gateway 라는 서비스도 출시하며, S3를 iscsi 형태로 제공하도록 appliance를 직접 제공하기도 한다. 


하지만 Storage Gateway를 설정하여 사용하려면, Local IDC 환경 또는 AWS에 Gateway appliance 를 VM형태로 올려야 하기 때문에 추가 비용이 들고 

간단히 사용하기엔 번거롭기도 하다. 


이때 간단한 해결책으로 S3를 filesystem 처럼 mount 하여 사용하는 방법이 즐겨 쓰이곤 한다. 

이중 가장 널리 쓰이는 backend package 중 하나가 FUSE 기반의 s3fs 이다. 


물론 opensource 이며, AWS에서 정식 지원하는 패키지는 아니다. 

github : https://github.com/s3fs-fuse/s3fs-fuse


한가지 주의할 점은 

"성능이 엄청 느리다."


이 부분은 각오해야 한다. 

public network을 통해 데이터가 전달되기 때문에 당연히 network 환경에 따라 성능에 상당한 영향을 받으며, 

FUSE 기반이다 보니 kernel level에서 처리되는 file system 보다 성능상 떨어질 수 밖에 없다.


근데 그걸 감안 하더라도 너무 느리다... ㅠㅠ 


IO가 빈번한 환경인 경우, mount가 떨어져 나가는 현상도 경험할 수 있으니 이런 상황에서는 사용을 포기하는게 건강에 좋다.

성능이 좀 더 낫다고 주장하는 패키지인 goofys 도 있으니 옆 링크 참고. ( goofys를 이용해 AWS S3 mount해서 사용하기 )





prerequisite



1. 서버에서 s3fs를 통해 mount하려면, S3를 이용하기 위한 access/secret key가 필요하다. 

   

   먼저 s3 이용을 위한 user를 생성해보자.

   security credentials 메뉴로 이동.

   



User 메뉴에서 s3_user를 생성

   


  user를 생성하면 access key와 secret key가 나오니 이걸 잘 기록해두자.

  root 계정의 access key를 이용할수도 있지만, 털리면 위험하니 따로 생성해서 이용하는게 좋다.

 



  해당 user의 permissions 탭에서 policy를 적용한다.

  S3에 access 할수 있는 권한을 주자.


   Attach Policy 클릭

  

    

   적용할 policy를 검색할 수 있는데 Filter에 S3 입력하면 아래와 같이 AmazonS3FullAccess 라는 policy를 찾을 수 있다. 이걸 선택하여 적용하자.

  


    적용 완료 ㅋ

  



2. S3로 연결할 bucket을 생성한다. 

   테스트로 bucket 이름을 s3fs-test-01 로 생성했다. 






Installation


CentOS 기준으로 설명한다.


1. Package 설치


root@~~# yum install automake fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel



 

2. s3fs 설치


git 을 통해 source를 받는다. 


root@~~# git clone https://github.com/s3fs-fuse/s3fs-fuse.git

's3fs-fuse'에 복제합니다...

remote: Counting objects: 2912, done.

remote: Compressing objects: 100% (2/2), done.

remote: Total 2912 (delta 0), reused 0 (delta 0), pack-reused 2910

오브젝트를 받는 중: 100% (2912/2912), 1.72 MiB | 312.00 KiB/s, 완료.

델타를 알아내는 중: 100% (1985/1985), 완료.

연결을 확인하는 중입니다...완료.


autogen.sh 실행후..


root@~~# cd s3fs-fuse/

root@ s3fs-fuse # ./autogen.sh 

--- Make commit hash file -------

--- Finished commit hash file ---

--- Start autotools -------------

configure.ac:26: installing './config.guess'

configure.ac:26: installing './config.sub'

configure.ac:27: installing './install-sh'

configure.ac:27: installing './missing'

src/Makefile.am: installing './depcomp'

parallel-tests: installing './test-driver'

--- Finished autotools ----------

root@ s3fs-fuse #


configure 뙇


root@ s3fs-fuse # ./configure

checking build system type... x86_64-unknown-linux-gnu

checking host system type... x86_64-unknown-linux-gnu

checking target system type... x86_64-unknown-linux-gnu

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for a thread-safe mkdir -p... /bin/mkdir -p

checking for gawk... gawk

checking whether make sets $(MAKE)... yes

checking whether make supports nested variables... yes

checking for g++... g++

... (중략)


make install !


root@ s3fs-fuse# make

make  all-recursive

make[1]: Entering directory `/home/ec2-user/s3fs-fuse'

Making all in src

make[2]: Entering directory `/home/ec2-user/s3fs-fuse/src'

g++ -DHAVE_CONFIG_H -I. -I..  -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -I/usr/include/libxml2      -g -O2 -Wall -D_FILE_OFFSET_BITS=64 -MT s3fs.o -MD -MP -MF .deps/s3fs.Tpo -c -o s3fs.o s3fs.cpp

mv -f .deps/s3fs.Tpo .deps/s3fs.Po

g++ -DHAVE_CONFIG_H -I. -I..  -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -I/usr/include/libxml2      -g -O2 -Wall -D_FILE_OFFSET_BITS=64 -MT curl.o -MD -MP -MF .deps/curl.Tpo -c -o curl.o curl.cpp

mv -f .deps/curl.Tpo .deps/curl.Po

g++ -DHAVE_CONFIG_H -I. -I..  -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -I/usr/include/libxml2      -g -O2 -Wall -D_FILE_OFFSET_BITS=64 -MT cache.o -MD -MP -MF .deps/cache.Tpo -c -o cache.o cache.cpp

mv -f .deps/cache.Tpo .deps/cache.Po

g++ -DHAVE_CONFIG_H -I. -I..  -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -I/usr/include/libxml2      -g -O2 -Wall -D_FILE_OFFSET_BITS=64 -MT string_util.o -MD -MP -MF .deps/string_util.Tpo -c -o string_util.o string_util.cpp

mv -f .deps/string_util.Tpo .deps/string_util.Po

...  (중략)


설치 끝. 쉽다. 





Configuration


1. AWS access key / secret key 를 파일에 설정

   해당 key는 위에서 생성한 s3_user 계정의 key를 이용하자. 

   

  key 정보 파일의 default path는 /etc/passwd-s3fs 이다. 


root@~~ # echo YOURACCESSKEY:YOURSECRETKEY > /etc/passwd-s3fs



2. 해당 파일의 permission을 600으로 설정


root@~~ # chmod 600 /etc/passwd-s3fs



3. mount directory 생성


root@~~ # mkdir -p /s3fs



4. s3fs 로 mount 설정


소스 컴파일로 설치시 s3fs 명령 파일은 /usr/local/bin 에 있다.

s3fs로 S3 bucket을 mount 시켜보자.

예제로 bucket명은 s3fs-test-01 이고 mount path 는 /s3fs 이다.

  

root@~~# /usr/local/bin/s3fs s3fs-test-01 /s3fs


mount 잘 되었는지 확인해 보자.


root@~~# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/xvda1      7.8G  1.2G  6.6G  15% /

devtmpfs        490M   60K  490M   1% /dev

tmpfs           498M     0  498M   0% /dev/shm

s3fs            256T     0  256T   0% /s3fs


위와 같이 /s3fs 디렉토리에 잘 마운트 된 것을 볼 수 있다.

테스트로 file을 써보자.


root@~~# touch /s3fs/test001

root@~~# ls -al /s3fs/

합계 5

drwx------  1 root root    0  1월  1  1970 .

dr-xr-xr-x 26 root root 4096  4월 26 09:38 ..

-rw-r--r--  1 root root    0  4월 26 09:45 test001


잘 생성되어 있음을 확인할 수 있다. 

AWS management console에서도 확인 가능하다.






Comments