為什麼我無法在 Amazon ECS 任務上掛載 Amazon EFS 磁碟區?
當我在 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 檔案系統掛載目標,並且它們與任務位於相同可用區域和子網路中。
若要檢查掛載目標的可用區域,請完成下列步驟:
- 開啟 Amazon EFS console (Amazon EFS 主控台)。
- 在導覽窗格選擇 File systems (檔案系統)。
- 選取您的檔案系統。
- 選擇 Network (網路),以顯示現有掛載目標及其網路組態的清單。
- 記下 Amazon EFS 檔案系統掛載磁碟區子網路的可用區域。
- 開啟 Amazon ECS console (Amazon ECS 主控台)。
- 在導覽窗格中,選取 Clusters (叢集)。
- 選取您的叢集。
- 選擇 Tasks (任務) 索引標籤。
- 選擇您的任務 ID。
- 在 Configuration (組態) 下,選擇子網路 ID。
**注意:**此動作會在瀏覽器的 Amazon VPC 主控台上開啟一個新分頁。 - 檢查子網路的可用區域,以確認它是否與 Amazon EFS 檔案系統可用區域相符。如果 Amazon EFS 檔案系統的可用區域不相符,請在正確的可用區域中建立掛載目標。
安全群組和網路 ACL
EFS 檔案系統掛載目標安全群組必須允許透過連接埠 2049 上的 TCP 傳輸來自任務的 NFS 流量。
若要檢查連接埠,請完成以下步驟:
- 開啟 Amazon EFS console (Amazon EFS 主控台)。
- 在導覽窗格選擇 File systems (檔案系統)。
- 選取您要檢查的檔案系統。
- 選擇 Network (網路) 以顯示現有掛載目標及其關聯安全群組的清單。檢查傳入規則,確保它們允許來自連接埠 2049 上任務 IP 位址的 TCP 流量。
- (選用) 若要修改關聯的安全群組,請選擇 Manage (管理)。
最佳做法是根據您的連線來源來限制對連接埠 2049 的存取。如果所有用戶端都在特定子網路內,請使用該子網路的 IP 位址範圍。如果所有用戶端都在與 Amazon EFS 關聯的 VPC 內,請使用 VPC CIDR。如果用戶端來自遠端網路,則使用與這些網路相符的 IP 位址範圍。
子網路必須允許您的 Amazon EFS 檔案系統和 Amazon ECS 任務之間的網路流量。
若要檢查網路流量組態,請完成下列步驟:
- 開啟 Amazon VPC console (Amazon VPC 主控台)。
- 在導覽窗格,選擇 Your VPCs (您的 VPC)。
- 選取您的 VPC。
- 在 Details (詳細資訊) 下,對於 Main network ACL (主網路 ACL),選擇您的 ID。
- 確定 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 上執行,請完成下列步驟:
- 在 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 位址。 - 在 VPC A 中建立 Route 53 傳出端點,並設定以下設定:
對於 region-name Region (region-name 區域) 中的 VPC,選取 VPC A。
對於 Security group for this endpoin (此端點的安全群組),請選取允許透過連接埠 53 向 VPC B 發出傳出 TCP 和 UDP 流量的安全群組。 - 建立 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 位址。 - 若要確認您是否可以使用 DNS 名稱掛載 Amazon EFS 磁碟區,請從您的用戶端執行下列命令:
sudo mount.efs fs-abcdefxyz /mnt
**注意:**將 region 替換為您的區域,並將 fs-abdcexzy 替換為您的檔案系統磁碟區 ID。dig fs-abcdefxyz.efs.region.amazonaws.com
檢查您的 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 檔案系統,並將其掛載到您任務所需的權限。
請完成下列步驟:
- 開啟 IAM console (IAM 主控台)。
- 在導覽窗格中,選擇 Roles (角色)。
- 在搜尋列中,輸入任務執行角色的名稱,然後選擇任務執行角色。
- 選擇 Permissions policies (權限政策),展開所有附加政策。請確定清單包含以下權限:
elasticfilesystem:ClientMount
elasticfilesystem:ClientWrite
elasticfilesystem:DescribeMountTargets
elasticfilesystem:DescribeFileSystems
若要為任務執行角色新增權限,請完成下列步驟:
- 開啟 IAM console (IAM 主控台)。
- 在導覽窗格中,選擇 Policies (政策)。
- 選擇 Create policy (建立政策)。
- 對於 Service (服務),選擇 EFS。
- 展開 Actions allowed (允許的動作) 區段。
- 選取 ClientMount、ClientWrite、DescribeMountTargets 和 DescribeFileSystems 權限。
- 選取該角色可以執行這些動作的資源,然後選擇 Next (下一步)。
- 輸入政策名稱和說明,然後選擇 Create policy (建立政策)。
- 在導覽窗格中,選擇 Roles (角色)。
- 在搜尋列中,輸入任務執行角色的名稱,然後選擇任務執行角色。
- 選擇 Add permissions (新增權限),然後選擇 Attach policies (附加政策)。
- 選取您的新政策。
- 選擇 Add permissions (新增權限)。
檢查您的 EFS 檔案系統政策
請完成下列步驟:
-
開啟 Amazon EFS console (Amazon EFS 主控台)。
-
選擇 File systems (檔案系統),然後選取您的檔案系統。
-
確保您的檔案系統政策允許任務執行角色掛載 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", ] } ] }
-
若要為您的政策新增更多 IAM 權限,請新增新的檔案系統政策。或者,新增陳述式以允許您的用戶端使用 Amazon EFS 磁碟區來修改現有政策。
檢查您的 POSIX 權限
如果您使用具有自訂根目錄路徑的存取點,請確定您具有 POSIX 使用者和根目錄建立權限。有關更多故障排除訊息,請參閱使用接入點掛載失敗。
相關資訊

相關內容
- 已提問 1 年前lg...
- 已提問 8 個月前lg...
- AWS 官方已更新 10 個月前
- AWS 官方已更新 3 個月前
- AWS 官方已更新 7 個月前
- AWS 官方已更新 10 個月前