带有 ComputeEngineSSHHook 的 SSHOperator

SSHOperator with ComputeEngineSSHHook

我正在尝试 运行 通过 SSHOperator 在气流中的 GCP VM 中使用 ssh 的命令,如所述 here:

ssh_to_vm_task = SSHOperator(
    task_id="ssh_to_vm_task",
    ssh_hook=ComputeEngineSSHHook(
        instance_name=<MYINSTANCE>,
        project_id=<MYPROJECT>,
        zone=<MYZONE>,
        use_oslogin=False,
        use_iap_tunnel=True,
        use_internal_ip=False
        ),
    command="echo test_message",
    dag=dag
)

但是,我得到一个 airflow.exceptions.AirflowException: SSH operator error: [Errno 2] No such file or directory: 'gcloud' 错误。

Docker 按照 these 说明通过 docker-compose 安装。

其他 Airflow GCP 运算符(例如 BigQueryCheckOperator)可以正常工作。所以乍一看这不像是配置问题。

你能帮帮我吗?这是一个错误吗?

检查是否允许 TCP 端口 22 通过 GCP VM 实例上的防火墙,并确保该 VM 实例也允许 SSH 访问并在该 VM 实例中正确配置。此外,请确保您尝试在 VM 实例上使用 SSH 的 IP 已通过防火墙列入白名单。

您可以在 GCP 中使用以下命令来检查包含目标 VM 实例的网络的入口防火墙规则。此外,您可以参考此[link]了解更多信息。

这是您必须执行的操作的示例。 ´´´

gcloud compute firewall-rules list --filter network=[NETWORK-NAME] \
    --filter INGRESS \
    --sort-by priority \
    --format="table(
        name,
        network,
        direction,
        priority,
        sourceRanges.list():label=SRC_RANGES,
        destinationRanges.list():label=DEST_RANGES,
        allowed[].map().firewall_rule().list():label=ALLOW,
        denied[].map().firewall_rule().list():label=DENY,
        sourceTags.list():label=SRC_TAGS,
        sourceServiceAccounts.list():label=SRC_SVC_ACCT,
        targetTags.list():label=TARGET_TAGS,
        targetServiceAccounts.list():label=TARGET_SVC_ACCT
        )"

´´´

问题似乎是默认情况下 gcloud 未安装在 docker 容器中。这已通过 here 中的说明解决:有必要添加

RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg  add - && apt-get update -y && apt-get install google-cloud-sdk -y
      

到用于安装气流/安装依赖项的docker文件。