AWS EFS 教學

Gary Ng
12 min readAug 4, 2024

--

AWS 提供的遠端無伺服器的檔案儲存服務,可讓 AWS 服務共享其檔案內容。以下會先準備一台 EC2

EC2 安裝 efs util

sudo apt-get update -y
sudo apt-get -y install git binutils rustc cargo pkg-config libssl-dev
git clone https://github.com/aws/efs-utils
cd efs-utils
./build-deb.sh
sudo apt-get -y install ./build/amazon-efs-utils*deb

安裝完成後檢查系統是否有 mount.efs 指令

參考資源:

創建 EFS

設定 EFS FileSystem 名稱, 並且選擇 VPC

創建 access point

點進上面建立的 FileSystem 後創建 access point

創建完 access point , 擁有的節點就是看 VPC 有幾個 public subnet, 我們這邊只設定 access point 的名稱,其他的值都先使用預設值

假如想看有哪些節點的話可以點選 network 查看

手動掛載 EFS

點選 Attach 指令會寫是可以使用的指令,看是要使用 dns name 還是 ip 掛載。

EC2 自動掛載 EFS

在 /etc/fstab 進行以下的編輯

file-system-id:/ efs-mount-point efs _netdev,noresvport,tls,iam,accesspoint=access-point-id 0 0

檢查是否可以正常掛載 EFS

sudo mount -fav

會發現會噴錯誤,說沒有設定 access key 跟 secret key

所以我們這邊還需要再設定 aws-cli

安裝 aws command line

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

在設定 aws command line 之前我們要創建一個 IAM User 且記得設定以下 Policy

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"elasticfilesystem:ClientMount",
"elasticfilesystem:ClientWrite",
"elasticfilesystem:ClientRootAccess"
],
"Resource": "*"
}
]
}

設定 aws command line

aws configure

以上設定也要使用 sudo 設定,因為下面的指令是使用 sudo 去做檢查。

都設定完之後再使用以下指令會發現已可以成功掛載

sudo mount -fav

機器重新啟動確認一下 EFS 是否會重新掛載

創建多個 access point

先將 EFS Filesystem root path 掛載至 /efs 路徑底下

注意: 要先在 EC2 的 / path 創建 efs 資料夾才能進行此操作

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport <EFS DNS>:/ /efs

然後倘若想要掛載多個路徑的節點,需在 /efs 建立相對應的資料夾,否作會因為 EFS 內部沒有此資料夾而導致掛載失敗。

例如到時想要掛載 EFS 的 /config 資料夾

# 進入 efs root path
cd /efs

# 在 efs 裡面新增 config 資料夾
sudo mkdir config

為了測試到時是否有只掛載 config 資料夾近來,所以載 ec2 也建立一個 config 資料夾

# 在根目錄建立 config 資料夾
sudo mkdir -p /config

點選新增 access point

其他的值都可以為預設但是路徑這邊請輸入 /config

點進新增完成的 access point , 並點選 attach

進行掛載 access point

sudo mount -t efs -o tls,accesspoint=<access point id> <file system id>:/ /config

掛載完成後即可透過 df -h 查看是否掛載完畢。

EFS 生命週期設定

EFS 地區搬移

假如要資料搬移的話可以使用 AWS DataSync 服務將資料傳遞至其他位置或者是帳號

請先依照 AWS 官網新增一個 IAM Role 給 DataSync

必須設定的 Policy 如下

trust policy

{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Service": "datasync.amazonaws.com"
},
"Action": "sts:AssumeRole"
}]
}

EFS 權限

備註: 以下的 Policy 為官網的範本

{
"Version": "2012-10-17",
"Id": "ExampleEFSFileSystemPolicy",
"Statement": [{
"Sid": "AccessEFSFileSystem",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:role/MyDataSyncRole"
},
"Action": [
"elasticfilesystem:ClientMount",
"elasticfilesystem:ClientWrite",
"elasticfilesystem:ClientRootAccess"
],
"Resource": "arn:aws:elasticfilesystem:us-east-1:111122223333:file-system/fs-1234567890abcdef0"
}]
}

設定來源的 DataSync Location

選擇 EFS

選擇我們前面建立的 access point

相對的也要在目的地建立 EFS 以及 DataSync, 之後則在來源設定 DataSync Task。

創建好 Task 去執行 Task 即可將資料傳遞至目的地位置。

不同區的 EFS 掛載至某一區的 EC2, 需設定 VPC Peering

--

--

Gary Ng
Gary Ng

Written by Gary Ng

軟體工程師、後端工程師

No responses yet