AWS Boto3在Django服务中运行Textract出现访问权限错误
解决方案
首先检查你角色扮演使用的IAM角色权限,必须同时包含两类权限:
- Textract服务的相关操作权限(如
textract:StartDocumentAnalysis) - 目标S3桶的
s3:GetObject权限,如果桶开启了KMS加密,还需要额外添加KMS服务的kms:Decrypt权限
本地单独运行代码时大概率使用的是~/.aws/credentials下的高权限个人凭证,而Django中使用的角色权限不足,是最常见的触发该报错的原因。
- Textract服务的相关操作权限(如
优化凭证传递方式,不要直接把STS返回的凭证字段传入Textract客户端,改用boto3 Session统一管理,避免字段传递错误或者凭证失效问题,参考代码如下:
import boto3 from boto3 import Session sts_client = boto3.client('sts', region_name="us-east-2") assumed_role = sts_client.assume_role( RoleArn='arn:aws:iam::xxx:role/xxx/xxx', RoleSessionName='djangoBoto3', DurationSeconds=3600 ) # 基于临时凭证创建独立Session textract_session = Session( aws_access_key_id=assumed_role['Credentials']['AccessKeyId'], aws_secret_access_key=assumed_role['Credentials']['SecretAccessKey'], aws_session_token=assumed_role['Credentials']['SessionToken'], region_name="us-east-2" ) textract_client = textract_session.client('textract')
- 验证临时凭证的S3访问权限,你可以把STS返回的临时凭证配置到AWS CLI的临时配置文件中,执行以下命令测试是否可以正常读取目标S3对象:
aws s3api head-object --bucket <你的桶名> --key <你的对象路径> --region us-east-2
如果该命令返回权限错误,说明问题出在角色的S3权限配置,和Textract服务本身无关,调整角色权限即可。
你能正常上传文件到S3,大概率是Django的S3上传功能使用的是另一套独立的IAM凭证,和Textract用的角色扮演凭证不是同一个,不要混淆两套凭证的权限。
- 最后确认传入Textract的S3桶名、对象key大小写完全匹配,S3的对象路径是大小写敏感的,且不要携带多余的前缀斜杠。
内容的提问来源于stack exchange,提问作者Nick Liszewski
相关产品推荐
相关产品推荐

