はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須EC2 インスタンスへ SSH 接続できること(手順内で接続方法も説明します)
- あると良い「マウント」という、ファイルシステムをディレクトリに割り当てる操作のイメージ
※ ローカル端末は Windows を想定し、標準搭載の OpenSSH を使う手順で説明します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
EC2 インスタンスにアタッチするディスク(EBS ボリューム)は、基本的に1つのインスタンスにしか同時に使えません。複数のサーバーから同じファイルを読み書きしたい場合、それぞれのディスクにコピーを置いて回るのでは、更新のたびにずれが生じてしまいます。
そこで使うのがAmazon EFSです。ネットワーク経由でアクセスする共有ファイルシステムで、複数の EC2 インスタンスから同時にマウントして使えます。今回は EFS を1つ作成し、2台の EC2 インスタンスから同時にマウントして、ファイルがリアルタイムに共有される様子を確かめます。
EBS と何が違うの?
EBS は基本的に1つの EC2 インスタンスにしか同時にアタッチできない「専用ディスク」です。一方 EFS は、ネットワーク(NFS というプロトコル)を経由して、複数のインスタンスから同時にマウントできる「共有ファイルシステム」です。今回はこの「複数台から同時に使える」という性質を体験します。
容量はあらかじめ決めておく必要があるの?
いいえ。EFS は保存したデータ量に応じて自動的に拡張・縮小します。EBS のように「サイズを指定して、後で拡張する」という作業は不要です。
EFS ファイルシステムを1つ作成し、同じサブネットの2台の EC2 インスタンスから同時にマウントし、片方で作成したファイルがもう片方からも見えることを確認する。
つくる構成
2台の EC2 インスタンスが、それぞれ同じ EFS ファイルシステムをマウントします。どちらから書き込んでも、もう片方から同じ内容が見えます。
(マウントターゲット)
要件
以下の要件を満たし、2台のインスタンス間でファイルが共有されることを確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | 同じサブネットに、Amazon Linux 2023 の EC2 インスタンスを2台起動する(名前タグは自由、例:efs-host-a / efs-host-b)。 |
| 3 | EFS ファイルシステムを1つ作成し、手順2のサブネットにマウントターゲットを設置する。 |
| 4 | マウントターゲットのセキュリティグループで、NFS通信(ポート2049)を2台のEC2のセキュリティグループからのみ許可する。 |
| 5 | 両方のインスタンスに EFS をマウントし、片方で作成したファイルがもう片方からも見えることを確認する。 |
構築の進め方
「2台立てる」→「EFSを作る」→「両方からマウントする」の3フェーズで進めます。
- フェーズ1 — 2台のEC2を起動する
-
マネジメントコンソールにサインインし、リージョンを合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
EC2 インスタンスを2台起動する
EC2 コンソールで「インスタンスを起動」から、名前に
efs-host-a、AMI に Amazon Linux 2023、インスタンスタイプに無料利用枠の対象(例:t3.micro)を選んで起動します。同じ手順でefs-host-bも起動します。同じVPC・同じサブネットに配置してください。セキュリティグループはSSHのみでよいこの時点では、両インスタンスのセキュリティグループにSSH(ポート22)を自分のIPから許可しておくだけで構いません。NFS用のルールはフェーズ2で追加します。
- フェーズ2 — EFSファイルシステムを作る
-
EFS ファイルシステムを作成する
EFS コンソールを開き、「ファイルシステムを作成」を選びます。「カスタマイズ」を選び、名前を自由に決めます(例:
shared-efs)。仮想ネットワーク(VPC)に、EC2 インスタンスと同じ VPC を選びます。 -
マウントターゲットのサブネットとセキュリティグループを設定する
マウントターゲットの設定で、EC2 インスタンスを置いているサブネットの行だけを残します(他のサブネットの行は削除して構いません)。セキュリティグループは、新しいセキュリティグループを作成し、インバウンドルールでNFS(ポート2049)を、
efs-host-aとefs-host-bにアタッチされているセキュリティグループから許可するよう設定します。ソースには2つのEC2のセキュリティグループを指定するNFSルールのソースには、IPアドレスではなく
efs-host-a・efs-host-b用のセキュリティグループ(それぞれ1行ずつ、計2行)を指定します。これにより、この2台のインスタンスからの通信だけが許可されます。 -
ファイルシステムを作成する
残りの設定(パフォーマンスモード・スループットモードなど)はデフォルトのままで構いません。内容を確認し、「作成」を押します。マウントターゲットの状態が「使用可能」になるまで、数分待ちます。
- フェーズ3 — 両方からマウントして確認する
-
efs-host-a に接続し、NFSクライアントをインストールする
Windows の OpenSSH で
efs-host-aに接続し、マウントに必要なパッケージをインストールします。sudo dnf install -y nfs-utils sudo mkdir -p /mnt/efs
-
efs-host-a で EFS をマウントする
EFS コンソールのファイルシステム詳細画面で表示される「アタッチ」のマウントコマンドを参考に、マウントします(
<ファイルシステムID>は実際の値に置き換えてください)。sudo mount -t nfs4 -o nfsvers=4.1 <ファイルシステムID>.efs.ap-northeast-1.amazonaws.com:/ /mnt/efs df -h
df -h に表示されればマウント成功df -hの出力に/mnt/efsが表示されていれば、マウントは成功しています。表示されない場合は、フェーズ2のセキュリティグループ設定を見直しましょう。 -
efs-host-b でも同様にマウントする
もう一方の
efs-host-bにも接続し、同じ手順(NFSクライアントのインストール、マウントポイント作成、マウント)を行います。 -
片方でファイルを作り、もう片方から確認する
efs-host-a側で、マウントしたディレクトリにファイルを作成します。echo "efs-host-aから書き込みました" | sudo tee /mnt/efs/hello.txt
efs-host-b側で、同じファイルが見えることを確認します。cat /mnt/efs/hello.txt
これがゴールefs-host-aで書いた内容が、efs-host-bからそのまま読めること——この状態を確認できたら、このハンズオンの目的は達成です。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「mount コマンドを実行すると、ずっと固まってしまう」
マウントターゲットのセキュリティグループで、NFS(ポート2049)がそのEC2のセキュリティグループから許可されているか見直しましょう。また、EC2インスタンスとマウントターゲットが同じVPC・同じサブネットにあるかも確認してください。
「mount コマンドを実行すると、nfs4 が不明なファイルシステムタイプと言われる」
nfs-utils パッケージのインストールが完了しているか見直しましょう。このパッケージが入っていないと、NFS形式のファイルシステムをマウントするための機能が使えません。
完了チェック
要件の再確認ではなく、画面・コマンドのどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。
- EFS コンソールのファイルシステム詳細で、マウントターゲットの状態が「使用可能」になっている。
efs-host-a・efs-host-b両方のdf -hに/mnt/efsが表示されている。efs-host-aで作成したファイルが、efs-host-bの同じパスからも同じ内容で読み取れる。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- EBS と EFS、それぞれどんな場面で向いていると考えられるでしょうか。
ヒント
1台のサーバーだけが使う高速なディスクが欲しい場面と、複数のサーバーで同じファイルを共有したい場面を比べてみましょう。それぞれの仕組みの違いが、どんな用途に向いているかを考えるヒントになります。 - EFS が容量を事前に決めなくてよい設計になっていることには、どんな利点があるでしょうか。
ヒント
EBSではサイズを決めて、後から拡張する作業が必要でした。容量を意識しなくてよいとしたら、運用の手間にどんな違いが出るか考えてみましょう。 - マウントターゲットのセキュリティグループを、特定の2台のセキュリティグループだけに絞ったのは、なぜだと考えられるでしょうか。
ヒント
共有ファイルシステムには、複数のサーバーの重要なデータが集まります。アクセスできる相手を限定しておくことが、どんなリスクを防ぐことになるか考えてみましょう。
後片づけ
マウントを解除し、作成したリソースを順番に削除します。
- マウントを解除する(任意):各インスタンスで
sudo umount /mnt/efsを実行します(次の手順でインスタンスを終了するため、省略しても問題ありません)。 - EC2 インスタンスを終了する:EC2 コンソールで
efs-host-a・efs-host-bを選び、「インスタンスの状態」→「インスタンスを終了(Terminate)」を選びます。 - EFS ファイルシステムを削除する:EFS コンソールでファイルシステムを選び、削除します。マウントターゲットも合わせて削除されます。
EC2を先に終了してから、EFSファイルシステムを削除する
EC2インスタンスがマウントした状態のまま残っていると、EFS側の削除処理がうまく進まないことがあります。先にEC2インスタンスを終了し、そのあとでEFSファイルシステムを削除する順番で進めましょう。デフォルトVPCやデフォルトのサブネットは消さないようにしてください。
コストに関する注意: EC2 インスタンスは起動中のみ課金されます(t3.micro などは無料利用枠の対象で、月あたり一定時間まで無料)。Amazon EFS は、保存したデータ量に応じた料金が時間単位でかかり続けます。今回程度の少量のデータであれば少額ですが、削除を忘れて放置すると課金が継続します。最新の料金は AWS の公式料金ページで確認してください。なお、VPC・サブネット・ルートテーブル・セキュリティグループ自体には料金はかかりません。