CLIによる「EFS」構築


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

皆様こんにちは。
今回はCLIを利用して高可用性アーキテクトの構築をしていきます。
この記事ではCLIよりEFSの作成を行います。
このブログはCLIによるEFSの作成をする上での知識を記事としてまとめ再確認し、皆様と共有するため作成します。

1.高可用性アーキテクト構築目次

目次はこちら

2.EFSとは

Amazon Elastic File System (Amazon EFS) は、シンプルなサーバーレスで、 set-and-forget で使用する Elastic ファイルシステムAWS クラウドサービスとオンプレミスリソース。アプリケーションを停止させることなく、オンデマンドでペタバイト規模までスケールするよう設計されており、ファイルの追加や削除に応じて自動的に拡張/縮小されるため、拡張に対応するための容量のプロビジョニングや管理は不要になります。
参照:Amazon Elastic File System とは

今回は高可用性アーキテクトを構築していくうえで二つのEC2インスタンスの共有ファイルシステムとしてEFS利用します。

類似のストレージサービスとしては「Amazon S3」や「Amazon FSx」等があげられます。

3.構成図と作業フロー

file
EFS作成からマウントまでのフローは以下になります。

  1. 共有ファイルシステムであるEFSを作成します。
  2. マウントターゲットを作成し、ターゲットにはマウントするEC2インスタンスがあるパブリックサブネットを指定します。
  3. EC2インスタンスにEFSをマウントします。具体的マウント方法は以下のコマンドを参考にしてください。(これらは後にEC2のユーザーデータにまとめ、EC2作成時に自動で設定できるようにしています。)
sudo yum install -y amazon-efs-utils
sudo mount -t efs -o tls fs-xxxxx:/ /var/www/html/
echo 'fs-xxxxx:/ /var/www/html efs tls,_netdev 0 0' | sudo tee -a /etc/fstab
  • 1行目 sudo yum install -y amazon-efs-utilsは、
    EFSマウントヘルパーのインストールです。

    • -yは全ての問い合わせに「yes」で応答するオプションです。
  • 2行目sudo mount -t efs -o tls fs-xxxxx:/ /var/www/html/は、
    EFSのマウントコマンドです。fs-xxxxxは自分のefsIDを設定します。

    • -o tlsはtlsを利用して暗号化するコマンドです。
  • 3行目echo 'fs-xxxxx:/ /var/www/html efs tls,_netdev 0 0' | sudo tee -a /etc/fstabについて、
    インスタンスの再起動時に、EFSを自動マウントするためのコマンドです。なので、fs-xxxxxを自分のefsIDに書き換える必要があります。

    • 「/etc/fstab」ファイルは、マウントするファイルシステムの情報を記述するファイルです。なので、fs-xxxxx:/ /var/www/html efs tls,_netdev 0 0を書き込む事で起動時に自動マウント設定を行えます。
    • sudo echo で直接書き込もうとするとリダイレクト処理が挟まって一般ユーザー権限になり、Permission deniedエラーが発生します。

4.EFS構築

ではこれからEFSの構築をしていきます。

4-1.EFS作成

EFSの作成をしていきます、EFSの作成には[aws efs create-file-system]コマンドを使用します。

使用するオプション 設定値 説明
--encrypted オプションの入力で有効化されます 暗号の有効化
--kms-key-id xxxxx-xxxx-xxxx-xxxxx 作成した暗号化鍵のIDを入力
--tags Key=Name,Value=umemoto-EFS 設定したいタグを入力

入力

aws efs create-file-system `
    --encrypted `
    --kms-key-id xxxxx-xxxx-xxxx-xxxx-xxxxx `
    --tags Key=Name,Value=umemoto-EFS

出力

{
    "OwnerId": "xxxxx",
    "CreationToken": "xxxxx-xxxx-xxxx-xxxx-xxxxx",
    "FileSystemId": "fs-xxxxx",
    "FileSystemArn": "arn:aws:elasticfilesystem:ap-northeast-2:xxxxx:file-system/fs-xxxxx",
    "CreationTime": "2022-05-09T16:59:46+09:00",
    "LifeCycleState": "creating",
    "Name": "umemoto-EFS",
    "NumberOfMountTargets": 0,
    "SizeInBytes": {
        "Value": 0,
        "ValueInIA": 0,
        "ValueInStandard": 0
    },
    "PerformanceMode": "generalPurpose",
    "Encrypted": true,
    "KmsKeyId": "arn:aws:kms:ap-northeast-2:xxxxx:key/xxxxx-xxxx-xxxx-xxxx-xxxxx",
    "ThroughputMode": "bursting",
    "Tags": [
        {
            "Key": "Name",
            "Value": "umemoto-EFS"
        }
    ]
}

作成できました。

4-2.マウントターゲット

次にマウントターゲットを設定していきます。

4-2-1.マウントターゲットとは

マウントターゲットは、Amazon EFS ファイルシステムをマウントできる NFSv4 エンドポイントの IP アドレスを提供します。Domain Name Service (DNS) 名を使用してファイルシステムをマウントします。そうすると EC2 インスタンスと同じアベイラビリティーゾーンの EFS マウントターゲットの IP アドレスとして解決されます。AWS リージョンのアベイラビリティーゾーンごとに 1 つのマウントターゲットを作成できます。VPC のアベイラビリティーゾーンに複数のサブネットがある場合、サブネットの 1 つにマウントターゲットを作成します。次に、アベイラビリティーゾーンのすべての EC2 インスタンスがそのマウントターゲットを共有します。
参照:Amazon EFS: 仕組み

4-2-2.マウントターゲット作成

マウントターゲットには二つのパブリックサブネットを登録します。
設定には、[aws efs create-mount-target]コマンドを使用します。

オプション 設定値 説明
--file-system-id fs-xxxxx 先ほど作成したEFSのIDを入力
--subnet-id subnet-1xxxx,subnet-2xxxx 前回作成した二つのパブリックサブネットのIDを入力
--security-group sg-xxxxx 前回作成したEFS用のSGのIDを入力
--ip-address 例:10.0.1.100 今回は使用しないオプションですが、例のように設定したいipアドレスを指定することも可能です。(サブネットのCIDR範囲内)

入力

aws efs create-mount-target `
    --file-system-id fs-xxxxx `
    --subnet-id  subnet-1xxxx `
    --security-group sg-xxxxx
aws efs create-mount-target `
    --file-system-id fs-xxxxx `
    --subnet-id  subnet-2xxxx `
    --security-group sg-xxxxx

出力

{
    "OwnerId": "xxxxx",
    "MountTargetId": "fsmt-xxxxx",
    "FileSystemId": "fs-xxxxx",
    "SubnetId": "subnet-1xxxx,
    "LifeCycleState": "creating",
    "IpAddress": "10.0.1.157",
    "NetworkInterfaceId": "eni-xxxxx",
    "AvailabilityZoneId": "apne2-az1",
    "AvailabilityZoneName": "ap-northeast-2a",
    "VpcId": "vpc-xxxxx"
}
-----
{
    "OwnerId": "xxxxx",
    "MountTargetId": "fsmt-xxxxx",
    "FileSystemId": "fs-xxxxx",
    "SubnetId": "subnet-2xxxx",
    "LifeCycleState": "creating",
    "IpAddress": "10.0.2.110",
    "NetworkInterfaceId": "eni-xxxxx",
    "AvailabilityZoneId": "apne2-az3",
    "AvailabilityZoneName": "ap-northeast-2c",
    "VpcId": "vpc-xxxxx"
}

マウントターゲットの設定ができました。

これでEFSの作成を完了しました。

5.EFS検証

作成したEFSが機能してるかの検証をしていきます。
※こちらの検証はEC2構築後に検証しています

プライベートIP10.0.1.10のインスタンスでテストファイルを作成して、プライベートIP10.0.2.20のインスタンで確認できるかのテストをします。

①まず両方のインスタンスがEFSにマウントしたディレクトリに移動したいため、以下のコマンドを利用します。

cd /var/www/html

②プライベートIP10.0.1.10のインスタンスでテストファイルを以下のコマンドで作成します。

sudo touch test.txt

③最後にプライベートIP10.0.2.20のインスタンスで以下のコマンドを利用してファイルを確認します。

ls test.txt

file
確認できました。

6.感想

特に問題なく構築できました、EFSの検証も見ていただけると光栄です。

7.参照

AWS CLI Command Reference – efs
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/efs/index.html

Last modified: 2022-06-09

Author