繁体   English   中英

EKS Pod S3 访问被拒绝

[英]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 调用。

您可以通过多种方式实现这一目标。

选项 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 执行角色添加权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM