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

Celery调度S3任务遇Unable to locate credentials问题求助

解决Celery在EC2上读取S3时的「Unable to locate credentials」问题

这个问题我之前帮人排查过好几次,核心原因其实是Celery worker运行的上下文环境和你手动执行代码时不一样,导致它找不到存在~/.aws里的凭证。咱们一步步来解决:

1. 先确认Celery Worker的运行用户

~/.aws是当前用户的家目录专属路径,如果Celery是用root或者其他系统用户启动的,它会去读取那个用户的~/.aws,而不是你存放凭证的用户的文件夹。

  • 用命令查看Celery进程的所属用户:
    ps aux | grep celery
    
    输出里的第二列就是运行Celery的用户名。
  • 解决办法:要么把你的.aws文件夹完整复制到Celery运行用户的家目录下,要么切换到你存放凭证的用户来启动Celery。

2. 给Celery显式指定凭证路径

有时候即使用户匹配,Celery启动时也可能没加载到正确的环境变量,你可以直接在启动时指定凭证文件路径:

AWS_CONFIG_FILE=/home/你的用户名/.aws/config AWS_SHARED_CREDENTIALS_FILE=/home/你的用户名/.aws/credentials celery -A 你的应用名 worker --loglevel=info

或者在Celery任务代码里直接指定凭证路径,跳过自动查找:

import boto3
from botocore.config import Config

# 手动指定凭证文件路径
config = Config(
    region_name='你的S3区域',
    credentials_file='/home/你的用户名/.aws/credentials',
    config_file='/home/你的用户名/.aws/config'
)
s3_client = boto3.client('s3', config=config)

3. 推荐:用EC2实例角色替代本地凭证(生产环境最佳实践)

既然是EC2生产环境,完全不用手动存凭证在机器上——给EC2实例分配IAM角色就行,Celery会自动通过实例元数据服务获取权限:

  • 去AWS控制台创建一个IAM角色,添加读取S3的权限(比如AmazonS3ReadOnlyAccess内置策略)
  • 把这个角色附加到你的EC2实例上
  • 之后不管Celery用哪个用户运行,都能自动获取S3访问权限,彻底告别凭证文件的问题

4. 检查Celery运行时的环境变量

botocore查找凭证的顺序是:环境变量 > 本地凭证文件 > EC2实例角色。如果Celery启动时环境变量里有AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,会优先使用它们。你可以在任务里打印环境变量确认:

import os
print("AWS_ACCESS_KEY_ID:", os.environ.get('AWS_ACCESS_KEY_ID'))

如果这些变量没设置,要么在启动Celery时传入,要么在任务代码里临时赋值。

内容的提问来源于stack exchange,提问作者venkatesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:38:00