안녕하세요 서후아빠입니다. ^_^
이번 세션은 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/
'Storage' 카테고리의 다른 글
[실습] EBS 볼륨(xfs 파일시스템) 연결 및 확장에 대해서 구성하기 (0) | 2023.03.10 |
---|---|
[실습] DataSync 이용한 서로 다른 AWS 계정간 S3 bucket 동기화(sync) 구성하기 (2) | 2023.02.27 |
[실습] FSx or PlugIn(goofys, s3fs) 이용하여 EC2에 S3 bucket 연결(mount) 구성하기 (0) | 2023.02.16 |
[실습] AWS CLI 이용한 서로 다른 AWS 계정간 S3 bucket 동기화(sync) 구성하기 (2) | 2023.02.16 |
[Tip] 특정 고객만 aws-sdk-js를 사용하여 S3에 업로드할 때 오류가 발생 (0) | 2022.07.06 |