일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- network
- 재테크
- namespace
- built-in
- mininet
- S3
- AWS
- MongoEngine
- 후기
- 포인트앱
- 리뷰
- MongoDB
- Container
- 앱테크
- 토스카드
- aws codecommit
- DocumentDB
- 하나머니
- VPC
- docker network
- 실사용
- 리워드앱
- clone
- Linux
- 도커
- python3
- codecommit
- Python
- docker
- 커피머니불리기
- Today
- Total
ㅍㅍㅋㄷ
s3fs를 이용해 AWS S3 mount 해서 사용하기 본문
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에서도 확인 가능하다.
'IT > AWS' 카테고리의 다른 글
AWS CodeCommit 어렵지 않아요 (3) | 2016.05.13 |
---|---|
AWS Storage Gateway 설치 (0) | 2016.04.28 |
AWS Storage Gateway (0) | 2016.04.27 |
goofys를 이용해 AWS S3 mount 해서 사용하기 (1) | 2016.04.27 |
AWS 보안강화 - 콘솔 접속시 OTP 적용하기 : AWS MFA (0) | 2015.07.01 |