Edited at

AWS CLIを利用して、EFS をEC2 にマウントしてみた


1.AWS CLIのセットアップ

default プロファイルを作成する。

aws configure --profile default

AWS Access Key ID [****************S3OI]:
AWS Secret Access Key [****************Hl/8]:
Default region name [ap-northeast-1]:
Default output format [json]:


2.EC2リソースの準備


2-1.セキュリティグループの作成

EC2用のセキュリティグループ (ec2-efs-sg) の作成

aws ec2 create-security-group --group-name ec2-efs-sg --description ec2-efs-sg --vpc-id <vpc-id>

{
"GroupId": "sg-0477dba8701c82358"
}

EC2用のセキュリティグループ (efs-ec2-sg) の作成

aws ec2 create-security-group --group-name efs-ec2-sg --description efs-ec2-sg --vpc-id <vpc-id>

{
"GroupId": "sg-077ebe172984f9ba6"
}

作成されたかセキュリティグループをそれぞれ確認する

aws ec2 describe-security-groups --group-ids <GroupId>

{
"SecurityGroups": [
{
"IpPermissionsEgress": [
{
"IpProtocol": "-1",
"PrefixListIds": [],
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"Description": "ec2-efs-sg",
"IpPermissions": [],
"GroupName": "ec2-efs-sg",
"VpcId": "<VpcId>",
"OwnerId": "<OwnerId>",
"GroupId": "<GroupId>"
}
]
}


2-2.セキュリティグループにルールを追加する

EC2側のセキュリティグループにルールを追加する。(ec2-efs-sg)

aws ec2 authorize-security-group-ingress --group-id <group-id> --protocol tcp --port 22 --cidr 0.0.0.0/0

efs側のセキュリティグループにルールを追加する。(efs-ec2-sg)

aws ec2 authorize-security-group-ingress --group-id <group-id> --protocol tcp --port 2049 --source-group <source-group ID>

大きな反応はないので、ルールが追加されたかそれぞれ確認する。

aws ec2 describe-security-groups --group-id <group-id>

{
"SecurityGroups": [
{
"IpPermissionsEgress": [
{
"IpProtocol": "-1",
"PrefixListIds": [],
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"Description": "ec2-efs-sg",
"IpPermissions": [
{
"PrefixListIds": [],
"FromPort": 22,
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"ToPort": 22,
"IpProtocol": "tcp",
"UserIdGroupPairs": [],
"Ipv6Ranges": []
}
],
"GroupName": "efs-ec2-sg",
"VpcId": "<VpcId>",
"OwnerId": "<OwnerId>",
"GroupId": "<GroupId>"
}
]
}


2-3.EC2 インスタンスを起動する

EC2を配置するサブネットIDを確認しておきます。

aws ec2 describe-subnets

EC2 インスタンスを作成する。

aws ec2 run-instances --image-id <AMI ID> --count 1 --instance-type t2.micro --associate-public-ip-address --key-name <key-name> --security-group-ids <security-group-ids> --subnet-id <VPC subnet ID>

"InstanceId": "i-0b74bccd242bbea63",

接続するための、パブリックIP、パブリックDNSを確認しておく。

aws ec2 describe-instances --instance-ids <InstanceId>

"PublicIp": "<PublicIp>",
"PublicDnsName": "<PublicDNS>",


3.EFSリソースの作成


3-1.EFSファイルシステムを作成する

aws efs create-file-system --creation-token FileSystemForWalkthrough1

"FileSystemId": "fs-f25534d3",


3-2.ライフサイクル管理の有効化(オプション)

ライフサイクル管理を有効にします。

なお、AmazonLinux2を利用してやりましたが、最近リリースされた機能のため、CLIが最新でないとできません。

aws efs put-lifecycle-configuration --file-system-id fs-f25534d3 --lifecycle-policies TransitionToIA=AFTER_30_DAYS


3-3.マウントターゲットを作成する

aws efs create-mount-target --file-system-id <file-system-id> --subnet-id <subnet-id> --security-group <efs-ec2 security-group>


4.EFS ファイルシステムを EC2 インスタンスにマウントしてする


4-1.NFS クライアントのインストール

EC2インスタンスに接続し、NFS クライアントをインストールします。

sudo yum -y install nfs-utils


4-2.EC2 インスタンスへのファイルシステムをマウント

ディレクトリを作成し、EC2インスタンスへファイルシステムをへマウントします。

mkdir ~/efs-mount-point

sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport <mount-target-DNS>:/ ~/efs-mount-point
cd ~/efs-mount-point


5.テストする

ディレクトリを移動する。

cd ~/efs-mount-point  

ls -la
drwxr-xr-x 2 root root 6144 Jul 17 05:59 .
drwx------ 4 ec2-user ec2-user 118 Jul 17 07:46 ..

ファイルシステムのルートディレクトリは、作成時に root ユーザーが所有し、root ユーザーによって書き込みが可能なため、ファイルを追加する権限を変更する必要があります。

sudo chmod go+rw .

ls -la
drwxrwxrwx 2 root root 6144 Jul 17 05:59 .
drwx------ 4 ec2-user ec2-user 118 Jul 17 07:46 ..

ファイルを作成してみる。

touch test-file.txt

ls -l
-rw-rw-r-- 1 ec2-user ec2-user 0 Jul 17 07:55 test.txt