EKS Pod S3访问被拒绝

时间:2020-04-23 15:51:47

标签: amazon-s3 eks mlflow

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

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

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

造成此问题的原因是什么?是否需要使用EKS吊舱或沿着这些路线设置的IAM?

1 个答案:

答案 0 :(得分:2)

是的。在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角色分配给服务帐户

assigning IAM roles to service accounts是一种不那么笨拙(但涉及更多)的选择。这使您可以隔离不同吊舱的权限。

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

选项3 :(仅适用于AWS Fargate)Pod执行角色

如果您使用AWS Fargate运行Pod,则应该能够向pod execution role添加权限。