從 CodeBuild 連線至 Amazon EKS 叢集時,該如何解決「錯誤:您必須登入伺服器 (未獲授權)」錯誤?

上次更新日期:2021 年 11 月 4 日

我正在嘗試使用 CodeBuild 服務角色,從 AWS CodeBuild 連線至 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集。為何我的 kubectl 命令傳回「錯誤:您必須登入伺服器 (未獲授權)」錯誤?我該如何疑難排解?

簡短描述

AWS Identity and Access Management (IAM) Authenticator 不允許組態對應中 Amazon 資源名稱 (ARN) 的角色內出現路徑。如果您 aws-auth ConfigMap 中的角色 ARN (rolearn) 內出現路徑,Amazon EKS 會傳回下列錯誤訊息:

「錯誤:您必須登入伺服器 (未經授權)」

CodeBuild 服務角色 ARN 內含以下路徑:/service-role。您在 aws-auth ConfigMap 中指定 rolearn 值時,必須移除 /service-role 路徑或其他任何路徑 (如果您使用其他角色的話)。如需詳細資訊,請參閱管理叢集的使用者或 IAM 角色

如果在 aws-auth ConfigMap 中從角色 ARN 移除任何路徑後收到錯誤訊息,請遵循如何解決連線至 Amazon EKS API 伺服器時,伺服器未獲授權的錯誤?一文的指示操作。

解決方案

識別您 CodeBuild 服務角色的 ARN,並移除 /service-role 路徑

1.    開啟 CodeBuild 主控台

2.    在左側導覽窗格中,選擇 Build (建置)。接著,選擇 Build projects (建置專案)。

3.    選取您的專案名稱。接著,選擇 Build details (建置詳細資訊)。

4.    在 Environment (環境) 區段的 Build details (建置詳細資訊) 窗格中,複製 CodeBuild 服務角色 ARN。

5.    在文字編輯器中貼上 CodeBuild 服務角色 ARN,然後移除 /service-role 路徑。接著,複製編輯後的 ARN。

CodeBuild 服務角色 ARN 範例

arn:aws:iam::123456789012:role/service-role/codebuild-project-service-role

已移除含有 /service-role 路徑的 CodeBuild 服務角色 ARN 範例

arn:aws:iam::123456789012:role/codebuild-project-service-role

將編輯過的 CodeBuild 服務角色 ARN 新增至您的 aws-auth ConfigMap

1.    若要在文字編輯器中編輯 aws-auth ConfigMap,叢集擁有者或管理員必須執行以下 kubectl 命令:

注意:您可以從本機電腦或可存取 EKS 叢集的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體執行命令。預設情況下,建立叢集的使用者可以存取叢集。

$ kubectl edit -n kube-system cm aws-auth

aws-auth ConfigMap 會在 vi 編輯器中開啟。

注意:如果您收到伺服器錯誤 (NotFound):找不到 configmap "aws-auth"錯誤訊息,請參閱管理使用者或叢集的 IAM 角色一文所提供的 aws-auth ConfigMap 範例。

2.    在 vi 編輯器中執行以下操作,將編輯過的 CodeBuild 服務角色 ARN 新增到 aws-auth ConfigMap:
i 啟動插入模式。
mapRoles 陳述式的 system:masters 底下,針對 rolearn 值輸入編輯後的 CodeBuild 服務角色 ARN。
Esc 鍵啟動命令模式。接著輸入 :wq,以儲存並關閉檔案。

mapRoles 陳述式範例,內含格式正確的 CodeBuild 服務角色 ARN

```
mapRoles: |
   - groups:
     - system:masters
     rolearn: arn:aws:iam::123456789012:role/codebuild-project-service-role
     username: codebuild-project-service-role
```