jsonobject.com
451
2021-03-26 13:13:02 작성 2021-03-26 13:14:24 수정됨
0
485

Amazon EFS 서버리스 파일 시스템, 개념 및 사용법 정리


안녕하세요.

최근 진행한 프로젝트를 Amazon ECS 기반의 서버리스 컨테이너로 구축하면서 EFS의 덕을 많이 봤는데요. 관련된 시행착오와 경험을 제 블로그에 작성하였습니다. 블로그 출처만 남겨주시면 자유롭게 퍼가셔도 됩니다.

https://jsonobject.tistory.com/543  (지단로보트의 블로그)



개요

  • Amazon EFSNFSv4 프로토콜을 준수하는 아마존의 서버리스 파일 시스템 상품이다. 같은 VPC에 위치한 n개의 인스턴스에서 EFS를 공유할 수 있기 때문에 공용 파일 저장소로 활용될 수 있다.

특징

  • 영구적으로 파일을 저장할 수 있다는 공통점을 가진 Amazon S3와 다른 점은 인스턴스(또는 작업) 내에서 운영체제에 네이티브한 하나의 파일 시스템으로 작동한다는 것이다. 즉, 별도의 SDK 없이 로컬 파일 시스템과 동일하게 필요한 파일 관련 작업을 수행할 수 있다.
  • 수천대 이상의 인스턴스(또는 작업)이 EFS에 동시간에 마운트하는 것이 가능하다.
  • 용량 관리에 신경 쓸 필요가 없다. 최대 페타 바이트 수준까지 자동으로 확장된다.
  • 서버리스 컨테이너 환경에서 환경 변수 외에 애플리케이션의 상태를 영구적으로 저장할 수 있는 저장소로서 중요한 역할을 한다. 실제로 Docker 측에서는 공식 블로그를 통해 Amazon ECSAmazon EFS의 사용을 적극 권장하고 있다. [관련 링크]

EFS 제약사항

  • 서로 다른 VPC A와 B를 VPC 피어링으로 연결하였을 때, 일반적인 DNS 리졸빙의 방법으로는 다른 VPC에 존재하는 EFS를 마운트할 수 없다. 레퍼런스에 안내된 복잡한 방법으로 IP 주소를 풀어낸 후 액세스 포인트로 마운트해야 한다. [관련 링크1] [관련 링크2]

Amazon EFS 생성

  • Amazon EFS 생성 방법은 아래와 같다.
Amazon EFS 콘솔 접속 → [파일 시스템] 클릭 → [파일 시스템 생성] 클릭
→ 이름: foobar-prod
→ Virtual Private Cloud(VPC): (마운트할 인스턴스가 속한 VPC 선택)
→ [생성] 버튼 클릭
  • Amazon EFS 생성시 소속될 VPC를 선택해야 하는데 EFS를 마운트하는 인스턴스(또는 작업)와 반드시 같은 VPC 내에 위치해야 하는 것에 유의한다.

액세스 포인트 생성

  • EFS는 운영체제에 종속적인 파일 시스템이다. 따라서 실제로 마운트되는 운영체제의 소유자 및 권한의 영향을 크게 받는다. 액세스 포인트는 이러한 파일 소유자 및 권한에 대한 설정을 명확하게 명시할 수 있는 유용한 기능이다.
  • EFS를 사용하는 대부분의 환경은 컨테이너 환경일 것이다. 결국 실행 중인 컨테이너의 사용자, 그룹 ID를 파악하는 것이 중요하다. 이 정보는 아래와 같이 확인 가능하다.
# 실행 중인 컨테이너에 쉘 접속하여 사용자, 그룹 ID 확인
$ docker exec -it {container_id} sh
> id
uid=1100(foobar) gid=1100(foobar) groups=1100(foobar)
  • EFS를 마운트할 컨테이너의 사용자, 그룹 ID를 확인하였으면 이제 아래와 같이 액세스 포인트를 생성할 수 있다.
Amazon EFS 콘솔 접속 → [파일 시스템] 클릭
→ [foobar-prod] 클릭
→ [액세스 포인트] 클릭
→ [액세스 포인트 생성] 버튼 클릭

# 액세스 포인트 생성 > 세부 정보
→ 이름: etc-foo-bar (입력)
→ 루트 디렉토리 경로: /etc/foo/bar (입력)

# 액세스 포인트 생성 > POSIX 사용자
→ 사용자 ID: 1100 (입력)
→ 그룹 ID: 1100 (입력)

# 액세스 포인트 생성 > 루트 디렉터리 생성 권한
→ 소유자 사용자 ID: 1100 (입력)
→ 소유자 그룹 ID: 1100 (입력)
→ 권한: 0755 (입력)

→ [액세스 포인트 생성] 클릭
  • EC2 인스턴스에서는 생성한 액세스 포인트를 이용하여 마운트가 가능하다. (액세스 포인트에 명시한 소유자 사용자 ID, 그룹 ID, 권한이 그대로 적용되어 매우 편리하다.)

탑재 대상 생성

  • EFS액세스 포인트를 생성한 후에는 최종적으로 탑재 대상(Mount Target)을 생성하는 작업이 필요하다. VPC 내의 서브넷 단위로 탑재 대상을 생성하면 내부 IP가 생성되어 해당 서브넷에서 EFS 마운트가 가능해진다. 방법은 아래와 같다.
Amazon EFS 콘솔 접속 → [파일 시스템] 클릭
→ [foobar-prod] 클릭
→ [네트워크] 클릭
→ [탑재 대상 생성] 클릭

# 네트워크 액세스 > 가용 영역
→ Virtual Private Cloud(VPC): [foobar-prod] 선택
→ [탑재 대상 추가] 클릭
→ 가용 영역: [us-east-2a] 클릭
→ 서브넷 ID: [foobar-prod-private-1] 클릭
→ 보안 그룹: [foobar-prod-efs-access] 클릭

→ [저장] 클릭

Amazon EC2 인스턴스에서 EFS 마운트

  • 아래는 Amazon EC2에서 EFS를 마운트하는 방법이다.
# amazon-efs-utils 패키지 설치, 최초 1회 실행
$ sudo yum install -y amazon-efs-utils

# 마운트 대상 디렉토리 생성
$ mkdir -p ~/foo/bar

# EFS 일반 방식의 마운트 (권한 부여 작업 필요)
$ sudo mount -t efs -o tls {efs_id}:/ ~/foo/bar

# root로 마운트된 EFS 마운트 디렉토리에 ec2-user 권한 부여
$ sudo chown ec2-user:ec2-user ~/foo/bar

# EFS 액세스 포인트 방식의 마운트 (권한 부여 작업 미필요)
$ sudo mount -t efs -o tls,accesspoint={access_point_id} {efs_id}: /etc/foo/bar

EFS 마운트 트러블슈팅: 보안 그룹 미일치 오류

  • 해당 EFS와 마운트 대상 인스턴스(컨테이너)의 보안 그룹이 일치하지 않으면 아래 오류가 발생한다. foobar-prod-efs-access 등의 식별 가능한 이름의 보안 그룹을 생성하고, 인바운드로 TCP/2049, 아웃바운드로 전체 개방하도록 설정한 후 EFS와 대상 인스턴스(컨테이너) 모두 동일하게 해당 보안 그룹을 추가하면 오류가 해결된다.
Failed to invoke EFS utils commands to set up EFS volumes: stderr: mount.nfs4: Connection reset by peer : unsuccessful EFS utils command execution; code: 32

EFS 마운트 트러블슈팅: DNS 미설정 오류

  • 마운트시 아래 오류가 발생할 수 있다.
Failed to resolve “{efs_domain_name}” - check that your file system ID is correct.
  • DNS 리졸빙 이슈로 VPC에서 아래 설정을 적용하면 해결된다.
AWS VPC 콘솔 접속
→ [VPC] 클릭
→ (EFS가 위치한 VPC 선택)
→ [작업] → [DNS 호스트 이름 편집] → [활성화] 체크 → [변경사항 저장] 클릭
→ [작업] → [DNS 확인 편집] → [활성화] 체크 → [변경사항 저장] 클릭

Amazon EC2 인스턴스 EFS 언마운트

  • EFS를 언마운트하는 방법은 아래와 같다.
# lazy 언마운트
$ sudo umount -l ~/foobar

# force 언마운트
$ sudo umount -f ~/foobar

Amazon ECS-Fargate 작업에서 EFS 마운트

  • Amazon ECS-Fargate 작업에 EFS를 마운트하는 방법은 본 블로그의 이 글을 참고한다.

참고 글

0
  • 댓글 0

  • 로그인을 하시면 댓글을 등록할 수 있습니다.