如何在 Amazon EKS 中使用 IRSA 來限制對 Amazon S3 儲存貯體的存取?
我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中的 Pod 層級限制對 Amazon Simple Storage Service (Amazon S3) 儲存貯體的存取。我還希望使用 AWS Identity and Access Management (IAM) 角色為服務帳戶 (IRSA) 保留應用程式的最低權限。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
先決條件:為您的叢集建立 IAM OpenID Connect (OIDC) 提供者。
建立 IAM 政策和角色
請完成下列步驟:
- 建立一個名為 iam-policy.json的 JSON 檔案。政策範例:
**注意:**將 YOUR_BUCKET 替換為您的 S3 儲存貯體名稱。上述範例政策會限制 Amazon S3 權限,因此 IAM 使用者只能列出並擷取 S3 儲存貯體中的物件。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::YOUR_BUCKET" }, { "Sid": "List", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::YOUR_BUCKET/*" } ] }
- 若要建立 IAM 政策,請執行下列 create-policy AWS CLI 命令:
**注意:**將 YOUR_IAM_POLICY_NAME 替換為您的政策名稱。aws iam create-policy \ --policy-name YOUR_IAM_POLICY_NAME \ --policy-document file://iam-policy.json
- 建立 IAM 角色,並將其與您的叢集服務 AWS 帳戶關聯。
- 確認您已正確設定 IAM 政策和角色。
- (選用) 若要取得角色名稱,請執行下列命令:
**注意:**將 SERVICE_ACCOUNT_NAME 替換為您的服務帳戶名稱,將 NAMESPACE_NAME 替換為您的命名空間名稱。kubectl get sa SERVICE_ACCOUNT_NAME -n NAMESPACE_NAME -o yaml | grep eks.amazonaws.com/role-arn | cut -d '/' -f 3
輸出範例:eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE
建立 Amazon EKS Pod
確認您的 Pod 可以承擔具有正確權限的 IAM 角色。完成以下步驟,在 AWS CLI 中將您的應用程式替換為官方映像檔:
- 建立名為 aws-cli-pod.yaml 的 YAML 檔案。檔案範例:
**注意:**將 NAMESPACE_NAME 替換為您的命名空間,將 SERVICE_ACCOUNT_NAME 替換為您的 Kubernetes 服務帳戶名稱。apiVersion: v1 kind: Pod metadata: name: aws-cli namespace: NAMESPACE_NAME spec: serviceAccountName: SERVICE_ACCOUNT_NAME containers: - name: aws-cli image: amazon/aws-cli:latest command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: Always
- 若要建立 Amazon EKS Pod,請執行以下命令:
kubectl apply -f ./aws-cli-pod.yaml
測試您的 Amazon EKS Pod
**注意:**在以下範例中,Pod 可以從 YOUR_BUCKET S3 儲存貯體中列出和取得物件。
若要確認您的 Pod 使用了正確的 IAM 角色和 Amazon S3 動作,請完成以下步驟:
-
若要尋找使用憑證的 IAM 角色,請執行下列命令:
kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws sts get-caller-identity
**注意:**將 NAMESPACE_NAME 替換為您的命名空間名稱。
輸出範例:{ "UserId": "AIDACKCEVSQ6C2EXAMPLE:botocore-session-123456789012", "Account": "123456789012", "Arn": "arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012" }
-
確認您的 Pod 對 S3 儲存貯體是否具有正確的權限。
若要確認您的 Pod 是否具有 s3:ListBuckets 權限,請執行下列命令:kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3 ls s3://YOUR_BUCKET
**注意:**將 NAMESPACE_NAME 替換為您的命名空間名稱,將 YOUR_BUCKET 替換為您的儲存貯體。
輸出範例:2025-03-25 22:28:06 14 hello_s3.txt
若要確認您的 Pod 是否具有 s3:GetObject 權限,請執行下列命令:
kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3api get-object --bucket YOUR_BUCKET --key DIR/S3_OBJECT_FILE S3_FILE_NAME_LOCAL
**注意:**將 NAMESPACE_NAME 替換為您的命名空間名稱,將 YOUR_BUCKET 替換為您的儲存貯體。另外,將 DIR/S3_OBJECT_FILE 替換為目錄和物件檔案名,將 S3_FILE_NAME_LOCAL 替換為新的本機 Amazon S3 物件。
輸出範例:{ "AcceptRanges": "bytes", "LastModified": "2025-03-14T01:49:38+00:00", "ContentLength": 19, "ETag": "\"678b33365329cce6cd2bb1882e62fe3a\"", "ContentType": "text/plain", "ServerSideEncryption": "AES256", "Metadata": {} }
-
若要確認您的 Pod 是否沒有 s3:DeleteObject 權限,請執行以下命令:
kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3 rm s3://YOUR_BUCKET/DEMO_TEST_FILE
注意:將 NAMESPACE_NAME 替換為您的命名空間名稱,將 YOUR_BUCKET 替換為您的儲存貯體。另外,將 DEMO\TEST\FILE 替換為您的 Amazon S3 物件檔案。
如果 Pod 沒有 s3:DeleteObject 權限,那麼您將在輸出中收到以下拒絕存取錯誤訊息:delete failed: s3://YOUR_BUCKET/DEMO_TEST_FILE An error occurred (AccessDenied) when calling the DeleteObject operation: User: arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012 is not authorized to perform: s3:DeleteObject on resource: "arn:aws:s3:::YOUR_BUCKET/DEMO_TEST_FILE" because no identity-based policy allows the s3:DeleteObject action command terminated with exit code 1
對問題進行疑難排解
**重要:**進行變更後,務必建立新的 Pod。Amazon EKS 只會在新建立的 Pod 中反映更新,而不會影響現有的 Pod。
NoSuchBucket 錯誤
如果您找不到 S3 儲存貯體 (因其不存在),那麼您會收到下列錯誤訊息:
「呼叫 ListObjectsV2 作業時發生錯誤 (NoSuchBucket): 指定的儲存貯體不存在,命令以結束代碼 254 終止」
若要對此問題進行疑難排解,請確定您在命令中使用正確的 S3 儲存貯體名稱。
NoSuchKey 錯誤
如果您無法從特定的 S3 儲存貯體路徑下載,則會收到下列錯誤訊息:
「呼叫 GetObject 作業時發生錯誤 (NoSuchKey): 指定的索引鍵不存在。」
若要對此問題進行疑難排解,請確認您的 AWS 帳戶中是否存在 Amazon S3 路徑和檔案名稱。
AccessDenied 錯誤
如果您沒有權限對 S3 儲存貯體執行動作,則會收到錯誤訊息。例如,如果您無法執行 ListObjectsV2 動作,則會發生下列錯誤:
「呼叫 ListObjectsV2 作業時發生錯誤 (AccessDenied): 使用者:arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012 無權對資源 "arn:aws:s3:::YOUR_BUCKET" 執行:s3:ListBucket,因為沒有以身分型政策允許 s3:ListBucket 動作命令以退出代碼 254 終止」
若要對此問題進行疑難排解,請確定您已將權限新增至 IAM 角色政策。
如果 IAM 身分提供者發生錯誤,則您會收到下列錯誤:
「呼叫 AssumeRoleWithWebIdentity 作業時,發生錯誤 (AccessDenied): 未獲得執行 sts:AssumeRoleWithWebIdentity 命令的授權,退出代碼為 254」
若要對此問題進行疑難排解,請確認下列組態:
- 您的叢集 IAM OIDC 提供者已正確設定。
- IAM 角色信任關係已正確設定。
- 服務帳戶使用正確的 IAM 角色。
InvalidIdentityToken 錯誤
如果 Amazon EKS 找不到您帳戶的 OIDC 提供者,則您會收到下列錯誤訊息:
「呼叫 AssumeRoleWithWebIdentity 作業時發生錯誤 (InvalidIdentityToken): 您的帳戶中找不到用於 https://oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE 的 OpenIDConnect 提供者,命令終止,退出代碼為 254」
若要對此問題進行疑難排解,請確認 IAM 中是否存在 OIDC 的身分提供者。
相關資訊
相關內容
- 已提問 1 年前
- 已提問 1 個月前
- 已提問 1 年前
- 已提問 2 年前
- 已提問 2 年前