본문 바로가기

Storage

[실습] EC2에 EFS 볼륨 연결(mount) 구성하기

반응형

안녕하세요 서후아빠입니다. ^_^

이번 세션은 EC2에 공유볼륨 EFS를 연결하는 실습을 해보겠습니다.


구성도

1단계 : DNS 확인 활성화

VPC > Your VPCs > vpcA 선택 > Actions > Edit VPC settings > Enable DNS resolution (Enable) > Save

2단계 : EFS용 보안그룹 생성

VPC > Security groups > Creat security group 

Security group name Inbound rules
efsA-sg Type : NFS
Source type : Custom
Source : 10.0.1.0/24, 10.0.2.0/24 (연결하고자 하는 EC2 IP or 대역)

3단계 : EFS 생성

EFS > File systems > Create file system 

File system settings Network access File system policy
Name : efsA
Storage class : Standard 
Automatic backups  : Enable
Lifecycle management
  - Transition into IA : 30 days since last access 
  - Transition out of IA : None (or On first access)
Encryption : Enable
Throughput mode  : Bursting (or Enhanced)
Performance mode : General (or MAX I/O)
VPC : vpcA
Mount targets
  - Availability : ap-northeast-2a, ap-northeast-2c
  - Subnet ID : priA-sn-a, priA-sn-c 선택
  - IP address : 자동 (or 수동 IP 입력)
  - Security groups : efsA-sg 선택
Policy options : ALL disable
Lifecycle management : Lifecycle을 통해 잘 접근하지 않는 파일은 저렴한 EFS IA(Infrequently accessed)로 자동 이동
 - 위 설정은 30일동안 액세스가 없으면 EFS IA로 자동 이동하라는 의미
 - 단, 128KB 미만의 크기는 관리 대상이 아니기 때문에 항상 표준 스토리지 클래스에 저장됨
MAX I/O : 빅데이터 분석, 미디어 처리 및 게놈 분석 등 고도의 병렬 처리 시 선택
EFS는 Windows 인스턴스 미지원

EFS > File systems > efsA 선택 > 상단의 Attach > Mount via DNS 선택

# AWS에서 제공하는 예시 
sudo mount -t efs -o tls fs-070aca1d8e6b14837:/ efs

# 만약 NFS 경로를 /data로 연결하는 경우 아래처럼 진행
sudo mkdir /data
sudo mount -t efs -o tls fs-070aca1d8e6b14837:/ /data

4단계 : EFS 연결 (EC2를 SSH 접속하는 설명은 SKIP)

# 필요한 라이브러리 설치
sudo yum install -y amazon-efs-utils 

# 마운트 경로 생성 및 마운트
sudo mkdir /data 
sudo mount -t efs -o tls fs-070aca1d8e6b14837:/ /data

# 마운트 결과 확인
df -h | grep /data 
127.0.0.0:/	8.0E	0	8.0E	0%	/data 

# EC2 재부팅 시에도 마운트 유지
sudo vi /etc/fstab
fs-070aca1d8e6b14837:/	/data	efs	_netdev,tls	0	0

# priA-ec2-a에서 폴더 생성하고 priA-ec2-c에서도 폴더 확인되는지 확인 
sudo mkdir -p /data/test     // priA-ec2-a에서 폴더 생성
sudo ls -al /data            // priA-ec2-c에서 폴더 확인

# 마운트 해제
sudo umount /data
_netdev 옵션 : 네트워크 연결 후, 마운트하라는 옵션 (중요)

기타 : 인스턴스 생성 시 자동으로 설치/연결하는 방법("고급 세부 정보"의 "사용자 데이터" 이용)

#cloud-config
package_update: true
package_upgrade: true
runcmd:
- yum install -y amazon-efs-utils
- file_system_id=fs-070aca1d8e6b14837
- efs_mount_point=/data
- mkdir -p "${efs_mount_point}"
- test -f "/sbin/mount.efs" && printf "\n${file_system_id}:/ ${efs_mount_point} efs tls,_netdev\n" >> /etc/fstab || printf "\n${file_system_id}.efs.ap-northeast-2.amazonaws.com:/ ${efs_mount_point} nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0\n" >> /etc/fstab
- test -f "/sbin/mount.efs" && grep -ozP 'client-info]\nsource' '/etc/amazon/efs/efs-utils.conf'; if [[ $? == 1 ]]; then printf "\n[client-info]\nsource=liw\n" >> /etc/amazon/efs/efs-utils.conf; fi;
- retryCnt=15; waitTime=30; while true; do mount -a -t efs,nfs4 defaults; if [ $? = 0 ] || [ $retryCnt -lt 1 ]; then echo File system mounted successfully; break; fi; echo File system not available, retrying to mount.; ((retryCnt--)); sleep $waitTime; done;

기타 : Access point를 이용하여 Container에서 EFS 연결

Access point를 통해 연결하고자 하는 애플리케이션 (ex : Docker)에서 사용자 및 그룹 ID 확인 

# 도커 컨테이너 SSH 접속 (도커 접속 방법은 구글링 검색)
docker exec -it {container_id} sh

# ID 확인
id
uid=1100(foobar) gid=1100(foobar) groups=1100(foobar)

EFS > File systems > efsA 선택 > Access points (tab) > Create access point

Details POSIX user (옵션) Root directory creation permissions (옵션)
File system : efsA (수정 불가)
Name (옵션) : data-test
Root directory path (옵션) : /data/test
User ID(=uid) : 1100
Group ID(gid) : 1100
Secondary group IDs : -
Owner user ID : 1100
Owner group ID : 1100
Access point permissions : 0755

EFS > File systems > efsA 선택 > Access points (tab) > data-test의 Access point ID 확인(ex : fsap-08b372d6da2e70b63)

Access points 
  - NFS는 OS 종속적인 파일 시스템으로 애플리케이션에서 EFS를 마운트할 경우 Access points 사용
  - 파일 소유자 및 권한에 대한 설정을 명확하게 명시, 컨테이너마다 파악된 사용자, 그룹 ID
 
  
EFS ID는 3단계 생성 시 확인 가능 (ex : fs-070aca1d8e6b14837)

Access point를 통해 연결하고자 하는 애플리케이션 (ex : Docker)에서 EFS 마운트

# 도커 컨테이너 SSH 접속하여 EFS 마운트 예시 (도커 접속 방법은 구글링 검색) 
docker ps   //continer_id 확인 명령어
docker exec -it {container_id} sh

# 필요한 라이브러리 설치
sudo yum install -y nfs-utils 
 ※ Error: Failed to download metadata for repo 'appstream'발생할 경우 
    sudo cd /etc/yum.repos.d/
    sudo sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
    sudo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
    sudo yum update

# 마운트 경로 생성 및 마운트 (마운트 명령어 : EFS > My-EFS 선택 > 상단 Attach > Mount via IP)
sudo mkdir /data
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 10.0.1.10:/ /data
 ※ Access Point를 이용해서 마운트하는 방법은 실패하여 확인 필요 (명령어 예시는 참조)
    sudo mount -t efs -o tls,accesspoint=fsap-08b372d6da2e70b63 fs-070aca1d8e6b14837:/ /data

기타 

EFS 복제 기능 통한 백업 관련 설명 자료 : https://dev.classmethod.jp/articles/efs-multi-region-replication-with-aws-backup/

EFS 캐시(Cashe) 관련 설명 자료 : https://dev.classmethod.jp/articles/check-amazon-file-cache-support-efs/ 
  - Amazon File Cache는 NFS v3에서만 통신 가능하며, IP 기반으로 지원되는 것으로 보임

Access points의 POSIX user 관련 설명 자료 : https://dev.classmethod.jp/articles/efs-accesspoint-option-settings/

반응형