Skip to content

如何在 Amazon EKS 中使用 IRSA 來限制對 Amazon S3 儲存貯體的存取?

3 分的閱讀內容
0

我想在 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 政策和角色

請完成下列步驟:

  1. 建立一個名為 iam-policy.json的 JSON 檔案。政策範例:
    {    
        "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/*"
            }
        ]
    }
    **注意:**將 YOUR_BUCKET 替換為您的 S3 儲存貯體名稱。上述範例政策會限制 Amazon S3 權限,因此 IAM 使用者只能列出並擷取 S3 儲存貯體中的物件。
  2. 若要建立 IAM 政策,請執行下列 create-policy AWS CLI 命令:
    aws iam create-policy \
        --policy-name YOUR_IAM_POLICY_NAME \
        --policy-document file://iam-policy.json
    **注意:**將 YOUR_IAM_POLICY_NAME 替換為您的政策名稱。
  3. 建立 IAM 角色,並將其與您的叢集服務 AWS 帳戶關聯
  4. 確認您已正確設定 IAM 政策和角色
  5. (選用) 若要取得角色名稱,請執行下列命令:
    kubectl get sa SERVICE_ACCOUNT_NAME -n NAMESPACE_NAME -o yaml | grep eks.amazonaws.com/role-arn | cut -d '/' -f 3
    **注意:**將 SERVICE_ACCOUNT_NAME 替換為您的服務帳戶名稱,將 NAMESPACE_NAME 替換為您的命名空間名稱。
    輸出範例:
    eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE

建立 Amazon EKS Pod

確認您的 Pod 可以承擔具有正確權限的 IAM 角色。完成以下步驟,在 AWS CLI 中將您的應用程式替換為官方映像檔

  1. 建立名為 aws-cli-pod.yaml 的 YAML 檔案。檔案範例:
    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
    **注意:**將 NAMESPACE_NAME 替換為您的命名空間,將 SERVICE_ACCOUNT_NAME 替換為您的 Kubernetes 服務帳戶名稱。
  2. 若要建立 Amazon EKS Pod,請執行以下命令:
    kubectl apply -f ./aws-cli-pod.yaml

測試您的 Amazon EKS Pod

**注意:**在以下範例中,Pod 可以從 YOUR_BUCKET S3 儲存貯體中列出和取得物件。

若要確認您的 Pod 使用了正確的 IAM 角色和 Amazon S3 動作,請完成以下步驟:

  1. 若要尋找使用憑證的 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"
    }
  2. 確認您的 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": {}
    }
  3. 若要確認您的 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」

若要對此問題進行疑難排解,請確認下列組態:

InvalidIdentityToken 錯誤

如果 Amazon EKS 找不到您帳戶的 OIDC 提供者,則您會收到下列錯誤訊息:

「呼叫 AssumeRoleWithWebIdentity 作業時發生錯誤 (InvalidIdentityToken): 您的帳戶中找不到用於 https://oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE 的 OpenIDConnect 提供者,命令終止,退出代碼為 254」

若要對此問題進行疑難排解,請確認 IAM 中是否存在 OIDC 的身分提供者。

相關資訊

使用 IAM 政策模擬器進行 IAM 政策測試

AWS 服務的動作、資源和條件索引鍵

AWS 官方已更新 3 個月前