– 개요
S3 (Simple Storage Service)는 AWS에서 제공하는 스토리지 서비스로 S3 API를 직접 사용하여 스토리지 기능을 이용하거나 또는 EC2에 직접 마운트하여 사용할 수 있다.
하지만 EC2에 마운트를 하기 위해서는 S3FS를 이용해야 한다.
– S3FS 설치
Ubuntu의 버전에 따라 설치하는 패키지가 아래와 같이 약간 상이하다.
[Ubuntu 14.04 LTS, Ubuntu 14.10]
# 컴파일 관련 패키지 설치 sudo apt-get install build-essential git libfuse-dev libcurl4-openssl-dev libxml2-dev mime-support automake libtool sudo apt-get install pkg-config libssl-dev # 깃으로 S3FS 다운로드 git clone https://github.com/s3fs-fuse/s3fs-fuse # S3FS 설치 cd s3fs-fuse/ ./autogen.sh ./configure --prefix=/usr --with-openssl make sudo make install
[Ubuntu 12.04 LTS, Ubuntu 10.10]
# 컴파일 관련 패키지 설치 sudo apt-get install build-essential libfuse-dev fuse-utils libxml2-dev mime-support automake libtool sudo apt-get install libcurl4-openssl-dev # 깃으로 S3FS 다운로드 git clone https://github.com/s3fs-fuse/s3fs-fuse # S3FS 설치 cd s3fs-fuse/ ./autogen.sh ./configure --prefix=/usr --with-openssl make sudo make install
혹시 make 과정중 ERR 또는 WARN 메시지가 발생했다면 컴파일 관련 패키지가 제대로 설치되지않았을 수 있으니 위의 패키지가 모두 잘 설치되었는지 다시 한번 확인해보기 바란다.
– S3 ACCESS KEY 확인
EC2에 S3를 마운트하기 전에 먼저 AWS에서 S3 생성 후 ACCESS KEY 값을 확인해야 된다. 이를 확인하는 방법은 아래와 같다.
[우측 상단 Welcome to AWS 드랍다운 버튼 클릭 후 Security Credentials 클릭]
[알림창에서 Continue to Security Credentials 클릭]
[Access Keys 부분 클릭]
[아래 Create New Access Key 버튼을 눌러 새 Access Key를 생성]
[Show Access Key 버튼을 눌러 생성된 키를 확인]
위의 순서대로 진행을 하면 Access Key ID, Secret Access Key 두개의 키값을 얻을 수 있다.
단, AWS에서는 이 Secret Access Key를 오직 한번만 보여주기 때문에 두개의 키값을 따로 저장해놓거나 위 그림의 Download Key File 버튼을 눌러 키값이 들어있는 csv파일을 잘 보관해둬야 한다.
참고로 AWS에서는 보안상의 이유로 90일에 한번씩 기존 ACCESS KEY를 파기하고 재생성하여 사용하기를 권장하고 있다.
– S3FS 설정
이제 S3FS에서 S3에 접근할 수 있도록 위에서 알아낸 두 키값을 passwd-s3fs 파일에 입력을 해야된다. Ubuntu에서 아래 명령어를 이용해서 <ACCESS KEY>:<SECRET ACCESS KEY> 형식으로 입력을 해야 한다.
# passwd-s3fs 파일 생성 sudo vi /etc/passwd-s3fs
예를들어 ACCESS KEY 값이 ABC123이고, SECRET ACCESS KEY 값이 aBcD12#4 라면 passwd-s3fs 파일안에 ABC123:aBcD12#4를 입력하면 된다.
생성된 passwd-s3fs 파일의 권한중 전체유저에 대해 읽기 권한이 포함된 상태로 생성이 되었을 것이다. 이 상태로는 보안에 취약하기 때문에 전체유저에 대해서는 읽기 권한을 제거해야 된다. chmod명령어를 이용해 아래와 같이 읽기 권한을 제거해보자.
# 기존 644권한에서 640으로 권한 변경 sudo chmod 640 /etc/passwd-s3fs
마지막으로 S3FS의 환경설정을 해야 된다.
# S3FS 환경설정 파일 열기 sudo vi /etc/fuse.conf
아래와 같이 user_allow_other 주석을 제거해주면 된다.
# /etc/fuse.conf - Configuration file for Filesystem in Userspace (FUSE) # Set the maximum number of FUSE mounts allowed to non-root users. # The default is 1000. mount_max = 1000 # Allow non-root users to specify the allow_other or allow_root mount options. user_allow_other
– S3FS 마운트
이제 환경설정도 끝났고, EC2에 직접 마운트하기만 남았다. 마운트를 하기위한 명령어 구문은 아래와 같다. 각자 상황에 맞게 커스터마이즈해서 명령어를 입력해보자.
# /usr/bin/s3fs [S3 버킷명] [마운트할 경로] # allow_other는 root뿐만아니라 모든 유저의 접근을 허용시켜주는 옵션 # use_cache는 캐싱을 할 경로를 지정하는 옵션 sudo mkdir /mnt/mymountpoint sudo /usr/bin/s3fs mybucketname /mnt/mymountpoint -o allow_other -o use_cache=/tmp
마운트가 잘 되었다면 해당 경로에 S3의 폴더나 파일들이 보일것이다. 위의 명령어대로 입력했다면 /mnt/mymountpoint 경로에 S3가 마운트된다.
혹여 해당 경로에서 ls 명령어 입력시 Transport endpoint is not connected 메시지가 나온다면 passwd-s3fs 파일의 키값들이 제대로 입력되지 않아 발생되는 문제이니 키값을 다시 한번 확인해보기 바란다.
– TIPS
재부팅 후 자동으로 마운트하는 방법과 /tmp에 저장된 캐싱 파일들을 주기적으로 지워주는 방법에 대한 팁이다. 먼저 재부팅 후 자동으로 마운트하는 방법은 /etc/fstab 파일에 아래와 같이 S3FS 구문을 추가해야 한다.
sudo vi /etc/fstab 명령어를 입력해 fstab 파일을 연 다음 아래 구문을 마지막 줄에 추가하자.
s3fs#mybucketname /mnt/mymountpoint fuse allow_other,use_cache=/tmp 0 0
만약 위 구문을 추가한 다음 재부팅뒤에도 마운트가 안된다면 /etc/rc.local 파일을 수정해야 한다.
sudo vi /etc/rc.local 명령어를 입력해 rc.local 파일을 연 다음 아래와 같이 exit 0 위에 mount -a 구문을 넣어주자.
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. mount -a exit 0
이제 재부팅 후에도 마운트가 잘 되는지 확인해본다.
마지막으로 /tmp에 저장된 캐싱파일을 주기적으로 지워주는 방법이다. 리눅스 계열에서는 cron이라는 데몬이 스케쥴러 서비스를 하고 있다. cron의 설정파일인 /etc/crontab 파일에 주기적으로 캐싱파일을 지우는 구문을 추가해보자.
sudo vi /etc/crontab 명령어를 입력해 crontab 파일을 연 다음 아래와 같이 마지막 줄에 구문을 넣어주자.
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) # @daily find /tmp -atime +7 -mtime +30 -exec rm {} \;
위 구문의 의미는 /tmp 디렉터리안에서 Access Time이 일주일이 지났거나 Modified Time이 한달이 지난 파일이 있다면 삭제하는 명령을 하루에 한번만 실행한다는 의미이다.
EC2 Ubuntu 환경에서 S3를 마운트하는데 도움이 되었길 바란다.
df -h했을 때 s3fs가 나오나요?
네 아래와 같이 나옵니다.
==============================
Filesystem Size Used Avail Use% Mounted on
udev 492M 12K 492M 1% /dev
tmpfs 100M 328K 99M 1% /run
/dev/xvda1 7.8G 1.8G 5.6G 25% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
none 5.0M 0 5.0M 0% /run/lock
none 497M 0 497M 0% /run/shm
none 100M 0 100M 0% /run/user
s3fs 256T 0 256T 0% /mnt/mymount
이거 사용하면 S3를 이미지 호스팅처럼 사용할 수 있는거지요?
제가 알기론 EC2와 연동하지 않고도 그냥 S3를 이미지 호스팅할 수 있는걸로 압니다.
https://blog.codinghorror.com/using-amazon-s3-as-an-image-hosting-service/
여기 한번 참고해보세요
간단히 FTP처럼 S3Fox (파이어폭스 플러그인)을 이용해서 이미지들을 업로드하고,
업로드한 이미지를 접근하는 주소는
“http://s3.amazonaws.com/S3버킷명/이미지파일명” 이렇게 접근이 되는거 같네요.
감사합니다 덕분에 안드로이드와 ec2 연동에 성공했어요!!
와 ㅠㅠ 바로 성공했어요 감사합니다!
Awesome post! Keep up the great work! 🙂