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


#1.AWS CLIのセットアップ#

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

```json
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) の作成

```json
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) の作成

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

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


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

```json
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）

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

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


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

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

```json
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を確認しておきます。

```json
aws ec2 describe-subnets
```

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

```json
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を確認しておく。

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

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


#3.EFSリソースの作成#

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

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

    "FileSystemId": "fs-f25534d3",
```

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

[ライフサイクル管理](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/lifecycle-management-efs.html)を有効にします。
なお、AmazonLinux2を利用してやりましたが、最近リリースされた機能のため、CLIが最新でないとできません。

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

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

```json
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 クライアントをインストールします。

```json
sudo yum -y install nfs-utils
```

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

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

```json
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.テストする#

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

```json
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 ユーザーによって書き込みが可能なため、ファイルを追加する権限を変更する必要があります。


```json
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 ..
```

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

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