スキップしてコンテンツを表示

Amazon EFS ボリュームを AWS ECS タスクにマウントできない原因を教えてください。

所要時間5分
0

Amazon Elastic File System (Amazon EFS) ボリュームを Amazon Elastic Container Service (Amazon ECS) タスクにマウントすると、エラーが発生します。

簡単な説明

Amazon ECS タスクに Amazon EFS ボリュームをマウントする際、次の構成に設定ミスがある場合、問題が発生する可能性があります。

  • EFS ファイルシステム
  • セキュリティグループとネットワークアクセスコントロールリスト (ネットワーク ACL)
  • Amazon Virtual Private Cloud (Amazon VPC) の設定
  • Amazon EFS ボリュームがタスクとは異なる VPC にある場合のクロス VPC 設定
  • AWS Identity and Access Management (IAM) ロールのポリシーとアクセス許可

解決策

問題の原因を特定する

AWSSupport-TroubleshootECSTaskFailedToStart ランブックを使用して問題を判断します。ランブックは、Amazon ECS クラスターリソースが配置されているリージョンと同じ AWS リージョンで実行する必要があります。さらに、最後に失敗したタスクの ID を使用します。失敗したタスクが Amazon ECS サービスに属している場合は、そのサービス内で最後に失敗したタスクを使用します。失敗したタスクは、オートメーション中に ECS:DescribeTasks で確認できる必要があります。デフォルトでは、停止した ECS タスクは Stopped 状態になってから 1 時間表示されます。

オートメーションの出力に応じて、次の手動トラブルシューティング手順のいずれかを実行します。

EFS ファイルシステム、セキュリティグループ、ネットワーク ACL の設定を確認する

EFS ファイルシステム、セキュリティグループ、またはネットワーク ACL に設定ミスがある場合、次の例のようなエラーが表示されます。

「ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes: stderr: b'mount.nfs4: Connection timed out' : unsuccessful EFS utils command execution; code: 32」

または、

「ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes: stderr: mount.nfs4: Connection reset by peer : unsuccessful EFS utils command execution; code: 32」

EFS ファイルシステム

EFS ファイルシステムのマウントターゲットが作成済みであり、タスクと同じアベイラビリティーゾーンとサブネットに置かれていることを確認してください。

マウントターゲットのアベイラビリティーゾーンを確認するには、次の手順を実行します。

  1. Amazon EFS コンソールを開きます。
  2. ナビゲーションペインで、[ファイルシステム] を選択します。
  3. ファイルシステムを選択します。
  4. [ネットワーク] を選択すると、既存のマウントターゲットとそのネットワーク構成のリストが表示されます。
  5. Amazon EFS ファイルシステムがボリュームをマウントしたサブネットのアベイラビリティーゾーンを書き留めておきます。
  6. Amazon ECS コンソールを開きます。
  7. ナビゲーションペインで [クラスター] を選択します。
  8. クラスターを選択します。
  9. [タスク] タブを選択します。
  10. タスク ID を選択します。
  11. [構成] でサブネット ID を選択します。
    注: このアクションを実行すると、Amazon VPC コンソールのブラウザで新しいタブが開きます。
  12. サブネットのアベイラビリティーゾーンが Amazon EFS ファイルシステムのアベイラビリティーゾーンと一致していることを確認します。Amazon EFS ファイルシステムのアベイラビリティーゾーンと一致していない場合は、正しいアベイラビリティーゾーンにマウントターゲットを作成します。

セキュリティグループとネットワーク ACL

EFS ファイルシステムのマウントターゲット用セキュリティグループは、TCP 経由のタスクからの NFS トラフィックをポート 2049 で許可する必要があります。

ポートを確認するには、次の手順を実行します。

  1. Amazon EFS コンソールを開きます。
  2. ナビゲーションペインで、[ファイルシステム] を選択します。
  3. 確認するファイルシステムを選択します。
  4. [ネットワーク] を選択すると、既存のマウントターゲットおよび、関連するセキュリティグループのリストが表示されます。インバウンドルールがタスクの IP アドレスからの TCP トラフィックをポート 2049 で許可していることを確認します。
  5. (オプション) 関連するセキュリティグループを変更する場合は、[管理] を選択します。

接続元に応じて、ポート 2049 へのアクセスを制限することをおすすめします。すべてのクライアントが特定の単一サブネット内にある場合は、そのサブネットの IP アドレス範囲を使用します。すべてのクライアントが Amazon EFS に関連付けられた VPC 内にある場合は、VPC の CIDR を使用します。クライアントがリモートネットワークにある場合は、それらのネットワークと一致する IP アドレス範囲を使用します。

サブネットは、Amazon EFS ファイルシステムと Amazon ECS タスク間のネットワークトラフィックを許可する必要があります。

ネットワークトラフィックの設定を確認するには、次の手順を実行します。

  1. Amazon VPC コンソールを開きます。
  2. ナビゲーションペインで [Your VPC] を選択します。
  3. お使いの VPC を選択します。
  4. [詳細][メインネットワーク ACL] で ID を選択します。
  5. VPC のインバウンドルールとアウトバウンドルールで、タスク IP アドレスからの TCP 経由の NFS トラフィックがポート 2049 で許可されていることを確認します。

Amazon VPC の設定を確認する

Amazon VPC に設定ミスがある場合、次の例のようなエラーが表示されます。

「ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes: stderr: Failed to resolve "fs-abcdefgxyz.efs.us-east-1.amazonaws.com" - check that your file system ID is correct, and ensure that the VPC has an EFS mount target for this file system ID」 (EFS ボリューム設定用の EFS utils コマンドを呼び出せません。ファイルシステム ID が正確であり、VPC にこのファイルシステム ID に対する EFS マウントターゲットがあることを確認してください)

DNS 解決とホスト名を有効にする

VPC の Dynamic Host Configuration Protocol (DHCP) オプションセットで DNS 解決と DNS ホスト名を有効にする必要があります。

注: DNS ホスト名は、デフォルトでは無効になっています。

カスタム DNS サーバーがボリュームの DNS 名を解決できることを確認する

VPC の DHCP オプションセットには、AmazonProvidedDNS の使用をおすすめします。代わりにカスタム DNS サーバーを使用する場合は、DNS サーバーの設定ファイルで条件付き DNS フォワーダーを構成する必要があります。

次の設定が必要です。

  • AWS リソース (*.amazonaws.com) に対するすべての DNS クエリは、VPC のデフォルト VPC サーバーに送信する必要があります。
  • IP アドレスは、VPC にプロビジョニングされたプライマリプライベート IPV4 CIDR 範囲に 2 を加えたもの (x.y.z.2、または 169.254.169.253) である必要があります。たとえば、CIDR が 10.0.0.0/16 の場合、VPC のデフォルト DNS サーバーの IP アドレスは 10.0.0.2 です。

コンテナインスタンスとは異なる VPC にある Amazon EFS ボリュームの設定を行う

コンテナインスタンスとは異なる VPC から Amazon EFS ボリュームをマウントするには、VPC ピアリング接続を作成するか、トランジットゲートウェイを作成する必要があります。次に、タスクの実行場所に応じて、次の回避策を実行します。

Amazon EC2 インスタンス

Amazon Elastic Compute Cloud (Amazon EC2) で実行するタスクの場合は、EC2 インスタンスにログインしてから botocore をインストールします。

注: efs-utils は、botocore を使用して他の AWS サービスと通信します。インストール手順については、GitHub のウェブサイトで「botocore のインストール」を参照してください。

EFS ファイルシステムと同じ VPC 内の Amazon 提供 DNS サービス以外では、Amazon EFS の DNS 名を解決できません。Amazon EFS マウントの IP アドレスをマシンの /etc/hosts ファイルにハードコーディングするには、次のコマンドを実行します。

echo "mount-target-IP-address fs-id.efs.region.amazonaws.com" | sudo tee -a /etc/hosts

注: 実際のものでそれぞれ、mount-target-IP-address をマウントターゲットの IP アドレスに、fs-id を EFS ファイルシステムの ID に、region をリージョンに置き換えます。手順の実行後も、VPC 外部のリソースでは DNS 名を解決できません。

Fargate タスク

次の回避策では、VPC A で Amazon ECS タスクを実行しており、この VPC にAmazon EFS クライアントを配置しています。VPC B は Amazon EFS ボリューム用の VPC です。この回避策では、Amazon Route 53 リゾルバーを使用することで、データをハードコーディングすることを避けています。料金の詳細については、「Amazon Route 53 の料金」を参照してください。

前提条件

  • VPC A と B は Amazon 提供 DNS サービスを使用します。または、カスタム DNS サーバーで DNS サーバー設定ファイル内の条件付き DNS フォワーダーを使用します。
  • Amazon EFS セキュリティグループのインバウンドルールでは、VPC A CIDR のポート 2049 で TCP 経由の NFS トラフィックが許可されます。

タスクを AWS Fargate で実行する場合は、次の手順を実行します。

  1. VPC B に Route 53 のインバウンドエンドポイントを作成し、次の設定を行います。
    [region-name Region** 内の VPC]** で VPC B を選択します。
    [このエンドポイントのセキュリティグループ] には、VPC A からのインバウンド TCP および UDP トラフィックをポート 53 で許可するセキュリティグループを選択します。
    [IP アドレス] で 2 個の IP アドレスを作成します。
    注: サーバーが DNS 名を解決すると、通常、クライアントと同じアベイラビリティーゾーンにあるマウントポイントの IP アドレスが返されます。この回避策を使用すると、DNS クエリはインバウンドエンドポイントから送信されます。その結果、受信エンドポイントのアベイラビリティーゾーンにより、返される IP アドレスが決まります。
    EFS ファイルシステムの IP アドレスを 1 個のみ返すには、単一のマウントポイントを設定します。または、両方の IP アドレスを同じアベイラビリティーゾーンに配置します。別々のアベイラビリティーゾーンを選択すると、DNS 名はクエリを転送したインバウンドエンドポイントに応じて、異なる IP アドレスを返します。
  2. VPC A に Route 53 のアウトバウンドエンドポイントを作成し、次の設定を行います。
    [region-name Region** 内の VPC]** で VPC A を選択します。
    [このエンドポイントのセキュリティグループ] で VPC B へのアウトバウンド TCP および UDP トラフィックをポート 53 で許可するセキュリティグループを選択します。
  3. Route 53 リゾルバールールを作成し、Amazon EFS DNS 名の DNS クエリを VPC B 内の Amazon DNS に転送します。
    次の設定を行います。
    [ドメイン名] に EFS ファイルシステムの完全な DNS 名 (例: fs-abcdef.efs.eu-west-1.amazonaws.com) を入力します。
    [このルールを使用する VPC] で VPC A を選択します。
    [アウトバウンドエンドポイント] で VPC A のアウトバウンドエンドポイントを選択します。
    [ターゲット IP アドレス] に VPC B にある Route 53 インバウンドエンドポイント用の 2 個の IP アドレスを入力します。
  4. Amazon EFS ボリュームを DNS 名でマウントできることを確認するには、クライアントから次のコマンドを実行します。
    sudo mount.efs fs-abcdefxyz /mnt
    dig fs-abcdefxyz.efs.region.amazonaws.com
    注: 実際のものでそれぞれ、region をリージョンに、fs-abdcexzy をファイルシステムのボリューム ID に置き換えます。

IAM ロールのポリシーとアクセス許可を確認する

IAM ロールのポリシーとアクセス許可に問題がある場合は、次の例のようなエラーが表示されます。

ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes: stderr: b'mount.nfs4: access denied by server while mounting 127.0.0.1:/' : unsuccessful EFS utils command execution; code: 32」

または、

ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes: stderr: b'mount.nfs4: mounting fs-xxx.efs.us-east-1.amazonaws.com:/dir failed, reason given by server: No such file or directory' : unsuccessful EFS utils command execution; code: 32」

次のリソースで定義したアクセス許可によって、EFS ファイルシステムへのアクセスが制御される場合があります。

  • Amazon ECS タスクロールの IAM ポリシー
  • EFS ファイルシステムのポリシー
  • アクセスポイントに割り当てられた POSIX アクセス許可
  • ネットワーク ACL とセキュリティグループ
    注: ネットワーク ACL とセキュリティグループを確認するには、「セキュリティグループとネットワーク ACL」セクションを参照してください。

Amazon ECS タスクのアクセス許可を確認する

注: タスク実行ロールの ID を特定するには、タスク定義 JSON ファイルの executionRoleARN 値を確認します。JSON ファイルへのアクセス方法の詳細については、「ステップ 5: タスク定義を作成する」を参照してください。

Amazon ECS タスク実行ロールには、Amazon EFS ファイルシステムを特定してタスクにマウントするために必要なアクセス許可があることを確認してください。

次の手順を実行します。

  1. IAM コンソールを開きます。
  2. ナビゲーションペインで [ロール] を選択します。
  3. 検索バーにタスク実行ロールの名前を入力し、該当するタスク実行ロールを選択します。
  4. [アクセス許可ポリシー] を選択し、アタッチされているすべてのポリシーを展開します。リストに次のアクセス許可が含まれていることを確認してください。
    elasticfilesystem:ClientMount
    elasticfilesystem:ClientWrite
    elasticfilesystem:DescribeMountTargets
    elasticfilesystem:DescribeFileSystems

タスク実行ロールにアクセス許可を追加するには、次の手順を実行します。

  1. IAM コンソールを開きます。
  2. ナビゲーションペインで [ポリシー] を選択します。
  3. [ポリシーを作成] を選択します。
  4. [サービス][EFS] を選択します。
  5. [許可するアクション] セクションを展開します。
  6. アクセス許可 ClientMountClientWriteDescribeMountTargetsDescribeFileSystems を選択します。
  7. ロールにこれらのアクション実行を許可するリソースを選択し、[次へ] を選択します。
  8. ポリシー名と説明を入力し、[ポリシーの作成] を選択します。
  9. ナビゲーションペインで [ロール] を選択します。
  10. 検索バーにタスク実行ロールの名前を入力し、該当するタスク実行ロールを選択します。
  11. [アクセス許可を追加] を選択してから [ポリシーをアタッチ] を選択します。
  12. 新しく準備したポリシーを選択してください。
  13. アクセス許可を追加] を選択します。

EFS ファイルシステムのポリシーを確認する

次の手順を実行します。

  1. Amazon EFS コンソールを開きます。

  2. [ファイルシステム] を選択し、該当するファイルシステムを選択します。

  3. お使いのファイルシステムポリシーで、タスク実行ロールが EFS ボリュームをマウントすることを許可していることを確認してください。
    ポリシーの例

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "ECS Tasks - EFS Access",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::account-id:role/ecs-task-execution-role-name"
          },
          "Action": [
            "elasticfilesystem:ClientMount",
            "elasticfilesystem:ClientWrite",
            "elasticfilesystem:DescribeMountTargets",
            "elasticfilesystem:DescribeFileSystems",
          ]
        }
      ]
    }
  4. ポリシーに IAM アクセス許可をさらに追加するには、新しいファイルシステムポリシーを追加します。または、ステートメントを追加することで、クライアントが Amazon EFS ボリュームを使用して既存のポリシーを変更できるようにします。

POSIX のアクセス許可を確認する

カスタムのルートディレクトリパスを持つアクセスポイントを使用する場合は、POSIX ユーザーとルートディレクトリを作成するためのアクセス許可があることを確認してください。トラブルシューティングの詳細については、「アクセスポイントでのマウントが失敗する」を参照してください。

関連情報

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

マウントターゲットを管理する

Fargate で実行されている Amazon ECS コンテナまたはタスクに Amazon EFS ファイルシステムをマウントする方法を教えてください

ファイルシステムの作成直後にファイルシステムのマウントが失敗する

開発者ガイド: Amazon ECS および AWS Fargate で Amazon EFS を使用する - パート 2

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ