amazon-s3 - 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?
解决方案
是的。您在 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 执行角色添加权限。
推荐阅读
- javascript - 自定义 Hubspot 表单错误消息(使用 react.js)
- java - 使用 jooq 插入区间数据
- spring-data-rest - Spring Data Rest:预期 4xx 时出现 500 错误
- tensorflow - Tensorflow 2 Metrics 使用 2 个 GPU 产生错误的结果
- c++ - 范围检查超出范围访问 - C++
- javascript - Chrome 地理定位传感器破坏 CORS
- html - Bootstrap 模态形式:行不在第一行之下
- c++ - QT C++中对全局变量的未定义引用
- react-native - ReactNative Metro Bundler 未启动
- django - 如何将我的静态文件存储到其他 github 存储库?