AWS CLI可正常使用但Boto3报错找不到profile3配置如何排查
问题根因
你遇到的ProfileNotFound报错,核心原因是运行Airflow Python脚本的进程读取到的AWS配置路径、权限或自定义Boto3封装逻辑存在问题,AWS CLI能正常运行不代表Airflow进程能拿到相同的环境配置:
- 官方
apache/airflow镜像默认运行用户airflow的家目录为/opt/airflow,你将配置挂载到了/home/airflow/.aws,boto3默认会优先读取当前用户家目录下的.aws文件夹,如果没有正确配置环境变量就会找不到配置 - 你配置的
AWS_CONFIG_FILE、AWS_SHARED_CREDENTIALS_FILE环境变量没有被Airflow进程正确加载:交互式exec进入容器时启动的shell会加载.bashrc/.profile等配置,你看到的是shell的环境变量,而Airflow后台进程不会加载这些shell配置,仅会读取容器启动时传入的环境变量 - 你自定义封装的
Boto3AwsClient类可能存在逻辑缺陷,比如硬编码了配置文件路径、没有正确传入profile参数 - 挂载的
.aws目录权限不足,airflow用户没有读取权限(你exec进入容器如果用的是root用户,看到的文件可读不代表airflow用户能读)
排查步骤
- 首先在你的Python脚本中添加调试代码,确认进程实际拿到的配置:
import os # 打印环境变量 print("AWS_CONFIG_FILE:", os.environ.get("AWS_CONFIG_FILE")) print("AWS_SHARED_CREDENTIALS_FILE:", os.environ.get("AWS_SHARED_CREDENTIALS_FILE")) # 打印当前用户家目录 print("当前用户家目录:", os.path.expanduser("~")) # 检查配置文件可读性 config_path = "/home/airflow/.aws/config" print(f"配置文件是否可读: {os.access(config_path, os.R_OK)}")
- 跳过自定义的
Boto3AwsClient类,直接用原生boto3测试配置是否正常:
import boto3 try: session = boto3.Session(profile_name="profile3") client = session.client("ssm") print("原生boto3读取profile成功") except Exception as e: print(f"原生boto3报错: {e}")
如果原生boto3能正常运行,说明问题出在你自定义的Boto3AwsClient封装逻辑中。
解决方案
方案1:修正挂载路径(优先推荐)
直接将AWS配置挂载到airflow用户默认家目录下,无需额外配置环境变量:
修改docker-compose中的卷挂载配置,替换原有~/.aws/:/home/airflow/.aws为:
- ~/.aws/:/opt/airflow/.aws
同时确保宿主机的.aws目录有读取权限:
chmod -R 755 ~/.aws
重启容器即可生效。
方案2:确认环境变量正确传入进程
如果你不想修改挂载路径,确保两个AWS环境变量写入到docker-compose指定的./airflow.env文件中,而不是写在shell配置文件里,只有写在env_file指定的文件中,Airflow进程启动时才能正确读取。
方案3:代码中强制指定配置路径
如果以上方案都不适用,可以在初始化boto3前强制写入环境变量:
import os import boto3 os.environ["AWS_CONFIG_FILE"] = "/home/airflow/.aws/config" os.environ["AWS_SHARED_CREDENTIALS_FILE"] = "/home/airflow/.aws/credentials" session = boto3.Session(profile_name="profile3") aws_client = session.client("ssm")
内容的提问来源于stack exchange,提问作者mrc
相关产品推荐
相关产品推荐

