带有 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文件。
我正在尝试 运行 通过 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文件。