7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【初心者向け】Azure Functions をローカルで実行してみる

Posted at

はじめに

本記事は「これからAzure Functionsを始めようとしている方向け」の記事になります。
まずはAzureへのデプロイの前、ローカル環境構築~ロカールでお試しに動かすまでとなります。

Azure Functiosとは

まとめるとサーバレスでスクリプト実行できるPaaSサービスです。
ここでサーバーレスとはサーバーを使わないという意味ではなくサーバーはAzureが管理するためユーザは管理する必要がないということになります。

詳しくは公式ドキュメントをご覧下さい。
Azureuf Functionsの公式ドキュメント

この記事ので行うこと

Windows環境で、Azureuf Functionsの公式ドキュメントに沿ってPythonを例にローカルにFunctionsプロジェクトを作成し、ローカルで実行させます。

前提として VSCodePython は導入されているものとします。

※202/6/29時点でPythonの対応している最新バージョンはAzure Functionsのランタイムが4.xの場合3.10です。またPythonのプログラミングモデルv2が対応したのでそちらを採用しています。

※この記事ではAzure Functionsのランタイムは4.x、Pythonのバージョンは3.10で進めます。

環境準備

Azure Functions Core Tools のインストール

こちら から v4.x - Windows 64 ビット のインストーラをダウンロードしてインストールしてください。
(VSCodeでのデバッグには64ビットである必要があります。)
画面に従えば問題なくインストールできると思います。

たまにVSCodeがAzure Functions Core Toolsを認識せずデバッグできない場合がありますが、端末を再起動すること解消します。

Visual Studio Code の拡張機能のインストール

以下の拡張機能をVSCodeにインストールします。

  • Python拡張機能
    image.png

  • Azure Functions 拡張機能
    image.png

  • Azurite V3 拡張機能
    image.png

プロジェクトの作成

新規に作成したフォルダでプロジェクトを作成します。ここでは~\func_test\というフォルダを作成してそこにプロジェクトを作ります。指示に従っていけばOKです。

image.png

image.png

今回はPythonのプログラミングモデルv2で作成するので画像の一番上を選択します。

image.png

pythonのバージョンを選択します。

image.png

起動トリガーを選択します。HTTP triggerは公式ドキュメントにあるので、今回は Timer trigger を選択します。(他に何があるかは公式ドキュメントをご覧ください。)

image.png

起動関数名を入力します。今回はデフォルトのままにします。

image.png

起動時間(間隔間隔)を設定します。ここでは10分間隔で起動するようにするために0 */10 * * * *と入力します。
※これは後から変更できます。
image.png

次のようなファイルが作られプロジェクトが作成されました。

image.png

稼働確認

  1. 実行されることが分かるように以下のコードを最終行に追加します。

    function_app.py
    ・・・
    print('Hello World')
    
  2. <F1>でコマンドパレットを開きAzurite: StartでAzuriteを起動します。Visual Studio Codeの下部ステータスバーにこのような表示がされればOKです。

    image.png

  3. <F5>でローカル起動します。すると次のようなポップアップが表示されるので、ここでUse Local Emulatorを選択します。

    image.png

    これを選択すると、local.settings.json ファイルの AzureWebJobsStorage という設定値にUseDevelopmentStorage=trueが追加されます。先ににこの設定をしておけば上記ポップアップは出力されません。

    起動すると以下のようにターミナルに出力されると思います。

     フォルダー func-test で実行するタスク: .venv\Scripts\python -m pip install -r requirements.txt 
    
    Requirement already satisfied: azure-functions in c:\~\func-test\.venv\lib\site-packages (from -r requirements.txt (line 5)) (1.15.0)
    
    [notice] A new release of pip is available: 23.0.1 -> 23.1.2
    [notice] To update, run: C:\~\func-test\.venv\Scripts\python.exe -m pip install --upgrade pip
     *  ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。 
    
     *  フォルダー func-test で実行するタスク: .venv\Scripts\activate ; func host start 
    
    .venv\Scripts\activate : このシステムではスクリプトの実行が無効になっているため、ファイル C:\~\func-test\.venv\Scripts\Activate.ps1 を読み込むことができません。詳細については、「about_Execution_Polic
    ies(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
    発生場所 :1 文字:1
    + .venv\Scripts\activate ; func host start
    + ~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : セキュリティ エラー: (: ) []PSSecurityException
        + FullyQualifiedErrorId : UnauthorizedAccess
    Found Python version 3.10.11 (py).
    
    Azure Functions Core Tools
    Core Tools Version:       4.0.5198 Commit hash: N/A  (64-bit)
    Function Runtime Version: 4.21.1.20667
    
    [2023-06-29T07:57:54.454Z] Worker process started and initialized.
    
    Functions:
    
            TimerTrigger: timerTrigger
    
    For detailed output, run func with --verbose flag.
    [2023-06-29T07:57:54.685Z] Executing 'Functions.TimerTrigger' (Reason='Timer fired at 2023-06-29T16:57:54.6576473+09:00', Id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
    [2023-06-29T07:57:54.687Z] Trigger Details: UnscheduledInvocationReason: RunOnStartup
    [2023-06-29T07:57:54.738Z] Hello World
    [2023-06-29T07:57:54.744Z] Python timer trigger function ran at 2023-06-29T07:57:54.735865+00:00
    [2023-06-29T07:57:54.766Z] Executed 'Functions.TimerTrigger' (Succeeded, Id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, Duration=97ms)
    [2023-06-29T07:57:59.422Z] Host lock lease acquired by instance ID 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'.
    [2023-06-29T08:00:00.017Z] Executing 'Functions.TimerTrigger' (Reason='Timer fired at 2023-06-29T17:00:00.0167479+09:00', Id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
    [2023-06-29T08:00:00.023Z] Hello World
    [2023-06-29T08:00:00.024Z] Executed 'Functions.TimerTrigger' (Succeeded, Id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, Duration=7ms)
    [2023-06-29T08:00:00.023Z] Python timer trigger function ran at 2023-06-29T08:00:00.021396+00:00
    

    途中エラーが出るかもしれませんがHello Worldが表示されればOKです。

  4. ターミナル上で<Ctrl + c>を入力すると停止できます。

起動に関する設定の変更

起動設定は次のデコレーターで記述されています。

function_app.py
@app.schedule(schedule="0 */10 * * * *", arg_name="myTimer", run_on_startup=True,
              use_monitor=False) 

このデコレーターについての公式ドキュメントはこちらになります。

各プロパティは次の通りです。

  1. schedule
    起動タイミングを設定します。NCRONTAB式またはTimeSpan値で指定しますが、TimeSpan値はApp Serviceプランでのみしか使えないです。CRON式は後述します。
  2. arg_name
    関数コード内のタイマー オブジェクトを表す変数の名前です。
  3. run_on_startup
    関数をランタイムの開始時に呼び出すかを指定します。つまり、デプロイ直後や、再起動、スケールアウトするときなどに関数がscheduleに関係なく実行されます。プロジェクトはTrueで作成されますが基本的には False を設定します。
  4. use_monitor
    ここにTrueを設定した場合、再起動した場合でもスケジュールが正しく維持されることが保証されます。

NCRONTAB式について

フィールドの各項目は次の通りです。

{second} {minute} {hour} {day} {month} {day-of-week}

例えば 0 5 * * * * であれば second=0, minute=5 なので毎時5分0秒にに実行されます。
* はすべての値を表すので 0 * 5 * * * は5時台に毎分実行されます。
- は範囲をを表すので 5-7 * * * * * であれば毎分5, 6, 7秒の3回実行となります。
, は列挙する際に使えるので 5,8,10 * * * * * は毎分5,8,10秒の3回実行です。
/ は間隔値を示し次のように使用します。0 */5 * * * * これは5分ごとの実行を表します。

month, day-week は数値、名前、もしくは名前の省略形で記述できます。
注意点としてNCRONTAB式は タイム ゾーンは協定世界時 (UTC) です。
ただしLinux従量課金プラン以外ではタイムゾーンの指定ができます。

おわりに

本記事では冒頭に示した通りローカルでAzure Functionsをローカルで実行することを目的としました。いかがでしたでしょうか。
この後、Azureリソースを作成しデプロイを行えばAzure上で実行できます。ただし無料の試用サブスクリプションでないと料金が発生しますのでお気を付けください。

もし記事に訂正などあればコメントでご指摘いただけますと幸いです。

それでは。

参考資料

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?