[英]EKS Pod S3 Access Denied
我正在尝试创建一个 EKS pod 以用作 mlflow 的服务。 我遇到的问题是我无法连接到 s3 来存储 mlflow 运行工件。 我尝试使用kubectl exec -it <pod_name> -- /bin/bash
连接到 pod 并在那里设置 aws 凭据。 执行此操作时,我可以 ls s3 存储桶。
但是,当我尝试将 mlflow 工件保存到同一个 s3 位置时,出现以下错误:
An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity
造成这种情况的问题是什么? 是否需要使用 EKS pod 或类似的东西设置 IAM?
是的。 在 pod 上运行的代码需要具有正确的 IAM 权限才能访问 S3 并执行您需要的 API 调用。
您可以通过多种方式实现这一目标。
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
然后该策略将应用于该节点组中创建的所有节点。 请注意,如果有多个节点组,则需要为每个节点组执行此操作。
一种不那么严厉(但涉及更多)的替代方法是将 IAM 角色分配给服务帐户。 这允许您隔离不同 pod 的权限。
此选项稍微复杂一些,因为它涉及在您的集群上创建 OIDC 身份提供程序。
如果您使用AWS Fargate来运行您的 pod,那么您应该能够向您的pod 执行角色添加权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.