尝试使用 Fargate 从 EKS 上的 DynamoDb 拉取时出现 Boto3 NoCredentialsError
Boto3 NoCredentialsError when trying to pull from DynamoDb on EKS with Fargate
我有一个 EKS 集群,其中包含用于计算的 Fargate 配置文件。我已经使用 2 个托管策略在 Fargate 配置文件上配置了 Pod 执行角色。
- AmazonEKSFargatePodExecutionRolePolicy
- 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' 服务帐户。
我有一个 EKS 集群,其中包含用于计算的 Fargate 配置文件。我已经使用 2 个托管策略在 Fargate 配置文件上配置了 Pod 执行角色。
- AmazonEKSFargatePodExecutionRolePolicy
- 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' 服务帐户。