s3fs-fuse 는 S3 호환 버킷을 일반 디렉터리처럼 보이게 한다. 기존 애플리케이션이 파일 경로만 다룰 때 코드를 고치지 않고 오브젝트 스토리지를 붙이는 용도로 쓴다.
성능 특성이 파일시스템과 전혀 다르다는 점을 먼저 이해해야 한다. 파일 하나를 열고 쓰는 동작이 HTTP 요청 여러 번으로 바뀐다. 부분 수정은 객체 전체를 다시 올리는 것으로 처리된다. 데이터베이스 파일, 로그를 계속 덧붙이는 경로, 수만 개의 작은 파일을 다루는 작업에는 쓰지 않는다. 대용량 파일을 통째로 읽고 쓰거나 아카이브를 두는 용도가 맞다.
# RHEL · Rocky (EPEL)
sudo dnf install -y epel-release
sudo dnf install -y s3fs-fuse
# Ubuntu
sudo apt install -y s3fs
echo "${ACCESS_KEY}:${SECRET_KEY}" > ~/.passwd-s3fs
chmod 600 ~/.passwd-s3fs
권한이 600 이 아니면 s3fs 가 파일을 읽지 않고 그대로 실패한다. 시스템 전체에서 쓰려면 /etc/passwd-s3fs 에 두고 소유자를 root, 권한을 600 으로 맞춘다.
EC2 인스턴스라면 키 대신 인스턴스 역할을 쓴다.
s3fs my-bucket /mnt/s3 -o iam_role=auto
sudo mkdir -p /mnt/s3
s3fs my-bucket /mnt/s3 \
-o passwd_file=${HOME}/.passwd-s3fs \
-o use_cache=/var/cache/s3fs \
-o umask=0022
df -h | grep s3fs
mount | grep s3fs
ls /mnt/s3
해제는 FUSE 명령을 쓴다.
fusermount -u /mnt/s3
MinIO, Ceph RGW, Wasabi, NHN·Naver·KT 의 오브젝트 스토리지처럼 AWS 가 아닌 곳에 붙일 때는 URL 과 주소 방식을 같이 지정한다.
s3fs my-bucket /mnt/s3 \
-o passwd_file=/etc/passwd-s3fs \
-o url=https://minio.example.com:9000 \
-o use_path_request_style \
-o allow_other
use_path_request_style 는 https://endpoint/bucket/key 형식으로 요청한다는 뜻이다. 이것이 없으면 https://bucket.endpoint/key 형식(가상 호스트 방식)을 쓰는데, 자체 호스팅 스토리지는 그 이름에 대한 DNS 레코드와 인증서가 없어 실패한다. 자체 호스팅 대상에는 거의 항상 필요하다.
AWS 의 특정 리전이라면 URL 과 리전을 함께 준다.
s3fs my-bucket /mnt/s3 \
-o passwd_file=/etc/passwd-s3fs \
-o url=https://s3.ap-northeast-2.amazonaws.com \
-o endpoint=ap-northeast-2
자체 서명 인증서를 쓰는 스토리지라면 CA 를 시스템 신뢰 저장소에 넣는다. 검증을 끄는 옵션은 쓰지 않는다.
마운트한 사용자 외의 계정도 접근하게 하려면 allow_other 가 필요하다. 이 옵션은 /etc/fuse.conf 에서 허용돼 있어야 동작한다.
echo 'user_allow_other' | sudo tee -a /etc/fuse.conf
my-bucket /mnt/s3 fuse.s3fs _netdev,allow_other,use_path_request_style,url=https://minio.example.com:9000,passwd_file=/etc/passwd-s3fs 0 0
_netdev 를 반드시 넣는다. 네트워크가 올라오기 전에 마운트를 시도하면 부팅이 지연되거나 실패한다. 마지막 두 칸은 0 0 이다. fsck 대상이 아니다.
fuse.s3fs 대신 옛 문서에 나오는 s3fs#버킷명 형식은 최근 systemd 환경에서 동작하지 않는 경우가 있다. 위 형식을 쓴다.
sudo mount -a
findmnt /mnt/s3
# 디버그 로그를 띄우고 포그라운드로 실행해 본다
s3fs my-bucket /mnt/s3 -o passwd_file=/etc/passwd-s3fs -o dbglevel=info -f -o curldbg
권한 오류는 대개 자격 증명 파일 권한, 버킷 정책, 엔드포인트 형식 중 하나다. 같은 자격 증명으로 CLI 가 동작하는지 먼저 확인하면 범위가 좁아진다.
aws --endpoint-url https://minio.example.com:9000 s3 ls s3://my-bucket