问题描述
尝试从 python (boto3) 运行查询到 AWS Athena 时,出现以下错误:
botocore.exceptions.ClientError:发生错误 (AccessDeniedException) 调用 StartQueryExecution 时 操作: User: arn:aws:iam::account-id:user/sa.prd 不是 授权执行:athena:StartQueryExecution 对资源: arn:aws:athena:us-east-1:account-id:workgroup/primary
我无权访问 AWS 控制台。我还被告知还有另一个用户“sa.prd.athena”具有正确的权限(“sa.prd”似乎没有发生这种情况)。
谢谢,
BR
解决方法
AWS 中的用户由用于签署对 AWS API 的 API 调用的凭证确定。通常有多种方法可以将这些凭证传递给 AWS 开发工具包(尤其是 boto3)。
它会在这些地方寻找凭据,并从它们出现的第一个地方获取它们:
- 实例化客户端时的硬编码凭据
- 存储在环境变量中的凭据
- 存储在
~/.aws/credentials
中的凭据(默认情况下,它使用默认配置文件中的凭据) - 在 EC2/ECS/Lambda 上的实例元数据服务中
由于您没有直接设置凭据,我假设它从 SDK 配置 (3) 中获取它们,因此您可以在像这样实例化 Athena 客户端时覆盖它们:
import boto3
athena_client = boto3.client(
'athena',aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY,aws_session_token=SESSION_TOKEN
)
这是一个改编的 example from the documentation,您需要指定您的凭据而不是大写变量。
不过,硬编码这些被认为是不好的做法,因此您可能需要使用环境变量查看选项 (2),或者在本地 SDK 中设置另一个配置文件并告诉客户端使用它。相关信息可以在我上面链接的 boto3-docs 中找到。