首次使用GCP:通过BashOperator在Compute Engine执行Python脚本遇文件缺失问题
问题:GCP Composer通过BashOperator在Compute Engine执行Python脚本找不到文件?
我首次使用GCP,尝试通过BashOperator在Compute Engine上执行Python脚本。我将Python脚本存储在Composer所在的存储桶中,但运行BashOperator时出现文件未找到错误。
相关代码
bash_task = bash_operator.BashOperator( task_id='script_execution', bash_command='gcloud compute ssh --project '+PROJECT_ID+ ' --zone '+REGION+' '+GCE_INSTANCE+ '--command python3 script.py', dag=dag)
报错信息
python3: can't open file '/home/airflow/gcs/dags/script.py': [Errno 2] No such file or directory
解决方案
核心问题是:通过gcloud compute ssh执行命令时,是在目标Compute Engine实例的本地环境中查找script.py,但你把文件存在了Composer的存储桶里,GCE实例无法直接访问这个跨环境路径。
以下是两种可行的处理方案:
方案一:将脚本复制到GCE实例本地后执行
先通过gsutil cp把Composer存储桶里的脚本复制到GCE实例的本地目录,再执行脚本。修改后的BashOperator代码如下:bash_task = bash_operator.BashOperator( task_id='script_execution', bash_command='gcloud compute ssh --project '+PROJECT_ID+ ' --zone '+REGION+' '+GCE_INSTANCE+ ' --command "gsutil cp gs://[你的Composer存储桶完整路径]/script.py ~/ && python3 ~/script.py"', dag=dag)注意替换
[你的Composer存储桶完整路径]为实际地址,比如your-composer-bucket-name/dags/script.py。方案二:直接从存储桶读取脚本内容并执行
无需下载文件到GCE本地,通过gsutil cat将脚本内容传递给Python执行,适合小型脚本:bash_task = bash_operator.BashOperator( task_id='script_execution', bash_command='gcloud compute ssh --project '+PROJECT_ID+ ' --zone '+REGION+' '+GCE_INSTANCE+ ' --command "gsutil cat gs://[你的Composer存储桶完整路径]/script.py | python3"', dag=dag)
额外注意:要确保GCE实例关联的服务账号拥有访问Composer存储桶的权限(至少需要storage.objects.get权限),否则会触发权限不足的错误。
内容的提问来源于stack exchange,提问作者avinash reddy
相关产品推荐
相关产品推荐

