Celery调度S3任务遇Unable to locate credentials问题求助
解决Celery在EC2上读取S3时的「Unable to locate credentials」问题
这个问题我之前帮人排查过好几次,核心原因其实是Celery worker运行的上下文环境和你手动执行代码时不一样,导致它找不到存在~/.aws里的凭证。咱们一步步来解决:
1. 先确认Celery Worker的运行用户
~/.aws是当前用户的家目录专属路径,如果Celery是用root或者其他系统用户启动的,它会去读取那个用户的~/.aws,而不是你存放凭证的用户的文件夹。
- 用命令查看Celery进程的所属用户:
输出里的第二列就是运行Celery的用户名。ps aux | grep 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
相关产品推荐
相关产品推荐

