如何解决AWS MWAA调用Cloudera CDP脚本的SSH依赖缺失问题?
解决MWAA中
airflow.providers.ssh模块找不到的问题 核心问题分析
你的MWAA环境为私有VPC+私有Web服务器,导致依赖安装时无法访问公网资源(如PyPI、Airflow约束文件的公网地址),这是安装失败的根本原因;同时直接通过plugin.zip上传.whl包的方式不符合MWAA对官方Provider插件的加载逻辑。
分步解决方案
1. 解决VPC网络访问限制
MWAA在私有VPC环境下安装依赖需要访问外部资源,需做以下配置:
- 为MWAA执行角色添加S3存储桶的读写权限,确保能读取存储桶内的依赖文件
- 在VPC中配置NAT网关,让MWAA环境可通过NAT访问公网;或配置对应VPC端点:
- 添加PyPI相关的VPC端点(若使用AWS Marketplace提供的PyPI镜像)
- 添加S3的VPC端点,保障存储桶资源的访问
- 添加CloudWatch Logs的VPC端点,便于查看依赖安装日志
2. 正确配置requirements.txt
放弃公网约束文件链接,改用本地预下载依赖的方式:
- 在本地Python3.11环境中,下载符合Airflow2.10.1约束的
apache-airflow-providers-ssh及所有依赖:pip download apache-airflow-providers-ssh -c https://raw.githubusercontent.com/apache/airflow/constraints-2.10.1/constraints-3.11.txt -d ./deps - 将下载的所有
.whl文件上传至MWAA存储桶的requirements目录(示例路径:s3://你的MWAA存储桶/requirements/) - 修改
requirements.txt内容,直接引用存储桶内的依赖包:
注意替换为你的实际存储桶路径--find-links s3://你的MWAA存储桶/requirements/ apache-airflow-providers-ssh
3. 修正SSHOperator代码导入逻辑
确保代码导入正确的模块,避免隐性加载错误:
from airflow.providers.ssh.operators.ssh import SSHOperator # 从Secrets Manager获取hostname、username、password的逻辑省略 run_script = SSHOperator( task_id="run_test_script", ssh_conn_id=None, command="sudo -u etl_app bash /path/to/test.sh", remote_host=hostname, username=username, password=password, dag=dag, )
4. 验证安装与DAG加载
- 更新MWAA环境,触发依赖重新安装流程
- 查看CloudWatch Logs中的
mwaa-environment-update日志,确认依赖安装成功 - 上传DAG文件至MWAA的DAG存储路径,检查是否能正常加载
额外注意事项
- 不要通过plugin.zip上传官方Provider包:MWAA的插件机制用于自定义Operator/Hook,官方Providers必须通过requirements.txt安装
- 确保MWAA执行角色权限充足:需包含Secrets Manager读取权限、S3存储桶权限、VPC资源访问权限
内容的提问来源于stack exchange,提问作者Sunil Rastogi
相关产品推荐
相关产品推荐

