Amazon Elastic Container Service
開発者ガイド (API バージョン 2014-11-13)

チュートリアル: Amazon ECS での Amazon EFS ファイルシステムの使用

Amazon Elastic File System (Amazon EFS) では、Amazon EC2 インスタンスで使用するためのシンプルでスケーラブルなファイルストレージを提供します。Amazon EFS を使用すると、ストレージ容量が伸縮自在になり、ファイルの追加および削除時に自動的に伸縮されるようになります。アプリケーションでは、必要なときに必要なストレージを確保できます。

Amazon EFS ファイルシステムを Amazon ECS で使用して、コンテナインスタンスのフリート全体のファイルシステムデータをエクスポートできます。これにより、タスクは、配置されているインスタンスにかかわらず、同じ永続的ストレージにアクセスできます。ただし、Docker デーモンが起動する前に、Amazon EFS ファイルシステムをマウントするように、コンテナインスタンス AMI を設定する必要があります。また、そのファイルシステムを使用するために、タスク定義で、コンテナインスタンス 上のボリュームマウントを参照する必要があります。以下のセクションでは、Amazon EFS を Amazon ECS で使用し始めるのに役立ちます。

注記

Amazon EFS は、一部のリージョンでは使用できません。Amazon EFS をサポートしているリージョンについての詳細は、『AWS General Reference』の「AWS のリージョンとエンドポイント」セクションの「Amazon Elastic File System」を参照してください。

ステップ 1: クラスターの情報を収集する

Amazon ECS クラスターで Amazon EFS を使用するために必要なすべてのリソースを作成する前に、クラスターの基本情報 (その内部でホストされている VPC や、使用されているセキュリティグループなど) を収集します。

クラスターの VPC ID とセキュリティグループ ID を収集するには

  1. https://console.aws.amazon.com/ec2/) にある Amazon EC2 コンソールを開きます。

  2. クラスターからコンテナインスタンスのいずれかを選択し、インスタンスの詳細の [Description] タブを表示します。Amazon ECS の初回実行ウィザードまたはクラスター作成ウィザードを使用してクラスターを作成した場合は、クラスター名が EC2 インスタンス名に含まれる必要があります。たとえば、default という名前のクラスターには、EC2 インスタンス名 ECS Instance - EC2ContainerService-default が含まれます。

  3. コンテナインスタンスの [VPC ID] の値を記録します。その後、この VPC にセキュリティグループと Amazon EFS ファイルシステムを作成します。

  4. セキュリティグループを開いて、その詳細を表示します。

  5. [Group ID] の値を記録します。その後、このセキュリティグループから Amazon EFS ファイルシステムへのインバウンドトラフィックを許可します。

ステップ 2: Amazon EFS ファイルシステムのセキュリティグループを作成する

このセクションでは、コンテナインスタンスからのインバウンドアクセスを許可する、Amazon EFS ファイルシステムのセキュリティグループを作成します。

Amazon EFS ファイルシステムのセキュリティグループを作成するには

  1. https://console.aws.amazon.com/ec2/) にある Amazon EC2 コンソールを開きます。

  2. 左のナビゲーションペインで [Security Groups]、[Create Security Group] の順に選択します。

  3. [Security group name] に、セキュリティグループの一意の名前を入力します。たとえば、EFS-access-for-sg-dc025fa2 と指定します。

  4. [Description] に、セキュリティグループの説明を入力します。

  5. [VPC] で、クラスター用に、先ほど特定した VPC を選択します。

  6. [Inbound]、[Add rule] の順に選択します。

  7. [Type] で、[All traffic] を選択します。

  8. [Source] で、[Custom] を選択し、クラスター用に、先ほど特定したセキュリティグループ ID を入力します。

  9. [Create] を選択します。

ステップ 3: Amazon EFS ファイルシステムを作成する

Amazon EFS をコンテナインスタンスで使用する前に、Amazon EFS ファイルシステムを作成する必要があります。

Amazon ECS コンテナインスタンス用に Amazon EFS ファイルシステムを作成するには

  1. Amazon Elastic File System コンソール (https://console.aws.amazon.com/efs/) を開きます。

    注記

    Amazon EFS は、一部のリージョンでは使用できません。Amazon EFS をサポートしているリージョンについての詳細は、『AWS General Reference』の「AWS のリージョンとエンドポイント」セクションの「Amazon Elastic File System」を参照してください。

  2. [Create file system] を選択します。

  3. [Configure file system access] ページで、コンテナインスタンスがホストされている VPC を選択してから、[Next Step] を選択します。デフォルトでは、指定した VPC の各サブネットに、その VPC のデフォルトセキュリティグループを使用するマウントターゲットが割り当てられます。

    注記

    Amazon EFS ファイルシステムとコンテナインスタンスは同じ VPC にあることが必要です。

  4. [Security groups] で、前のセクションで作成したセキュリティグループを追加します。[Next step] を選択します。

  5. (オプション) ファイルシステムのタグを追加します。たとえば、ファイルシステムの一意の名前を指定するには、[Name] キーの横にある [Value] 列にその名前を入力します。

  6. ファイルシステムのパフォーマンスモードを選択してから、[Next Step] を選択します。

    注記

    [General Purpose] はデフォルトであり、ほとんどのファイルシステムにお勧めします。

  7. ファイルシステムのオプションを確認し、[Create File System] を選択します。

ステップ 4: コンテナインスタンスを設定する

コンテナインスタンスと同じ VPC に Amazon EFS ファイルシステムを作成した後、そのファイルシステムにアクセスして使用するように、コンテナインスタンスを設定する必要があります。Docker デーモンの起動前に、コンテナインスタンスで Amazon EFS ファイルシステムをマウントする必要があります。または、ファイルシステムのマウント後に、Docker デーモンを再起動してもかまいません。

Amazon EFS ファイルシステムを使用するように実行中のコンテナインスタンスを設定する

  1. SSH 経由でコンテナインスタンスにログインします。詳細については、「コンテナインスタンスへの接続」を参照してください。

  2. Amazon EFS ファイルシステムのマウントポイントを作成します。たとえば、/efs と指定します。

    sudo mkdir /efs
  3. コンテナインスタンスに NFS クライアントソフトウェアをインストールします。

    • Amazon Linux、CentOS、Red Hat Enterprise Linux の場合:

      sudo yum install -y nfs-utils
    • Ubuntu と Debian の場合:

      sudo apt-get install -y nfs-common
  4. 以下のコマンドを使用してファイルシステムをマウントします。ファイルシステムの ID とリージョンは実際のものに置き換えてください。

    sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-613c8628.efs.us-east-1.amazonaws.com:/ /efs
  5. 以下のコマンドを使用して、ファイルシステムが正しくマウントされていることを検証します。Amazon EFS ファイルシステムに一致するファイルシステム項目が表示されます。表示されない場合は、『Amazon Elastic File System ユーザーガイド』の「Amazon EFS のトラブルシューティング」を参照してください。

    mount | grep efs
  6. /etc/fstab ファイルのバックアップを作成します。

    sudo cp /etc/fstab /etc/fstab.bak
  7. 起動時にファイルシステムを自動的にマウントするように /etc/fstab ファイルを更新します。

    echo 'fs-613c8628.efs.us-east-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0' | sudo tee -a /etc/fstab
  8. ファイルシステムテーブルを再ロードして、マウントが適切に行われていることを確認します。

    sudo mount -a

    注記

    上記のコマンドの実行中にエラーが発生した場合は、/etc/fstab ファイルに問題がないかを調べてください。必要に応じて、先ほど作成したバックアップを使用して復元します。

  9. Docker を再起動して、新しいファイルシステムを参照できるようにします。以下のコマンドは Amazon ECS 最適化 AMI に適用されます。別のオペレーティングシステムを使用する場合は、そのシステムに応じてコマンドを調整します。

    注記

    これらのコマンドは、コンテナインスタンスで実行されているすべてのコンテナを停止します。

    1. Amazon ECS コンテナエージェントを停止します。

      sudo stop ecs
    2. Docker デーモンを再び開始します。

      sudo service docker restart
    3. Amazon ECS コンテナエージェントを開始します。

      sudo start ecs

ユーザーデータにより Amazon EFS を使用するようにインスタンスをブートストラップする

Amazon EC2 ユーザーデータスクリプトを使用して、起動時に Amazon ECS 最適化 AMI をブートストラップできます。詳細については、「Amazon EC2 ユーザーデータを使用してコンテナインスタンスをブートストラップする」を参照してください。

  1. Amazon ECS コンテナインスタンスの起動」にあるコンテナインスタンスの起動手順に従います。

  2. ステップ 7」の手順に従って、以下のユーザーデータを渡してインスタンスを設定します。default クラスターを使用しない場合は、設定ファイルの ECS_CLUSTER=default 行を置き換えて、独自のクラスターの名前を指定します。

    Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/cloud-boothook; charset="us-ascii" # Install nfs-utils cloud-init-per once yum_update yum update -y cloud-init-per once install_nfs_utils yum install -y nfs-utils # Create /efs folder cloud-init-per once mkdir_efs mkdir /efs # Mount /efs cloud-init-per once mount_efs echo -e 'fs-abcd1234.efs.us-east-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0' >> /etc/fstab mount -a --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Set any ECS agent configuration options echo "ECS_CLUSTER=default" >> /etc/ecs/ecs.config --==BOUNDARY==--

ステップ 5: Amazon EFS ファイルシステムを使用するためのタスク定義を作成する

ファイルシステムはホストコンテナインスタンスにマウントされているため、コンテナからファイルシステムへのアクセスを許可する Amazon ECS タスク定義でボリュームマウントを作成する必要があります。詳細については、「タスクでのデータボリュームの使用」を参照してください。

以下のタスク定義は、ホストコンテナインスタンスの Amazon EFS ファイルシステム上の /efs/htmlefs-html という名前のデータボリュームを作成します。nginx コンテナは、ホストデータボリュームを NGINX ルート /usr/share/nginx/html にマウントします。

{ "containerDefinitions": [ { "memory": 128, "portMappings": [ { "hostPort": 80, "containerPort": 80, "protocol": "tcp" } ], "essential": true, "mountPoints": [ { "containerPath": "/usr/share/nginx/html", "sourceVolume": "efs-html" } ], "name": "nginx", "image": "nginx" } ], "volumes": [ { "host": { "sourcePath": "/efs/html" }, "name": "efs-html" } ], "family": "nginx-efs" }

このタスク定義を、nginx-efs.json という名前のファイルに保存したら、実際のクラスターで使用するために登録します。これには、以下の AWS CLI コマンドを使用します。詳細については、AWS Command Line Interface ユーザーガイド の「AWS コマンドラインインターフェイスのインストール」を参照してください。

aws ecs register-task-definition --cli-input-json file://nginx-efs.json

ステップ 6: Amazon EFS ファイルシステムにコンテンツを追加する

NGINX タスクの例では、コンテナインスタンス上の /efs/html に、ウェブコンテンツのホスト用のディレクトリを作成しました。NGINX コンテナからウェブコンテンツを提供できるようにするには、そのコンテンツをファイルシステムに追加する必要があります。このセクションでは、コンテナインスタンスにログインし、index.html ファイルを追加します。

ファイルシステムにコンテンツを追加するには

  1. Amazon EFS ファイルシステムを使用しているコンテナインスタンスのいずれかに、SSH を使用して接続します。詳細については、「コンテナインスタンスへの接続」を参照してください。

  2. 以下のテキストブロックをコピーして端末に貼り付けることで、シンプルな HTML ファイルを作成します。

    sudo bash -c "cat >/efs/html/index.html" <<'EOF' <html> <body> <h1>It Works!</h1> <p>You are using an Amazon EFS file system for persistent container storage.</p> </body> </html> EOF

ステップ 7: タスクを実行する結果を表示する

コンテナインスタンスで Amazon EFS ファイルシステムを使用できるようになり、NGINX コンテナから提供されるウェブコンテンツを用意できたところで、先ほど作成したタスク定義を使用して、タスクを実行できます。NGINX ウェブサーバーによってシンプルな HTML ページが処理されます。Amazon EFS ファイルシステムのコンテンツを更新した場合、それらの変更は、そのファイルシステムがマウントされているすべてのコンテナにも伝達されます。

タスクを実行して結果を表示するには

  1. https://console.aws.amazon.com/ecs/ にある Amazon ECS コンソールを開きます。

  2. Amazon EFS を使用するように設定したクラスターを選択します。

  3. [Tasks]、[Run new tas] の順に選択します。

  4. [Task Definition] で、先ほど作成した nginx-efs タスクジョブ定義を選択します。続いて、[Run Task] を選択します。タスク実行ワークフローのその他のオプションの詳細については、「タスクの実行」を参照してください。

  5. [Tasks] タブの下で、先ほど実行したタスクを選択します。

  6. ページの下部にあるコンテナ名を展開し、コンテナに関連付けられている IP アドレスを選択します。ブラウザーで新しいタブが開いて、以下のメッセージが表示されます。

    注記

    メッセージが表示されない場合は、コンテナインスタンスのセキュリティグループがポート 80 でインバウンドネットワークトラフィックを許可していることを確認してください。