背景
問題
response = os.system("ping -c 1 " + ip_address)
を介して)マシンにpingするために使用されるpythonをテストしましたが、0、つまりアクティブネットワークを返しました。ペーストビンの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)
私にとってうまくいったのは、応答部分を削除することです。これがコードです:
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())
私の意見を述べさせてください。
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に到達するまでに時間がかかるだけです。
Composerで作成されたVMに「ping」がインストールされている可能性は低いです。これらは標準のイメージです。基本的にLinuxの「ping」コマンドを呼び出していると思いますが、Linuxにインストールされていないため失敗しますnode/vm。したがって、別の方法でサーバーに「ping」するように実装を変更する必要があります。
ComposerノードVMにSSHで接続し、「ping」をインストールしてから、DAGを再実行できます。ただし、機能しても、クリーンなソリューションとは見なさず、スケーリングしません。ただし、パイロットのためにこれを行っても大丈夫です。
最後に、目的がPythonスクリプトを実行することである場合、DAG内から Python Operator を使用することを考えましたか?何らかの方法で=の実行を分離したい場合Python DAG自体からのスクリプト。代替は、PubSub + CloudFunctionの組み合わせを使用することです。
外部IPに到達できないための他の考えられる原因は、ファイアウォールルールの設定が間違っています。これを修正するには、次のことを行う必要があります。