尝试使用 Fargate 从 EKS 上的 DynamoDb 拉取时出现 Boto3 NoCredentialsError

Boto3 NoCredentialsError when trying to pull from DynamoDb on EKS with Fargate

我有一个 EKS 集群,其中包含用于计算的 Fargate 配置文件。我已经使用 2 个托管策略在 Fargate 配置文件上配置了 Pod 执行角色

  1. AmazonEKSFargatePodExecutionRolePolicy
  2. AmazonDynamoDBFullAccess

代码是 运行 作为 CronJob,它通过从 DynamoDb 中提取配置开始:

dynamodb = boto3.resource('dynamodb', region_name=region)

table = dynamodb.Table(table_name)

response = table.get_item(
Key = {
  'Id': config_id
})

当代码到达这一点时,它总是会出现异常:

raise NoCredentialsError()
botocore.exceptions.NoCredentialsError: Unable to locate credentials

我知道我可以在初始化 boto3 客户端时直接传递 AWS 凭证,但出于安全原因我不想这样做。

我最初使用自动缩放组中的 EC2 实例而不是 Fargate 来测试代码,这很有效。

如何解决此错误?

按照本指南中的所有 3 个步骤解决了问题。

https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html

问题在于在我的 pod 中执行代码的服务帐户。

您需要将角色附加到服务帐户本身。在我的实现中,我创建了一个新的服务帐户,理论上我可以有一个单独的服务帐户,每个 pod 具有单独的权限。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: your-custom-service-account
  namespace: default
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::12345678910:role/CustomServiceAccountRole
    eks.amazonaws.com/sts-regional-endpoints: 'true'

然后确保该帐户是与 pod 关联的服务帐户。

spec:
  serviceAccountName: your-custom-service-account

如果您没有为您的 pod 指定服务帐户,那么它默认为集群中存在的 'default' 服务帐户。