S3 Mount (with. Goofys)

신동수·2024년 7월 8일
0

AWS

목록 보기
17/26

개요

  • AWS 에서는 다양한 방법으로 NAS 를 사용할 수 있다. 대표적으로 EFS 가 있을 것이다. 하지만 비용적으로 부담이 되어, S3 를 마운트하여 사용할 수 있는 s3fs, s3fuse, goofys, s3-mountpoint 등이 있다. 이 중 성능이 제일 괜찮은 goofys 를 통한 마운트 방법을 정리하고자 한다.

Architecture

전제조건

  • EC2 AMI : 최신 Amazon Linux2023
  • IAM 필요 정책 예시:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::prd-goofys-test/*",
                "arn:aws:s3:::prd-goofys-test"
            ]
        }
    ]
}
  • S3 버킷 이름 : prd-goofys-test

Goofys 바이너리 설치

# 업데이트 및 필요한 패키지 설치
$ yum -y update
$ yum install -y golang fuse

# goofys 설치 (2020년 4월 이후 릴리즈 없음)
$ wget https://github.com/kahing/goofys/releases/download/v0.24.0/goofys -P /usr/local/bin/

# 권한 변경
$ chmod 755 /usr/local/bin/goofys

# 디렉토리 이동 및 생성
$ cd /
$ mkdir /goofys

EC2 설정 및 디버깅

프로파일 및 메타데이터 확인

# 인스턴스 프로파일 확인
$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/
goofys-test (연결된 Role 확인)

# 인스턴스 메타데이터 서비스(IMDS) 확인
# 아무 값이 뜨지 않거나 아래와 같은 경우는 캡처에 보이는 작업을 진행
$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>401 - Unauthorized</title>
 </head>
 <body>
  <h1>401 - Unauthorized</h1>
 </body>
</html>

위와 같은 에러가 뜰 경우 아래 캡처와 같은 설정이 필요

디버깅

# 디버그 로그
$ goofys --debug_fuse --debug_s3 -f prd-goofys-test /goofys
2024/07/08 01:17:56.410065 s3.DEBUG HEAD https://s3.amazonaws.com/prd-goofys-test = 301 [ap-northeast-2]
2024/07/08 01:17:56.410388 s3.INFO Switching from region 'us-east-1' to 'ap-northeast-2'
2024/07/08 01:17:56.412841 s3.DEBUG DEBUG: Sign Request s3/HeadObject failed, not retrying, error NoCredentialProviders: no valid providers in chain. Deprecated.
        For verbose messaging see aws.Config.CredentialsChainVerboseErrors
2024/07/08 01:17:56.413067 s3.ERROR code=NoCredentialProviders msg=no valid providers in chain. Deprecated.
        For verbose messaging see aws.Config.CredentialsChainVerboseErrors, err=<nil>

2024/07/08 01:17:56.413163 main.ERROR Unable to access 'prd-goofys-test': NoCredentialProviders: no valid providers in chain. Deprecated.
        For verbose messaging see aws.Config.CredentialsChainVerboseErrors
2024/07/08 01:17:56.413229 main.FATAL Mounting file system: Mount: initialization failed

해당 인스턴스에는 지정된 버킷의 권한이 있지만, Credential 에러가 발생한다.
그렇기에 인스턴스의 메타데이터 옵션을 변경을 해야 Role 을 통한 Mount 가 가능하다.


EC2 > 인스턴스 설정 > 인스턴스 메타데이터 옵션 수정 > Optional > 저장

# CLI 로 활성화 방법
$ aws ec2 modify-instance-metadata-options --instance-id <InstanceID> --http-endpoint enabled --http-tokens optional

Mount

# /etc/fstab
# 재부팅 시 자동 마운트를 위하여 fstab 에 위와 같이 추가
/usr/local/bin/goofys#prd-goofys-test   /goofys        fuse     _netdev,allow_other,--uid=0,--gid=0,--file-mode=0777,--dir-mode=0777,--use-content-type    0       0

# Mount 작업
$ mount -av
/                        : ignored
/boot/efi                : already mounted
/goofys                  : successfully mounted

# Mount 확인
$ df -Th
Filesystem      Type      Size  Used Avail Use% Mounted on
devtmpfs        devtmpfs  4.0M     0  4.0M   0% /dev
tmpfs           tmpfs     475M     0  475M   0% /dev/shm
tmpfs           tmpfs     190M  432K  190M   1% /run
/dev/xvda1      xfs        15G  2.1G   13G  14% /
tmpfs           tmpfs     475M     0  475M   0% /tmp
/dev/xvda128    vfat       10M  1.3M  8.7M  13% /boot/efi
tmpfs           tmpfs      95M     0   95M   0% /run/user/0
prd-goofys-test fuse      1.0P     0  1.0P   0% /goofys

# 기존 데이터 확인
$ cd /goofys/test
$ ll
total 215
-rwxrwxrwx. 1 root root 219964 Jul  5 00:47 %96IHUb.jpg

# 데이터 복사 확인
$ touch abc.txt
$ cp abc.txt /goofys/test/
$ ll
total 216
-rwxrwxrwx. 1 root root 219964 Jul  5 00:47 %96IHUb.jpg
-rwxrwxrwx. 1 root root     86 Jul  5 05:31 abc.txt


S3 콘솔에서 Mount 된 경로에 객체 확인

옵션 설명

  • _netdev : 네트워크 액세스가 필요한 장치임을 명시
  • allow_other : 다른 사용자도 사용가능
  • file-mode : 파일 권한
  • uid : 설치된 파일의 소유자
  • gid : 설치된 파일 그룹
profile
조금씩 성장하는 DevOps 엔지니어가 되겠습니다. 😄

0개의 댓글