簡體   English   中英

AWS IAM 角色 - 一個 Pod 中的 AccessDenied 錯誤

[英]AWS IAM Role - AccessDenied error in one pod

我有一個服務帳戶,我試圖在同一命名空間中安裝的多個 pod 中使用該帳戶。

其中一個 pod 是由 Airflow KubernetesPodOperator 創建的。 另一個是通過 Kubernetes 部署通過 Helm 創建的。

在 Airflow 部署中,我看到分配了 IAM 角色並創建、列出了 DynamoDB 表等,但是在第二個掌舵圖表部署(或)中的測試 Pod( 如此處所示創建)中,我不斷收到 DynamoDB 中CreateTable AccessDenied錯誤.

我可以看到 AWS 角色 ARN 被分配給服務賬戶,服務賬戶被應用到 pod 以及相應的令牌文件也正在創建,但我看到AccessDenied異常。

arn:aws:sts::1234567890:assumed-role/MyCustomRole/aws-sdk-java-1636152310195 is not authorized to perform: dynamodb:CreateTable on resource

服務帳號

Name:                mypipeline-service-account
Namespace:           abc-qa-daemons
Labels:              app.kubernetes.io/managed-by=Helm
                     chart=abc-pipeline-main.651
                     heritage=Helm
                     release=ab-qa-pipeline
                     tier=mypipeline
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::1234567890:role/MyCustomRole
                     meta.helm.sh/release-name: ab-qa-pipeline
                     meta.helm.sh/release-namespace: abc-qa-daemons
Image pull secrets:  <none>
Mountable secrets:   mypipeline-service-account-token-6gm5b
Tokens:              mypipeline-service-account-token-6gm5b

PS:使用KubernetesPodOperator創建的客戶端代碼和通過 Helm 圖表部署創建的客戶端代碼是相同的,即相同的 docker 鏡像。 像其他屬性nodeSelectortolerations等,卷安裝也是一樣的。

它們的describe pod輸出相似,只是名稱和標簽發生了一些變化。 KubernetesPodOperator pod 的 QoS 類為Burstable而 Helm 圖表的 QoS 類為BestEffort

為什么我在 Helm 部署中獲得AccessDenied而在KubernetesPodOperator沒有? 如何調試這個問題?

每當我們收到AccessDenied異常時,可能有兩個原因:

  1. 您分配了錯誤的角色
  2. 分配的角色沒有必要的權限

就我而言,后者是問題所在。 分配給特定角色的權限可以很復雜,即它們可以更細化。

例如,就我而言,角色可以創建/描述的 DynamoDB 表僅限於以特定前綴開頭的表,而不是所有 DynamoDB 表。

因此,無論何時出現此錯誤,始終建議檢查 IAM 角色權限。

如問題中所述,請務必使用awscli映像檢查服務帳戶。


請記住,AWS 開發工具包中使用了一個憑證提供程序鏈,用於確定應用程序要使用的憑證。 在大多數情況下,會使用DefaultAWSCredentialsProviderChain ,其順序如下所示。 確保 SDK 正在選擇預期的提供者(在我們的例子中是WebIdentityTokenCredentialsProvider

 super(new EnvironmentVariableCredentialsProvider(),
              new SystemPropertiesCredentialsProvider(),
              new ProfileCredentialsProvider(),
              WebIdentityTokenCredentialsProvider.create(),
              new EC2ContainerCredentialsProviderWrapper());

此外,您可能還想在記錄器中將 AWS 開發工具包類設置為調試模式,以查看正在選擇哪個憑證提供程序以及原因。


要檢查服務帳戶是否應用於 Pod,請對其進行描述並檢查 AWS 環境變量是否已設置為它,例如AWS_REGIONAWS_DEFAULT_REGIONAWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE

如果沒有,請通過描述該服務賬戶來檢查您的服務賬戶是否具有 AWS 注釋eks.amazonaws.com/role-arn

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM