AWS IAM 角色 - 一个 pod 中的 AccessDenied 错误

AWS IAM Role - AccessDenied error in one pod

我有一个服务帐户,我正尝试在安装在同一个命名空间中的多个 pods 中使用它。

其中一个 pods 是由 Airflow KubernetesPodOperator 创建的。 另一个是通过 Helm 通过 Kubernetes 部署创建的。

在 Airflow 部署中,我看到正在分配 IAM 角色并创建、列出 DynamoDB 表等,但是在第二个 helm chart 部署(或)在测试 pod 中(created as shown here),我不断得到AccessDenied DynamoDB 中 CreateTable 的错误。

我可以看到 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

P.S:使用 KubernetesPodOperator 和通过 Helm chart 部署创建的客户端代码是相同的,即相同的 docker 图像。 nodeSelectortolerations等其他属性,volume mount也一样。

两者的 describe pod 输出相似,只是名称和标签发生了一些变化。 KubernetesPodOperator pod 的 QoS class 为 Burstable,而 Helm chart 的 QoS 为 BestEffort

为什么我在 Helm 部署中得到 AccessDenied 而在 KubernetesPodOperator 中却没有?如何调试这个问题?

每当我们遇到 AccessDenied 异常时,可能有两个原因:

  1. 您分配了错误的角色
  2. 分配的角色没有必要的权限

就我而言,后者是问题所在。分配给特定角色的权限可以很复杂,即它们可以更细化。

例如,在我的例子中,角色可以 create/describe 的 DynamoDB 表仅限于那些以特定 前缀 开头的表,但不是所有DynamoDB 表。

So, it is always advisable to check the IAM role permissions whenever you get this error.

如问题中所述,请务必使用 awscli 图片检查服务帐户。


请记住,AWS SDK 中使用了一个凭据提供程序链,它确定了应用程序要使用的凭据。在大多数情况下,使用 DefaultAWSCredentialsProviderChain 并且其顺序如下所示。确保 SDK 正在选择预期的提供者(在我们的例子中是 WebIdentityTokenCredentialsProvider

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

此外,您可能还想在记录器中将 AWS SDK 类 设置为 DEBUG 模式,以查看正在获取哪个凭证提供程序以及原因。


要检查服务帐户是否应用于 pod,请对其进行描述并检查是否为其设置了 AWS 环境变量,如 AWS_REGIONAWS_DEFAULT_REGIONAWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE.

如果没有,则通过描述该服务帐户来检查您的服务帐户是否具有 AWS 注释eks.amazonaws.com/role-arn