← ハンズオン一覧に戻る

AWS Hands-on / Storage

1つのファイルシステムを、複数のサーバーから見る

フルマネージドの共有ファイルシステム「Amazon EFS」を1つ作成し、同じサブネットの2台のEC2インスタンスから同時にマウントします。片方のサーバーで作成したファイルが、もう片方からも即座に見える状態を体験します。

● Lv.3 複数のサービスを組み合わせられる人 ⏱ 所要 60〜90 分 SSH接続あり
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須EC2 インスタンスへ SSH 接続できること(手順内で接続方法も説明します)
  • あると良い「マウント」という、ファイルシステムをディレクトリに割り当てる操作のイメージ

※ ローカル端末は Windows を想定し、標準搭載の OpenSSH を使う手順で説明します。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

EC2 インスタンスにアタッチするディスク(EBS ボリューム)は、基本的に1つのインスタンスにしか同時に使えません。複数のサーバーから同じファイルを読み書きしたい場合、それぞれのディスクにコピーを置いて回るのでは、更新のたびにずれが生じてしまいます。

そこで使うのがAmazon EFSです。ネットワーク経由でアクセスする共有ファイルシステムで、複数の EC2 インスタンスから同時にマウントして使えます。今回は EFS を1つ作成し、2台の EC2 インスタンスから同時にマウントして、ファイルがリアルタイムに共有される様子を確かめます。

EBS と何が違うの?

EBS は基本的に1つの EC2 インスタンスにしか同時にアタッチできない「専用ディスク」です。一方 EFS は、ネットワーク(NFS というプロトコル)を経由して、複数のインスタンスから同時にマウントできる「共有ファイルシステム」です。今回はこの「複数台から同時に使える」という性質を体験します。

容量はあらかじめ決めておく必要があるの?

いいえ。EFS は保存したデータ量に応じて自動的に拡張・縮小します。EBS のように「サイズを指定して、後で拡張する」という作業は不要です。

Goal

EFS ファイルシステムを1つ作成し、同じサブネットの2台の EC2 インスタンスから同時にマウントし、片方で作成したファイルがもう片方からも見えることを確認する。

04 — Architecture

つくる構成

2台の EC2 インスタンスが、それぞれ同じ EFS ファイルシステムをマウントします。どちらから書き込んでも、もう片方から同じ内容が見えます。

efs-host-a
EC2(例)
Amazon EFS
共有ファイルシステム
(マウントターゲット)
efs-host-b
EC2(例)
NFS通信(ポート2049)は、マウントターゲットのセキュリティグループで、2台のEC2のセキュリティグループからのみ許可します。
05 — Requirements

要件

以下の要件を満たし、2台のインスタンス間でファイルが共有されることを確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2同じサブネットに、Amazon Linux 2023 の EC2 インスタンスを2台起動する(名前タグは自由、例:efs-host-a / efs-host-b)。
3EFS ファイルシステムを1つ作成し、手順2のサブネットにマウントターゲットを設置する。
4マウントターゲットのセキュリティグループで、NFS通信(ポート2049)を2台のEC2のセキュリティグループからのみ許可する。
5両方のインスタンスに EFS をマウントし、片方で作成したファイルがもう片方からも見えることを確認する。
06 — Steps

構築の進め方

「2台立てる」→「EFSを作る」→「両方からマウントする」の3フェーズで進めます。

  1. フェーズ1 — 2台のEC2を起動する
  2. マネジメントコンソールにサインインし、リージョンを合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

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

    EC2 コンソールで「インスタンスを起動」から、名前に efs-host-a、AMI に Amazon Linux 2023、インスタンスタイプに無料利用枠の対象(例:t3.micro)を選んで起動します。同じ手順で efs-host-b も起動します。同じVPC・同じサブネットに配置してください。

    セキュリティグループはSSHのみでよい

    この時点では、両インスタンスのセキュリティグループにSSH(ポート22)を自分のIPから許可しておくだけで構いません。NFS用のルールはフェーズ2で追加します。

  4. フェーズ2 — EFSファイルシステムを作る
  5. EFS ファイルシステムを作成する

    EFS コンソールを開き、「ファイルシステムを作成」を選びます。「カスタマイズ」を選び、名前を自由に決めます(例:shared-efs)。仮想ネットワーク(VPC)に、EC2 インスタンスと同じ VPC を選びます。

  6. マウントターゲットのサブネットとセキュリティグループを設定する

    マウントターゲットの設定で、EC2 インスタンスを置いているサブネットの行だけを残します(他のサブネットの行は削除して構いません)。セキュリティグループは、新しいセキュリティグループを作成し、インバウンドルールでNFS(ポート2049)を、efs-host-aefs-host-b にアタッチされているセキュリティグループから許可するよう設定します。

    ソースには2つのEC2のセキュリティグループを指定する

    NFSルールのソースには、IPアドレスではなくefs-host-aefs-host-b 用のセキュリティグループ(それぞれ1行ずつ、計2行)を指定します。これにより、この2台のインスタンスからの通信だけが許可されます。

  7. ファイルシステムを作成する

    残りの設定(パフォーマンスモード・スループットモードなど)はデフォルトのままで構いません。内容を確認し、「作成」を押します。マウントターゲットの状態が「使用可能」になるまで、数分待ちます。

  8. フェーズ3 — 両方からマウントして確認する
  9. efs-host-a に接続し、NFSクライアントをインストールする

    Windows の OpenSSH で efs-host-a に接続し、マウントに必要なパッケージをインストールします。

    efs-host-a 内
    sudo dnf install -y nfs-utils
    sudo mkdir -p /mnt/efs
  10. efs-host-a で EFS をマウントする

    EFS コンソールのファイルシステム詳細画面で表示される「アタッチ」のマウントコマンドを参考に、マウントします(<ファイルシステムID> は実際の値に置き換えてください)。

    efs-host-a 内
    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のセキュリティグループ設定を見直しましょう。

  11. efs-host-b でも同様にマウントする

    もう一方の efs-host-b にも接続し、同じ手順(NFSクライアントのインストール、マウントポイント作成、マウント)を行います。

  12. 片方でファイルを作り、もう片方から確認する

    efs-host-a 側で、マウントしたディレクトリにファイルを作成します。

    efs-host-a 内
    echo "efs-host-aから書き込みました" | sudo tee /mnt/efs/hello.txt

    efs-host-b 側で、同じファイルが見えることを確認します。

    efs-host-b 内
    cat /mnt/efs/hello.txt
    これがゴール

    efs-host-a で書いた内容が、efs-host-b からそのまま読めること——この状態を確認できたら、このハンズオンの目的は達成です。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — マウントコマンドが応答せず止まったままになる

「mount コマンドを実行すると、ずっと固まってしまう」

マウントターゲットのセキュリティグループで、NFS(ポート2049)がそのEC2のセキュリティグループから許可されているか見直しましょう。また、EC2インスタンスとマウントターゲットが同じVPC・同じサブネットにあるかも確認してください。

Pitfall 02 — 「コマンドが見つかりません」と表示される

「mount コマンドを実行すると、nfs4 が不明なファイルシステムタイプと言われる」

nfs-utils パッケージのインストールが完了しているか見直しましょう。このパッケージが入っていないと、NFS形式のファイルシステムをマウントするための機能が使えません。

08 — Checklist

完了チェック

要件の再確認ではなく、画面・コマンドのどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。

  • EFS コンソールのファイルシステム詳細で、マウントターゲットの状態が「使用可能」になっている。
  • efs-host-aefs-host-b 両方の df -h/mnt/efs が表示されている。
  • efs-host-a で作成したファイルが、efs-host-b の同じパスからも同じ内容で読み取れる
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. EBS と EFS、それぞれどんな場面で向いていると考えられるでしょうか。
    ヒント
    1台のサーバーだけが使う高速なディスクが欲しい場面と、複数のサーバーで同じファイルを共有したい場面を比べてみましょう。それぞれの仕組みの違いが、どんな用途に向いているかを考えるヒントになります。
  2. EFS が容量を事前に決めなくてよい設計になっていることには、どんな利点があるでしょうか。
    ヒント
    EBSではサイズを決めて、後から拡張する作業が必要でした。容量を意識しなくてよいとしたら、運用の手間にどんな違いが出るか考えてみましょう。
  3. マウントターゲットのセキュリティグループを、特定の2台のセキュリティグループだけに絞ったのは、なぜだと考えられるでしょうか。
    ヒント
    共有ファイルシステムには、複数のサーバーの重要なデータが集まります。アクセスできる相手を限定しておくことが、どんなリスクを防ぐことになるか考えてみましょう。
10 — Clean up

後片づけ

マウントを解除し、作成したリソースを順番に削除します。

  1. マウントを解除する(任意):各インスタンスで sudo umount /mnt/efs を実行します(次の手順でインスタンスを終了するため、省略しても問題ありません)。
  2. EC2 インスタンスを終了する:EC2 コンソールで efs-host-aefs-host-b を選び、「インスタンスの状態」→「インスタンスを終了(Terminate)」を選びます。
  3. EFS ファイルシステムを削除する:EFS コンソールでファイルシステムを選び、削除します。マウントターゲットも合わせて削除されます。
Caution — 削除の順番に注意

EC2を先に終了してから、EFSファイルシステムを削除する

EC2インスタンスがマウントした状態のまま残っていると、EFS側の削除処理がうまく進まないことがあります。先にEC2インスタンスを終了し、そのあとでEFSファイルシステムを削除する順番で進めましょう。デフォルトVPCやデフォルトのサブネットは消さないようにしてください。

コストに関する注意: EC2 インスタンスは起動中のみ課金されます(t3.micro などは無料利用枠の対象で、月あたり一定時間まで無料)。Amazon EFS は、保存したデータ量に応じた料金が時間単位でかかり続けます。今回程度の少量のデータであれば少額ですが、削除を忘れて放置すると課金が継続します。最新の料金は AWS の公式料金ページで確認してください。なお、VPC・サブネット・ルートテーブル・セキュリティグループ自体には料金はかかりません。