You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:45:02