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 图像。 nodeSelector
、tolerations
等其他属性,volume mount也一样。
两者的 describe pod
输出相似,只是名称和标签发生了一些变化。
KubernetesPodOperator
pod 的 QoS class 为 Burstable
,而 Helm chart 的 QoS 为 BestEffort
。
为什么我在 Helm 部署中得到 AccessDenied
而在 KubernetesPodOperator
中却没有?如何调试这个问题?
每当我们遇到 AccessDenied
异常时,可能有两个原因:
- 您分配了错误的角色
- 分配的角色没有必要的权限
就我而言,后者是问题所在。分配给特定角色的权限可以很复杂,即它们可以更细化。
例如,在我的例子中,角色可以 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_REGION
、AWS_DEFAULT_REGION
、AWS_ROLE_ARN
和 AWS_WEB_IDENTITY_TOKEN_FILE
.
如果没有,则通过描述该服务帐户来检查您的服务帐户是否具有 AWS 注释eks.amazonaws.com/role-arn
。
我有一个服务帐户,我正尝试在安装在同一个命名空间中的多个 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 图像。 nodeSelector
、tolerations
等其他属性,volume mount也一样。
两者的 describe pod
输出相似,只是名称和标签发生了一些变化。
KubernetesPodOperator
pod 的 QoS class 为 Burstable
,而 Helm chart 的 QoS 为 BestEffort
。
为什么我在 Helm 部署中得到 AccessDenied
而在 KubernetesPodOperator
中却没有?如何调试这个问题?
每当我们遇到 AccessDenied
异常时,可能有两个原因:
- 您分配了错误的角色
- 分配的角色没有必要的权限
就我而言,后者是问题所在。分配给特定角色的权限可以很复杂,即它们可以更细化。
例如,在我的例子中,角色可以 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_REGION
、AWS_DEFAULT_REGION
、AWS_ROLE_ARN
和 AWS_WEB_IDENTITY_TOKEN_FILE
.
如果没有,则通过描述该服务帐户来检查您的服务帐户是否具有 AWS 注释eks.amazonaws.com/role-arn
。