為什麼我無法在 Amazon ECS 任務上掛載 Amazon EFS 磁碟區?

5 分的閱讀內容
0

當我在 Amazon Elastic Container Service (Amazon ECS) 任務上掛載 Amazon Elastic File System (Amazon EFS) 磁碟區時,收到錯誤訊息。

簡短描述

以下設定中的錯誤設定可能會導致在 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 任務在進入已停止狀態後會在 1 小時內顯示。

根據自動化的輸出,使用下列其中一個手動疑難排解步驟。

檢查您的 EFS 檔案系統、安全群組和網路 ACL 組態

如果您錯誤地設定了 EFS 檔案系統、安全群組或網路 ACL,那麼您將收到類似於以下範例的錯誤:

「ResourceInitializationError:無法調用 EFS 公用程式命令來設定 EFS 磁碟區:stderr: b'mount.nfs4: 連線逾時':EFS 公用程式命令執行失敗;代碼: 32」

- 或 -

「ResourceInitializationError:無法調用 EFS 公用程式命令來設定 EFS 磁碟區:stderr: mount.nfs4: 連線由對等互連重設:EFS 公用程式命令執行失敗;代碼: 32」

EFS 檔案系統

確保您已建立 EFS 檔案系統掛載目標,並且它們與任務位於相同可用區域和子網路中。

若要檢查掛載目標的可用區域,請完成下列步驟:

  1. 開啟 Amazon EFS console (Amazon EFS 主控台)。
  2. 在導覽窗格選擇 File systems (檔案系統)。
  3. 選取您的檔案系統。
  4. 選擇 Network (網路),以顯示現有掛載目標及其網路組態的清單。
  5. 記下 Amazon EFS 檔案系統掛載磁碟區子網路的可用區域。
  6. 開啟 Amazon ECS console (Amazon ECS 主控台)。
  7. 在導覽窗格中,選取 Clusters (叢集)。
  8. 選取您的叢集。
  9. 選擇 Tasks (任務) 索引標籤。
  10. 選擇您的任務 ID。
  11. Configuration (組態) 下,選擇子網路 ID。
    **注意:**此動作會在瀏覽器的 Amazon VPC 主控台上開啟一個新分頁。
  12. 檢查子網路的可用區域,以確認它是否與 Amazon EFS 檔案系統可用區域相符。如果 Amazon EFS 檔案系統的可用區域不相符,請在正確的可用區域中建立掛載目標。

安全群組和網路 ACL

EFS 檔案系統掛載目標安全群組必須允許透過連接埠 2049 上的 TCP 傳輸來自任務的 NFS 流量。

若要檢查連接埠,請完成以下步驟:

  1. 開啟 Amazon EFS console (Amazon EFS 主控台)。
  2. 在導覽窗格選擇 File systems (檔案系統)。
  3. 選取您要檢查的檔案系統。
  4. 選擇 Network (網路) 以顯示現有掛載目標及其關聯安全群組的清單。檢查傳入規則,確保它們允許來自連接埠 2049 上任務 IP 位址的 TCP 流量。
  5. (選用) 若要修改關聯的安全群組,請選擇 Manage (管理)。

最佳做法是根據您的連線來源來限制對連接埠 2049 的存取。如果所有用戶端都在特定子網路內,請使用該子網路的 IP 位址範圍。如果所有用戶端都在與 Amazon EFS 關聯的 VPC 內,請使用 VPC CIDR。如果用戶端來自遠端網路,則使用與這些網路相符的 IP 位址範圍。

子網路必須允許您的 Amazon EFS 檔案系統和 Amazon ECS 任務之間的網路流量。

若要檢查網路流量組態,請完成下列步驟:

  1. 開啟 Amazon VPC console (Amazon VPC 主控台)。
  2. 在導覽窗格,選擇 Your VPCs (您的 VPC)。
  3. 選取您的 VPC。
  4. Details (詳細資訊) 下,對於 Main network ACL (主網路 ACL),選擇您的 ID。
  5. 確定 VPC 中的傳入和傳出規則允許來自連接埠 2049 上任務 IP 位址,經 TCP 傳輸的 NFS 流量。

檢查您的 Amazon VPC 組態

如果您未正確設定 Amazon VPC,那麼您將收到類似於以下的錯誤範例:

「ResourceInitializationError:無法調用 EFS 公用程式命令來設定 EFS 磁碟區:stderr: 無法解析 "fs-abcdefgxyz.efs.us-east-1.amazonaws.com" - 請檢查您的檔案系統 ID 是否正確,並確保 VPC 具有此檔案系統 ID 的 EFS 掛載目標。」

啟用 DNS 解析和主機名稱

您必須在 VPC 的動態主機組態協定 (DHCP) 選項集中啟用 DNS 解析和 DNS 主機名稱

**注意:**DNS 主機名稱預設為停用。

確定您的自訂 DNS 伺服器可以解析磁碟區的 DNS 名稱

最佳做法是將 AmazonProvidedDNS 用於您的 VPC DHCP 選項集。如果您使用自訂 DNS 伺服器,則必須在 DNS 伺服器設定檔中設定條件式 DNS 轉寄站。

包括以下設定:

  • 所有對 AWS 資源 (*.amazonaws.com) 的 DNS 查詢都必須前往 VPC 的預設 DNS 伺服器。
  • IP 位址必須是為您 VPC 佈建的主要私用 IPV4 CIDR 範圍加上二 (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 之間建立 VPC 對等互連。或者,建立一個傳輸閘道。然後,根據任務執行的位置使用以下解決方法步驟。

Amazon EC2 執行個體

在 Amazon Elastic Compute Cloud (Amazon EC2) 上執行的任務,請登入您的 EC2 執行個體,然後安裝 botocore。

注意:efs-utils 使用 botocore 與其他 AWS 服務互動。如需安裝步驟,請參閱 GitHub 網站上的安裝 botocore

只有與 EFS 檔案系統位於相同 VPC 中的 Amazon 提供的 DNS 服務,才能解析 Amazon EFS DNS 名稱。若要在電腦的 /etc/hosts 檔案中對 Amazon EFS 掛載的 IP 位址進行硬式編碼,請執行下列命令:

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。VPC B 是 Amazon EFS 磁碟區的 VPC。因應措施是使用 Amazon Route 53 Resolver 而不是對資料進行硬式編碼。有關定價的資訊,請參閱 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 (region-name 區域) 中的 VPC,選取 VPC B。
    對於 Security group for this endpoint (此端點的安全群組),選取允許來自連接埠 53 上 VPC A 傳入 TCP 和 UDP 流量的安全群組。
    對於 IP addresses (IP 位址),請建立兩個 IP 位址。
    **注意:**當您的伺服器解析 DNS 名稱時,它通常會傳回與您的用戶端位於相同可用區域的掛載點的 IP 位址。當您使用此解決方法時,您的 DNS 查詢會源自傳入端點。因此,傳入端點的可用區域決定傳回的 IP 位址。
    若要為您的 EFS 檔案系統傳回單一 IP 位址,請設定單一掛載點。或者,將兩個 IP 位址放在同一個可用區域。如果您選擇不同的可用區域,則 DNS 名稱將根據轉送查詢的傳入端點傳回不同的 IP 位址。
  2. 在 VPC A 中建立 Route 53 傳出端點,並設定以下設定:
    對於 region-name Region (region-name 區域) 中的 VPC,選取 VPC A。
    對於 Security group for this endpoin (此端點的安全群組),請選取允許透過連接埠 53 向 VPC B 發出傳出 TCP 和 UDP 流量的安全群組。
  3. 建立 Route 53 解析器規則,將 Amazon EFS DNS 名稱的 DNS 查詢轉送至 VPC B 中的 Amazon DNS。
    設定下列設定:
    對於 Domain name (網域名稱),請輸入您 EFS 檔案系統的完整 DNS 名稱,例如 fs-abcdef.efs.eu-west-1.amazonaws.com
    對於 VPCs that use this rule (使用此規則的 VPC),請選取 VPC A。
    對於 Outbound endpoint (傳出端點),請選取 VPC A 中的傳出端點。
    對於 Target IP addresses (目標 IP 位址),請輸入 VPC B 中 Route 53 傳入端點的兩個 IP 位址。
  4. 若要確認您是否可以使用 DNS 名稱掛載 Amazon EFS 磁碟區,請從您的用戶端執行下列命令:
    sudo mount.efs fs-abcdefxyz /mnt
    dig fs-abcdefxyz.efs.region.amazonaws.com
    **注意:**將 region 替換為您的區域,並將 fs-abdcexzy 替換為您的檔案系統磁碟區 ID。

檢查您的 IAM 角色政策和權限

如果您的 IAM 角色政策和權限有問題,您會收到類似下列範例的錯誤:

「ResourceInitializationError:無法調用 EFS 公用程式命令來設定 EFS 磁碟區:stderr: b'mount.nfs4:掛載 127.0.0.1:/' 時存取遭到伺服器拒絕:EFS 公用程式命令執行失敗;代碼: 32」

- 或 -

「ResourceInitializationError:無法調用 EFS 公用程式命令來設定 EFS 磁碟區:stderr: b'mount.nfs4:掛載 fs-xxx.efs.us-east-1.amazonaws.com:/dir 失敗,伺服器給出的原因: 沒有這樣的檔案或目錄':EFS 公用程式命令執行失敗;代碼: 32」

您在下列資源中定義的權限可能會控制對 EFS 檔案系統的存取:

  • Amazon ECS 任務角色 IAM 政策
  • EFS 檔案系統政策
  • 指派給您存取點的 POSIX 權限
  • 網路 ACL 和安全群組
    注意:若要檢查您的網路 ACL 和安全群組,請參閱安全群組和網路 ACL 一節。

檢查您的 Amazon ECS 任務權限

**注意:**若要辨識任務執行角色 ID,請檢查任務定義 JSON 檔案中的 executionRoleARN 值。有關如何存取 JSON 檔案的更多資訊,請參閱步驟 5: 建立任務定義

請確定 Amazon ECS 任務執行角色具有定位 Amazon EFS 檔案系統,並將其掛載到您任務所需的權限。

請完成下列步驟:

  1. 開啟 IAM console (IAM 主控台)。
  2. 在導覽窗格中,選擇 Roles (角色)。
  3. 在搜尋列中,輸入任務執行角色的名稱,然後選擇任務執行角色。
  4. 選擇 Permissions policies (權限政策),展開所有附加政策。請確定清單包含以下權限:
    elasticfilesystem:ClientMount
    elasticfilesystem:ClientWrite
    elasticfilesystem:DescribeMountTargets
    elasticfilesystem:DescribeFileSystems

若要為任務執行角色新增權限,請完成下列步驟:

  1. 開啟 IAM console (IAM 主控台)。
  2. 在導覽窗格中,選擇 Policies (政策)。
  3. 選擇 Create policy (建立政策)。
  4. 對於 Service (服務),選擇 EFS
  5. 展開 Actions allowed (允許的動作) 區段。
  6. 選取 ClientMountClientWriteDescribeMountTargetsDescribeFileSystems 權限。
  7. 選取該角色可以執行這些動作的資源,然後選擇 Next (下一步)。
  8. 輸入政策名稱和說明,然後選擇 Create policy (建立政策)。
  9. 在導覽窗格中,選擇 Roles (角色)。
  10. 在搜尋列中,輸入任務執行角色的名稱,然後選擇任務執行角色。
  11. 選擇 Add permissions (新增權限),然後選擇 Attach policies (附加政策)。
  12. 選取您的新政策。
  13. 選擇 Add permissions (新增權限)。

檢查您的 EFS 檔案系統政策

請完成下列步驟:

  1. 開啟 Amazon EFS console (Amazon EFS 主控台)。

  2. 選擇 File systems (檔案系統),然後選取您的檔案系統。

  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 檔案系統

管理掛載目標

如何將 Amazon EFS 檔案系統掛載到在 Fargate 上執行的 Amazon ECS 容器或任務上?

檔案系統建立後,檔案系統掛載立即失敗

開發人員使用 Amazon EFS 與 Amazon ECS 和 AWS Fargate 的指南 - 第 2 部分

AWS 官方
AWS 官方已更新 2 個月前