C#でのAzure Functionsの呼び出しにはまった
Azure Functions(HttpTrigger)で何らかのFunctionsを追加すると、通常は、
https://xxxxxx.azurewebsites.net/api/xxxxx的なURLが作成されます。
で、以下のコードを書きました。
WebClient wc = new WebClient(); string url = "https://xxxxxx.azurewebsites.net/api/xxxxx"; Stream st = wc.OpenRead(url); Encoding enc = Encoding.GetEncoding("utf-8"); StreamReader sr = new StreamReader(st, enc); string html = sr.ReadToEnd(); sr.Close(); st.Close(); Console.WriteLine(html);
そうると、、、、呼び出し時にエラーとなります。
>bin\Debug\ConsoleApplication1.exe ハンドルされていない例外: System.Net.WebException: 接続が切断されました: 送信時に、予期しないエラーが発生しました。。 ---> System.IO.IOException: 転送接続からデータを読み取れません: 既存の接続はリモート ホストに強制的に切断されました。。 ---> System.Net.Sockets.SocketException: 既存の接続はリモート ホストに強制的に切断されました。 場所 System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) : :
Functionsの何か書き方がまずいのかとか、、、半日くらいいろいろ試行錯誤しました。
一晩寝たところ、なんと https を http に変えたら動くんじゃないかという神のお告げが。。。。
そして見事動きました!
でも何か悶々としていて、数日後にググってみると、今のページへめぐり逢い。。。。
fullvirtue.com
ちなみにHttpClientでも同様なようです。
qiita.com
なんと、一行追加するだけで動きましたとさ。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; WebClient wc = new WebClient(); string url = "https://xxxxxx.azurewebsites.net/api/xxxxx"; Stream st = wc.OpenRead(url); Encoding enc = Encoding.GetEncoding("utf-8"); StreamReader sr = new StreamReader(st, enc); string html = sr.ReadToEnd(); sr.Close(); st.Close(); Console.WriteLine(html);
めでたしめでたし。
WSL上のdocker engineの試行錯誤
Azure FunctionsでPythonを使うメモ(LinuxイメージのFunction追加&pyodbc&fbprophet編)
(2019/1/23訂正)
LinuxイメージのAzure FunctionsへのFunction追加ですが、基本はバイナリ依存するようなモジュールはすんなり追加できません。
それでも、pyodbcだと「--build-native-deps --no-bundler」だけでいけたのですが、fbprophetに結構苦戦して、できたりできなかったりしていたのですが・・・。
結論:fbprophetのビルドには大量にメモリを使うので・・、docker for windows上でやるときはメモリをたくさん割り当てる必要がある
作業は、WSL(Ubuntu)+docker for windows(Windows 10 pro)で実行したのですが、docker for windowsで作業する場合、VMに割り当てるメモリを設定できます。1時期4GBにしたことがあったのですが、基本は2GBでやってました。が、これがいけなかった。
2GBだとビルドも時間がかかり、挙句の果てにはエラー。4GBは割り当てましょう!
ちなみにfbprophetは、Facebook社開発の予測ライブラリです。
facebook.github.io
xxxxxx$ python -m venv venv xxxxxx$ source venv/bin/activate (venv) xxxxxx$ func init Select a worker runtime: 1. dotnet 2. node 3. python Choose option: 3 python Installing wheel package Installing azure-functions==1.0.0a5 package Installing azure-functions-worker==1.0.0a6 package Running pip freeze (venv) xxxxxx$ func --version 2.3.148 (venv) xxxxxx$ pip install pyodbc (venv) xxxxxx$ pip install fbprophet (venv) xxxxxx$ pip install scipy (venv) xxxxxx$ pip install statsmodels (venv) xxxxxx$ pip freeze > requirements.txt (venv) xxxxxx$ vi requirements.txt (※「pkg-resources==0.0.0」を削除) (venv) xxxxxx$ func host start (※ローカルでの稼働を確認) %%%%%% %%%%%% @ %%%%%% @ @@ %%%%%% @@ @@@ %%%%%%%%%%% @@@ @@ %%%%%%%%%% @@ @@ %%%% @@ @@ %%% @@ @@ %% @@ %% % : : : (venv) xxxxxx$ func azure functionapp publish MyXxxxxxFunc --build-native-deps --no-bundler Getting site publishing info... Running 'docker pull mcr.microsoft.com/azure-functions/python:2.0'...done Running 'docker run --rm -d mcr.microsoft.com/azure-functions/python:2.0'....done : : : (venv) xxxxxx$
Azure FunctionsでPythonを使うメモ(LinuxイメージのFunction追加編)
前回、DockerImage編でうまくいきましたが、DockerImageだと従量課金を選べないので、なんとかFunctinを登録する方式を探していました。ただ、思わぬ苦戦。単純な関数でもうまくデプロイできずに困っていました。
ところが、以下の投稿を発見して解決。
github.com
「pkg-resources==0.0.0」という行が、pip freezeで追加されるバグがあるようです。この行をrequirement.txtから削除することでデプロイして実行できました!どうぞお試しください!
Azure FunctionsでPythonを使うメモ(Dockerイメージ編)
Azure FunctionsはAzureのサーバーレス環境。Dockerイメージを作りそれを実行するパターンでやります。投稿を書いている時点では、Pythonサポート自体もプレビューなので、さほど情報も多くないです・・。
基本的なところは以下のページを参考に。
docs.microsoft.com
ちなみに、私の環境にはDocker or Windowsを入れるところからだったのでそこそこ長い時間をかけました。
- Windows 10をproにアップグレード
- Docker for windowsをインストール (ネットワークの設定を修正しないと使えなかった) ※前の投稿参考
- Azure系のツールをインストール ※パスを通すことを忘れない
venvの環境へプロジェクト作成
Azure functionsを作成する場合はvenv環境で実施する必要があります。
qiita.com
python -m venv venv venv\Scripts\activate func init MyFunc --docker (pythonを選択)
Functionを作成
cd MyFunc (venv) func new --name "HttpTriggerMyFunc" --template "HttpTrigger" (venv) docker build --tag my_func . docker run -p 8080:80 -it my_func
この状態でlocalhost:8080にアクセスしてみると以下の画面が表示されました!そして、apiである、http://localhost:8080/api/HttpTriggerMyFunc?name=Taro にアクセスすると、「Hello Taro!」と表示されましたよ。