我正在尝试创建一个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?
答案 0 :(得分:2)
是的。在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
然后,该策略将应用于该节点组中创建的所有节点。请注意,如果有多个节点组,则需要为每个节点组执行一次。
assigning IAM roles to service accounts是一种不那么笨拙(但涉及更多)的选择。这使您可以隔离不同吊舱的权限。
此选项稍微复杂一点,因为它涉及在群集上创建OIDC身份提供程序。
如果您使用AWS Fargate运行Pod,则应该能够向pod execution role添加权限。