web-dev-qa-db-ja.com

GCPを使用した気流。 Airflow DAG内の外部IPアドレスにpingできない

背景

  • Google Cloud Platform内のComposer環境を使用してAirflowウェブサーバーを作成しました。つまり、3つのノード、composer-1.10.0-airflow-1.10.6イメージバージョン、マシンタイプn1-standard-1です。
  • この環境用のネットワークはまだ構成していません。
  • エアフローは、単純なテストDAGで正常に機能します。

Airflow webserver

問題

  • 私はping_ip DAGを作成して、物理マシン(つまり私のラップトップ)がインターネットに接続されているかどうかを判断しました。 (コード: https://Pastebin.com/FSBPNnkP
  • ローカルで(response = os.system("ping -c 1 " + ip_address)を介して)マシンにpingするために使用されるpythonをテストしましたが、0、つまりアクティブネットワークを返しました。
  • このコードをAirflow DAGに移動すると、コードは正常に実行されましたが、今回は同じIPアドレスに対して256を返しました。

ペーストビンのDAGコードは次のとおりです。 https://Pastebin.com/FSBPNnkP

上に貼り付けられたトリガーされたDAGのエアフローログは次のとおりです。

[2020-04-28 07:59:35,671] {base_task_runner.py:115} INFO - Job 2514: Subtask ping_ip 1 packets transmitted, 0 received, 100% packet loss, time 0ms
[2020-04-28 07:59:35,673] {base_task_runner.py:115} INFO - Job 2514: Subtask ping_ip [2020-04-28 07:59:35,672] {logging_mixin.py:112} INFO - Network Error.
[2020-04-28 07:59:35,674] {base_task_runner.py:115} INFO - Job 2514: Subtask ping_ip [2020-04-28 07:59:35,672] {python_operator.py:114} INFO - Done. Returned value was: ('Network Error.', 256)
  • サーバーの外部IPのネットワークに問題があると思います。
  • 誰かがGCPが管理するAirflowサービス内から外部IPにpingする方法を知っていますか?
  • 最終目標は、物理マシンにpythonスクリプトの実行を促すDAGを作成することです。このプロセスは、マシンがインターネットに接続されているかどうかを確認する単純なサブDAGから開始する必要があると思いました。私がこれを間違った方法で行っている場合は、lemmeに知らせてください。
4
user2992169

私にとってうまくいったのは、応答部分を削除することです。これがコードです:

import os
def ping_ip():
    ip_address = "8.8.8.8"  # My laptop IP
    response = os.system("ping -c 1 " + ip_address)

    if response == 0:
        pingstatus = "Network Active."
    else:
        pingstatus = "Network Error."
    print("\n *** Network status for IP Address=%s is : ***" % ip_address)
    print(pingstatus)

    return pingstatus

print(ping_ip())
1
Elliot

私の意見を述べさせてください。

Composerはデフォルトで、ICMPプロトコル(ping)を許可するファイアウォールルールを含むdefaultネットワークを使用します。したがって、私はパブリックIPに到達する必要があると思います。たとえば、PYPIパッケージがインストールされている場合、通常は何も特別な構成を行わず、PYPIリポジトリにアクセスできます。

インターネットにアクセスできるマシンは、必ずしもパブリックIPがあることを意味するわけではありません。 NATまたはその他のネットワーク構成(ネットワークは私の専門知識ではありません)の下にあります。インターネット接続のパブリックアドレスを指定していることを確認するには、 https ://www.myip.com/ 。ここには、パブリックIP(例:189.226.116.31)とホストIP(例:10.0.0.30)が表示されます。同様のものを取得する場合は、パブリックIPを使用する必要があります。 1。

ホストIPを使用している場合、そのIPは現在使用している同じプライベートネットワークから到達可能であり、トラフィックがネットワークの外に出ていないため、ローカルで動作している可能性があります。ただし、Composerの場合、DAGがアップロードされている場合、ノードは完全にローカルネットワークの外部にあります。

Pingコード256が何を意味するのかわかりませんでしたが、正しいパブリックIPを使用している場合は、-Wを使用して応答のタイムアウトを増やすことができます。おそらく、IPに到達するまでに時間がかかるだけです。

0
rsantiago

Composerで作成されたVMに「ping」がインストールされている可能性は低いです。これらは標準のイメージです。基本的にLinuxの「ping」コマンドを呼び出していると思いますが、Linuxにインストールされていないため失敗しますnode/vm。したがって、別の方法でサーバーに「ping」するように実装を変更する必要があります。

ComposerノードVMにSSHで接続し、「ping」をインストールしてから、DAGを再実行できます。ただし、機能しても、クリーンなソリューションとは見なさず、スケーリングしません。ただし、パイロットのためにこれを行っても大丈夫です。

最後に、目的がPythonスクリプトを実行することである場合、DAG内から Python Operator を使用することを考えましたか?何らかの方法で=の実行を分離したい場合Python DAG自体からのスクリプト。代替は、PubSub + CloudFunctionの組み合わせを使用することです。

外部IPに到達できないための他の考えられる原因は、ファイアウォールルールの設定が間違っています。これを修正するには、次のことを行う必要があります。

  • 宛先IPへのpingを有効にする下りファイアウォールルールを定義し、ファイアウォールルールを「タグ」に添付します。
  • Composer用に作成されたVM /ノードには、必ず同じ「タグ」を付けてください。
0
Cyac