Docker内运行Flask调用AWS服务提示NoCredentialsError如何解决
问题原因
- 代码中定义
aws_access_key_id时末尾多了逗号,导致变量值为元组而非字符串,无法作为有效凭证被boto3识别 - 初始化Textract客户端时直接调用
boto3.client(),没有使用已配置凭证的session,该调用会默认读取系统内置凭证路径、环境变量等位置的凭证,Docker容器内无对应配置,因此触发无凭证错误 - 补充:你的Flask代码中直接使用了
bucket变量,但没有提前通过s3资源实例化该对象,也会导致运行报错
修复方案
1 修复代码语法与逻辑错误
修改对应代码段如下:
import boto3 s3BucketName = "textract_bucket" region_name = 'ap-southeast-1' # 移除末尾多余逗号 aws_access_key_id = 'advdsav' aws_secret_access_key = 'sfvsdvsdvsdvvfbdf' session = boto3.Session( aws_access_key_id = aws_access_key_id, aws_secret_access_key = aws_secret_access_key, region_name = region_name ) s3 = session.resource('s3') # 实例化bucket对象,供Flask接口使用 bucket = s3.Bucket(s3BucketName) # 使用带凭证的session创建textract客户端,不要直接调用boto3.client textractmodule = session.client('textract')
修改后重新构建Docker镜像即可正常运行。
2 推荐优化(可选,提升安全性)
不要在代码中硬编码AWS凭证,避免泄露风险:
- 代码中改为从环境变量读取凭证:
import os aws_access_key_id = os.getenv('AWS_ACCESS_KEY_ID') aws_secret_access_key = os.getenv('AWS_SECRET_ACCESS_KEY')
- 运行Docker容器时通过参数传入环境变量:
docker run -p 5000:5000 -e AWS_ACCESS_KEY_ID=替换为你的实际AK -e AWS_SECRET_ACCESS_KEY=替换为你的实际SK text_extract
如果部署在AWS云服务内(EC2/ECS/EKS等),直接为运行资源绑定具备S3和Textract操作权限的IAM角色即可,无需手动传递凭证。
内容的提问来源于stack exchange,提问作者vaisxn
相关产品推荐
相关产品推荐

