【问题标题】:AWS Boto3 No Credential Error IAM role K8SAWS Boto3 无凭证错误 IAM 角色 K8S
【发布时间】:2021-01-25 02:16:29
【问题描述】:

我在我们的 K8s 集群中有一个 python 脚本,它每隔几分钟作为 k8s Cronjob 运行。该脚本检查集群中的节点,如果一个节点不健康超过 5 分钟,它将终止该节点。 要连接到 AWS,我使用 Boto3。 需求.txt

boto3==1.16.11
botocore==1.19.11

权限作为 pod 注释传递。

Annotations:  iam.amazonaws.com/role: arn:aws:iam::123456789:role/k8s-nodes-monitoring-role

IAM 角色具有arn:aws:iam::aws:policy/AmazonEC2FullAccess 策略和有效的信任策略。

{
   "Version": "2012-10-17",
   "Statement": [
{
  "Effect": "Allow",
  "Principal": {
    "Service": "ec2.amazonaws.com"
  },
  "Action": "sts:AssumeRole"
},
{
  "Sid": "",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::123456789:role/nodes.my-domain.com"
  },
  "Action": "sts:AssumeRole"
}
]
}

我面临的问题是,在某些情况下脚本会抛出 NoCredentialsError('Unable to locate credentials') 错误。此行为不一致,因为在大多数情况下,脚本已成功终止运行状况不佳的节点,我可以对照 AWS CloudTrail 事件对其进行交叉检查。 我可以在 kub2iam 日志中看到 Get 请求收到 200,但 Put 请求收到 403。

ime="2020-12-21T12:50:16Z" level=info msg="GET /latest/meta-data/iam/security- 
credentials/k8s-nodes-monitoring-role (200) took 47918.000000 ns" req.method=GET 
req.path=/latest/meta-data/iam/security-credentials/k8s-nodes-monitoring-role 
req.remote=100.116.203.13 res.duration=47918 res.status=200
time="2020-12-21T12:52:16Z" level=info msg="PUT /latest/api/token (403) took 19352999.000000 
ns" req.method=PUT req.path=/latest/api/token req.remote=100.116.203.14 
res.duration=1.9352999e+07 res.status=40

任何有关如何调试此问题的帮助或想法将不胜感激。

【问题讨论】:

  • 有一些与IMDSv2有关的剧集in #241;您是否有比这更新的版本,并且您已经按照他们的故障排除步骤进行操作了吗?

标签: python amazon-web-services kubernetes boto3 amazon-iam


【解决方案1】:

我不详细了解 kube2iam,但也许您应该切换到称为 IRSA(服务帐户的 IAM 角色)的 AWS 原生方式。您可以在这篇博文中找到所有必要的信息:https://aws.amazon.com/de/blogs/opensource/introducing-fine-grained-iam-roles-service-accounts/

【讨论】:

  • 谢谢,会调查并提供更新。
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 2023-04-03
  • 2021-09-26
  • 1970-01-01
  • 2016-11-01
  • 2018-10-13
相关资源
最近更新 更多