Azure App Servicesアプリケーション内のlocalhostへのリクエスト


8

診断情報を含むリクエストをリッスンする継続的なWebジョブがあります。

接続をテストするために、Webジョブでヘルスチェックを実行しようとしましたが、Azureアプリサービスのドキュメントごとにlocalhostにリクエストを送信できません。

以下のコードは、デプロイしたアプリケーションから接続できることを確認するために使用するコードです。

    var uri = new Uri("http://localhost:8989/ping");
    var response = await client.GetAsync(uri);

私はこの例外を受け取ります:

System.Net.Http.HttpRequestException: An error occurred while sending the request. 
---> System.Net.WebException: Unable to connect to the remote server 
---> System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions 127.0.0.1:8989

Webジョブは、Kudu(SCM)を介してサイト拡張機能のインストールスクリプトを介してインストールされます。つまり、Webジョブは最終的にKudu(SCM)の子プロセスです。起動時にWebジョブアプリケーションはポート8989にバインドされます。アプリケーションをWindowsでローカルに起動すると、問題なくヘルスチェックを実行できます。

Azureアプリサービスのドキュメントでは、同じサンドボックス内のアプリケーションがポート(https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#local-address-リクエスト)。

Azureアプリサービスのドキュメントには、Kuduがメインアプリケーションと同じサンドボックスで実行されると記載されています(https://github.com/projectkudu/kudu/wiki/Kudu-architecture#security-model)。

http経由でWebジョブとの通信を有効にするにはどうすればよいですか?

できれば、サイト拡張機能のインストールプロセスでできることですが、どのオプションでもかまいません。

アップデート12-26-2019:

SCMとメインアプリケーションをWEBSITE_DISABLE_SCM_SEPARATION=truehttps://github.com/projectkudu/kudu/wiki/Configurable-settings#use-the-same-process-for-the-user- site-and-the-scm-site)。

ドキュメントには、それらがすでに同じサンドボックスで実行されており、プロセスが同じサンドボックスのポートでリッスンする場合、それらのリクエストは機能するはずであると記載されています。注目に値するのは、実際のSCM w3wp.exeプロセスが、私のWebジョブでhttpを使用してlocalhostをヒットできることです。ただし、この設定では状況は改善されないようです。

更新04-02-2020:

私は公式にWebジョブを使用することを断念し、メインアプリケーションインスタンスの子としてプロセスを開始しました。これによりlocalhost:8989、問題なく通信できます。

今は自分のキープアライブロジックを管理する必要があります。

可能であれば、TCPを介してWebジョブと通信する方法があるかどうかを知りたいです。


:これは私が見つけた最も類似質問ですstackoverflow.com/questions/56572039/...
コリン・ヒギンズ

アクセスの問題は、Kuduへの認証/承認から生じている可能性があります。親切に、クライアントインスタンス作成の詳細を共有してください。
Igweカル

これは、リクエストがアプリケーションのコンテキストからも離れる前です
colin-higgins

1
私の答えで提案したように、ソケット接続はコンテナWebJobs内で実行されるため、有効になっていませんIHost。追加の詳細は私の答えにあります。
イグウェカル

1
GitHub上のWikiドキュメントは常に最新であるとは限りません。公式文書もありません。これでうまくいくかどうか疑問に思います...
ショーンフェルドマン

回答:


0

http経由でWebジョブとの通信を有効にするにはどうすればよいですか?

いいえ。WebJobがlocalhost経由でサイトにリクエストを直接送信することはできません。この制限は、指定したサンドボックスページに記載されています。

ローカルアドレス(localhost、127.0.0.1など)およびマシン自体のIPへの接続試行は失敗します。ただし、同じサンドボックス内の別のプロセスが宛先ポートでリスニングソケットを作成した場合は例外です。

.NETから127.0.0.1:80への接続を試行する次の例のように、拒否された接続試行は、上記の例外になります。

詳細については、このSOスレッドを参照してください。


あなたはウェブの仕事がサイトにリクエストを送ることができないと言います、しかし私は反対の方向を望みます。また、「同じサンドボックス内の別のプロセスが宛先ポートにリスニングソケットを作成した場合を除いて」、私はそれが可能であると信じています。
colin-higgins

0

この問題は、アプリに割り当てられているポート(8989)に関連していると思います。ポート8989でリクエストを開いて受信するには、別のサービス(古いクラウドサービス)、仮想マシン、またはService Fabricを使用する必要があります。

それに関する詳細:

ネットワークエンドポイントリスニングアプリケーションにアクセスできる唯一の方法

インターネット経由では、すでに公開されているHTTP(80)およびHTTPS(443)TCPポートを使用します。アプリケーションは、インターネットから到着するパケットを他のポートでリッスンしない場合があります。ただし、アプリケーションは、サンドボックス内からの接続をリッスンできるソケットを作成する場合があります。たとえば、同じアプリ内の2つのプロセスがTCPソケットを介して互いに通信する場合があります。同じマシン上にあるにもかかわらず、サンドボックスの外部から着信する接続試行は失敗します。詳細については、次のトピックを参照してください。

https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox


また、動的に空きポートを選択した場合も機能しませんでした。
colin-higgins

0

WebJobにHTTPサーバーを実装しないでください。これは、HTTPサーバーを実行することを意図したものではないためです。

WebJobは基本的に、バックレス処理タスクを容易にすることができるヘッドレスサービス用に設計されたIHostコンテナー内で実行されます。異なりIWebHostIHostはウェブホスティングには適していません。

したがって、作成したWebJobは、言及したポートに効果的にバインドされていない可能性があります。その場合、サンドボックスのセキュリティポリシーにより、サイトおよびkuduサービスへのアクセスのために公開されたソケット以外のユーザーが作成した任意のソケットへのアクセスが制限される可能性があります。これは、共有したエラースタックトレーススニペットでSystem.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions 127.0.0.1:8989によって正確に示されました。

http経由でWebジョブとの通信を有効にするにはどうすればよいですか?- WebJobとの通信を介して確立することができるWebJobsのAPI

試行したHTTPサーバーの実装が意図するさまざまな機能を満たすために、複数の Webジョブを作成する必要がある場合があります。

参考文献

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.