首页 > 解决方案 > EKS Pod S3 访问被拒绝

问题描述

我正在尝试创建一个 EKS pod 以用作 mlflow 的服务。我遇到的问题是我无法连接到 s3 来存储 mlflow 运行工件。kubectl exec -it <pod_name> -- /bin/bash我也尝试使用并在那里设置 aws 凭据连接到 pod 。这样做时,我可以使用 s3 存储桶。

但是,当我尝试将 mlflow 工件保存到相同的 s3 位置时,出现以下错误:

An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity

造成这种情况的问题是什么?是否需要使用 EKS pod 或类似的东西设置 IAM?

标签: amazon-s3amazon-iamamazon-eksmlflow

解决方案


是的。您在 pod 上运行的代码需要具有正确的 IAM 权限才能访问 S3 并执行您需要的 API 调用。

有多种方法可以实现这一目标。

选项 1:将 IAM 策略附加到节点角色

EKS 节点实际上是 EC2 实例,因此您可以将适当的 IAM 策略附加到您的节点所属的 IAM 角色。如果您使用的是AWS Fargate ,则情况并非如此。在这种情况下,请参阅选项 3。这种方法的缺点是它会将这些权限授予在该节点上运行的所有 pod。如果您想要更精细的控制,请参阅选项 2。

如果您使用 设置了集群eksctl,那么这相当简单。

此示例获取集群中每个节点组的 IAM 角色名称,然后将AmazonS3FullAccess托管策略附加到每个节点组。

#!/bin/bash

for STACK_NAME in $(eksctl get nodegroup --cluster $CLUSTER_NAME -o json | jq -r '.[].StackName')
do
  ROLE_NAME=$(aws cloudformation describe-stack-resources --stack-name $STACK_NAME | jq -r '.StackResources[] | select(.ResourceType=="AWS::IAM::Role") | .PhysicalResourceId')

  aws iam attach-role-policy \
    --role-name $ROLE_NAME \
    --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
done

然后该策略将应用于该节点组中创建的所有节点。请注意,如果有多个节点组,则需要为每个节点组执行此操作。

选项 2:将 IAM 角色分配给服务帐号

一种不那么严厉(但涉及更多)的替代方法是将 IAM 角色分配给服务帐户。这允许您隔离不同 pod 的权限。

此选项稍微复杂一些,因为它涉及在您的集群上创建 OIDC 身份提供程序。

选项 3:(仅限 AWS Fargate)Pod 执行角色

如果您使用AWS Fargate运行您的 pod,那么您应该能够为您的pod 执行角色添加权限。


推荐阅读