🌍

Azure App Service で Bokeh アプリをデプロイする記事を実践してみた

2022/02/18に公開

2022/3/1追記 Azure にデプロイしていたアプリは公開停止しました。

下記の記事をもとに Azure AppService で Bokehアプリをデプロイしてみました。

https://azure101.medium.com/standalone-bokeh-server-on-azure-web-app-9c336e8094bb

やっていることは基本記事通りですが、苦労もしたのでまとめます。

私がデプロイしたアプリはこちら
-> 2022/3/1 で公開停止しました

2022年2月いっぱいでデプロイ停止するのでご了承ください。

アプリ自体はこちらのGitHubで公開されてますし、そもそも Bokeh の公式ドキュメントにて公開されているものそのままです。

Pythonは3.8で検証しています。

実際自分が使ったファイルをGitHubにあげています、もともと記事のGitHubを流用しているので微妙ですが、yaml ファイルで更新した箇所にコメントを入れたので、yamlファイルはご参考になるかもしれません。

実行手順の概要

  • Bokehでアプリを実行するファイル(app.py)を作成する
  • ローカルで実行して動くか確かめる
  • AzureAppServiceのリソースを作成する
  • AzureDevOpsのPipelineで環境(environment)を作成する
  • AzureDevOpsのリソースを作成する
  • AzureDevOpsにコードをアップロードする
  • AzureDevOpsの環境(environment)を作成する
  • AzureDevOpsの設定でServiceConnectionの設定をする
  • AzureDevOpsのPipelineを作成する
  • AzureDevOpsのパラレル処理の申請を行う
  • 2〜3営業日待ってパラレル処理の許可がおりたらPipelineを実行する

Bokehでアプリを実行するファイル(app.py)を作成する

今回は先述の通り、アプリ自体はこちらのGitHubをそのまま使っています。

ローカルで実行して動くか確かめる

下記コマンドをCLIで入力してローカルで動くか確かめましょう。

bokeh serve app.py --show

AzureAppServiceのリソースを作成する

AzureAppServiceのリソース作成については下記記事をご参照ください。

https://www.purin-it.com/azure-portal-app-service

AppServiceの構成の全般設定で必要な設定を変更する

記事で触れられていますが、AppService の構成の全般設定でいくつか設定を変更する必要があります。

  • スタートアップコマンドに下記のコマンドを修正して入力
python -m bokeh serve app.py --port 8000 --address 0.0.0.0 --unused-session-lifetime 5000 --check-unused-sessions 5000 --allow-websocket-origin=mywebserver.azurewebsites.net

python の実行ファイル名(app.py) と AppService の URL(mywebserver.azurewebsites.net) の部分は適宜更新ください。

  • Web ソケットを オン にする

Web ソケットの設定変更は ベーシックプラン以上でないと変更できないっぽいのでベーシックプラン以上にしておきましょう。

AzureDevOpsのリソースを作成する

Azure DevOps のサイトから作成しましょう。

https://azure.microsoft.com/ja-jp/services/devops/

AzureDevOpsのRepoにコードをアップロードする

リポジトリの使い方は、概ねGitHubと同じです。

簡単に後述しますが、DevOps の Pipeline 作成時に、GitHub と連携させて GitHub からデータを取り込むこともできるようです。

AzureDevOpsのPipelineで環境(environment)を作成する

DevOpsの環境(Environments)タブをクリックし、 New environment をクリックします。

設定画面で Name を更新します。

この名称を yaml ファイルに記載する必要があるので控えておきましょう。

その際リソースはとりあえず None でよいようです。

https://docs.microsoft.com/ja-jp/azure/devops/pipelines/library/service-endpoints?view=azure-devops&tabs=yaml#create-a-service-connection

AzureDevOpsの設定でServiceConnectionの設定をする

左下の歯車(設定アイコン)をクリックし、New service connection で Azure Resource Manager を選択します。

Service principal (automatic) を選択します。

ポップアップで Azure にログインを求めてくるのでログインし、リソースグループを選択します。

任意の Service connection name を設定。この名称を yaml ファイルに記載する必要があるので控えておきましょう。

あとは変更せず保存しましょう。

https://docs.microsoft.com/ja-jp/azure/devops/pipelines/process/environments?view=azure-devops

AzureDevOpsのPipelineを作成する

DevOps の Pipeline タブをクリックし、New Pipeline をクリックします。

Code を選択します。

さきほど DevOps に挙げたコードを使いますので、 Azure Repos Git を選択します。

Python package を選択します。

yaml ファイルの更新画面になるので、こちらを参考に更新しましょう。

Save and Run で Save を選択しましょう。

補足

なお、すでにGitHub等にAzurePipelineの.yamlファイルがある場合は、pipeline実行時に、GitHubリポジトリを選択して連携し、Existing Azure Piplelines YAML file を選択 しましょう。

AzureDevOpsのパラレル処理の申請を行う

Pipeline の設定を終え、いざ Pipeline を実行するとエラーが出ました。

No hosted parallelism has been purchased or granted. ...(略)  

エラーを読むと、DevOps の無料プランだとパラレル処理できません。したかったら申請してね!URLはこちら(意訳)、という内容でしたので申請してみました。

エラーの中に申請用URLも書いてあるので同じエラーに遭遇した方はエラー内容を参照ください。

こちらの記事でもURLが紹介されてます。

https://devblogs.microsoft.com/devops/change-in-azure-pipelines-grant-for-private-projects/

そのとき DevOps の Organization の名称を記載する必要がありますので、間違えずに記載しましょう。

自分はプロジェクト名と間違えそうになりました...。

自分の場合だと DevOps の画面の bokehapp のところが Organization の名称でした。

なお、bokeh はプロジェクト名です。

2〜3営業日待ってパラレル処理の許可がおりたらPipelineを実行する

こんな感じで申請が通った旨のメールが来ればOKです。

自分の場合は 2営業日くらいで許可メールがきました。

早速Pipelineを実行しましょう。

Pipeline 実行時に、環境とPipelineの許可を求められるので、Permission needed をクリックして実行を許可します。

大体数分くらいでデプロイが終わりました。

ついでに先日ブログに書いたルート最適化アプリもデプロイできました。
-> 2022/3/1 で公開停止しました。

こちらも2月いっぱいでデプロイ停止しますので悪しからず。

以上になります、最後までお読みいただきありがとうございました。

Discussion