Microsoft Azureでのfunctionアプリのデプロイ方法

あまりネット上にも情報がなくて、ドキュメント読んでもよくわからないエラーが多く、GPTもループしだしながら、function appのエラーがわかりました。

結論からいうと、ケチらず有償プランにしましょうということです。

function appの場合は、トリガーを用意して、トリガーによってプログラムが動くため、非常に効率的にアプリをデプロイできます。

代表的なトリガーはこんな感じ。

トリガーの種類 説明
HTTPトリガー HTTPリクエストを受け取って関数が実行されます。APIのエンドポイントとしてよく利用されます。
タイマートリガー 指定されたスケジュール(Cron形式)に基づいて定期的に関数を実行します。
Blobトリガー Azure Blob Storageにファイルが追加または更新されたときにトリガーされます。
キュートリガー Azure Queue Storageにメッセージが追加されるとトリガーされます。
イベントハブトリガー Azure Event Hubsにイベントが送信されるとトリガーされます。
サービスバストリガー Azure Service Busのキューまたはトピックにメッセージが到着するとトリガーされます。
Cosmos DBトリガー Azure Cosmos DBに変更があったときにトリガーされます。
SignalRトリガー SignalRを利用してリアルタイムでクライアントにメッセージを送信する際に使用されます。
Event Gridトリガー Azure Event Gridからのイベントに基づいてトリガーされます。
SendGridトリガー SendGridを通じたメール送信に基づいてトリガーされます。

特にアプリを作ったりするわけではない一般ユーザーの場合は、タイムトリガーが多いのではないでしょうか?

もちろんPythonなどの場合は、タイムスケジュールはスクリプト内に埋め込むことができますが、やはりPCなりなんらかのデバイスが起動していないと・・・というのは、精神的に重い気分になります。

azureの通常のアプリ作成の場合は、リソースが常に減っていきますのでfunctionが便利ですというわけですね。

筆者の場合は、いくつかのブログ運営のテーマとなっているジャンルのニュースの自動更新を定時実行でしていたりしています。

もちろん当サイトの分析なども毎日定時実行しています。

ファイル構造のコツ

コツというよりも、基本的なfunctionアプリのファイル構造があり、これを理解しておく必要があるわけです。

/Users/あなたの絶対パス/MyFunction(仮名)/
  ├── function1/  # 既存の関数
  │   ├── __init__.py
  │   └── function.json
  ├── function2/  # 新しい関数フォルダ
  │   ├── __init__.py
  │   └── function.json
  ├── requirements.txt
  ├── host.json
  └── local.settings.json

functionアプリの構造自体は、一つのPlan、アプリに対して実質いくつでもデプロイできます。

構造は、__init__.pyが実行ファイルになります、function.jsonにトリガーを記入。

例えば、新しいアプリを日本時間の毎朝6時に実行するためには、タイマートリガーのスケジュールをUTC時間に合わせて設定する必要があります。

日本時間(JST)はUTC+9時間なので、毎朝6時に実行したい場合、UTCでは**21時(前日の夜)**に設定する必要があります。

{
  "bindings": [
    {
      "name": "mytimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 0 21 * * *"  // 毎日UTCの21時に実行(日本時間の朝6時)
    }
  ]
}

タイマートリガーのルール

例えば曜日を指定して、日本時間の月曜日から金曜日の朝7時にだけ実行するように、Azure Functionsのタイマートリガーのスケジュールを設定することは可能です。

タイマートリガーのcronスケジュール式を使うことで、特定の曜日に実行するように設定できます。

cron式は、曜日を指定することができ、* * * * * 形式で以下の順に時間や日付を指定します。

cron式のフォーマット

コードをコピーする{分} {時} {日} {月} {曜日}
  • : 0-59
  • : 0-23 (UTC時間で記述)
  • : 1-31
  • : 1-12
  • 曜日: 0-6 (0=日曜日, 1=月曜日, … , 6=土曜日)

日本時間の月〜金の朝7時に実行する場合

  • 日本時間の朝7時は、UTC時間の22時になります(日本はUTC+9)。
  • 月曜日から金曜日までに実行するには、{曜日} の部分を1-5に設定します。

それを、関数名のファイルにフォルダ分けして、requirements.txtにこのルートフォルダに入れているプログラムすべての関連ライブラリの名前を記入していきます。

ちなみに、バージョンを指定して記述できます。

requests==2.28.1
pandas==1.5.0
matplotlib==3.5.3
yfinance==0.2.18
azure-functions==1.11.2

これで、MyFunctionごとデプロイというニュアンス。

ちなみに消費プランですと、なかなかエラー続出。

リソースが足りてなかったことが判明しました。

NEWS APIでニュース取得して、deep L APIで翻訳して、HTML投稿するだけのプログラムでしたが、ギリギリその一個だけデプロイできる感じでした。

なので、Flex従量課金プランでいきましょう。

一応各プランに様子をまとめています。

Azure Functions ホスティングプラン

Azure Functions ホスティングプラン

プラン 説明 主な特徴 最大スケールアウト スケーリング 仮想ネットワーク
消費 (Consumption) 関数が実行されている間だけ課金される従量課金制。 サーバーレス、自動スケーリング、コスト効率 200 イベントドリブン なし
Flex 従量課金 高スケーラビリティと仮想ネットワークサポートを備えた従量課金制。 仮想ネットワーク、高スケーラビリティ 1000 高速なイベントドリブン あり
Functions Premium 専用リソースを使用し、イベントドリブンスケーリング。 専用コンピューティング、常時利用可能 100 イベントドリブン あり
App Service Webアプリと関数アプリを同じプランで実行。 メトリックベース、仮想ネットワークサポート 40-60 メトリックベース あり
Container Apps コンテナと関数アプリをホストし、KEDAでスケーリング。 イベントドリブン(KEDA)、仮想ネットワーク 300 イベントドリブン (KEDA) あり

functionアプリの作成

azureポータルで簡単に作成できます。

Function Appの作成

  1. 左側メニューの「リソースの作成」をクリックします。
  2. Function App」を検索し、クリックします。
  3. **「作成」**をクリックして、Function Appを作成するプロセスを始めます。

3. 基本設定の入力

  • サブスクリプション: 使用するAzureサブスクリプションを選択。
  • リソースグループ: 既存のリソースグループを選択するか、MyFunctionResourceGroupなどの新しいリソースグループを作成します。
  • Function App 名: 一意の名前を入力します(例: my-function-app-kotaro)。この名前は、アプリのURLにも使われるので、グローバルで一意のものにします。
  • リージョン: 自分に近いリージョンを選択します(例: East US、West Europeなど)。
  • ランタイムスタック: Python を選択。
  • バージョン: Pythonのバージョンを選択(例: Python 3.9など)。
  • OS: Linux を選択(Pythonの場合はLinuxが推奨されます)。
  • プランの種類: 消費(サーバーレス)プランを選択します。これは、使った分だけ支払うサーバーレスプランです。

4. ストレージの設定

  • ストレージアカウント: Azure Functionsはデータの保存やトリガーの管理にAzure Storageを利用するため、既存のストレージアカウントを選択するか、新しいストレージアカウントを作成します。通常、「新規作成」を選び、システムが自動で生成した名前を使います。

5. 監視の設定

  • Application Insights: Application Insightsを有効にすることで、アプリのパフォーマンス監視やログの確認が可能になります。通常は有効にします。

こんな感じでデプロイしていくわけです。

細かいところを解説していけばキリがないので、コツとポイントだけシェアさせていただきました。

結構長時間苦戦している方は、プランを変えてアプリ作成してみるとすんなり解決するかもしれません。

あとは、フォルダ構造、アプリ名.pyファイルだとダメで、アプリ名(つまり関数名にしてもいい)はフォルダ名として管理し、プログラム自体は、どのアプリ、プログラム名も__init__.pyでファイル作成するようにしてください。

デプロイ自体は、az loginでログインし、cdコマンドでディレクトリに移動し

func azure functionapp publish あなたのアプリ名 --python

これでプッシュできます。

トレードボットも監視もリアルタイムデータ分析も、トリガー管理してリソースをうまく分散させていきましょう。