VS Codeを利用したAzure FunctionsのPython実装例(チュートリアル)
概要
下記公式ドキュメントをもとにHTTP 要求に応答する Python 関数を、Visual Studio Code を使用して作成した際のログを個人の備忘録としてまとめていきます。(ほぼ公式ドキュメントの写経です。)
環境のセットアップ
今回はVSCodeを利用してPythonで実装していくのでPythonのインストールやVSCodeの拡張機能の設定が必要になります。
- VSCode
- Python(version: https://code.visualstudio.com/docs/supporting/requirements#_platforms)
- Azure Functions
- VSCode Azure Functions: Core Tools
- Core ToolsのインストールはVSCodeのコマンドパレットから行う方法とターミナル上で必要なライブラリを一つずつインストールする方法があります
- Azurite:ローカルストレージエミュレーター。実際のAzureストレージアカウントを使用することもできます。
ローカルプロジェクトを作成する
- Visual Studio Code で F1 キーを押してコマンド パレットを開き、コマンド Azure Functions: Create New Project... を検索して実行します。
- プロジェクト ワークスペースのディレクトリの場所を選択し、選択 を選択します。 新しいフォルダーを作成するか、プロジェクト ワークスペースの空のフォルダーを選択する必要があります。(ワークスペースに最初から含まれているプロジェクト フォルダーは選択しないでください)
- プロンプトで次のように情報を入力します
Prompt | 選択 |
---|---|
言語を選択する | Python (Programming Model V2) を選択します。 |
仮想環境を作成する Python インタープリターを選択してください | 任意の Python インタープリターを選択します。 オプションが表示されない場合は、Python バイナリの完全パスを入力してください。 |
Select a template for your project's first function (プロジェクトの最初の関数のテンプレートを選択してください) | HTTP trigger を選択します。 |
作成する関数の名前 | 「HttpExample」と入力します。 |
承認レベル | ANONYMOUS を選択します。この場合、すべてのユーザーが関数のエンドポイントを呼び出すことができます。 詳細については、「認可レベル」を参照してください。 |
- Visual Studio Code は、提供された情報を使用し、HTTP トリガーを含む Azure Functions プロジェクトを生成します。 ローカル プロジェクト ファイルは、エクスプローラーで表示できます。 下記のようなpythonのプログラムファイルが生成されます。
import azure.functions as func
import logging
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.route(route="HttpExample")
def HttpExample(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
name = req.params.get('name')
if not name:
try:
req_body = req.get_json()
except ValueError:
pass
else:
name = req_body.get('name')
if name:
return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
else:
return func.HttpResponse(
"This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
status_code=200
)
HttpRequestオブジェクトからは、要求ヘッダー、クエリ パラメーター、ルート パラメーター、およびメッセージ本文を取得できます。 この関数では、name クエリ パラメーターの値は HttpRequestオブジェクトの paramsパラメーターから取得しています。JSON でエンコードされたメッセージ本文はget_json
メソッドを使用して読み取ります。
- local.settings.json ファイルで、次の例のように AzureWebJobsStorage 設定を更新します。
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
これにより、ローカル Functions ホストは、Python v2 モデルで必要なストレージ接続にストレージ エミュレーターを使用するように指示されます。 Azure にプロジェクトを公開する場合、この設定では代わりに既定のストレージ アカウントが使用されます。 ローカル開発中に Azure Storage アカウントを使用する場合は、ここでストレージ アカウントの接続文字列を設定します。
エミュレーターを起動する
- Visual Studio Code で、F1 キーを押してコマンド パレットを開きます。 コマンド パレットで、Azurite: Start を検索して選択します。
- 下部のバーで、Azurite エミュレーション サービスが実行されていることを確認します。 その場合は、関数をローカルで実行できるようになっています。
関数をローカルで実行する
- VSCode上でF5キーまたは左側のアクティビティ バーの [実行とデバッグ] アイコンを押します。 少し経過後、ターミナルパネルに、Core Tools からの出力が表示されます。
アプリがターミナル パネルで起動します。 HTTP によってトリガーされる関数の URL エンドポイントがローカルで実行されていることを確認できます。
/bin/sh: func: command not found
エラーとなった場合、ここでPath等を反映させるため一度VSCodeを終了して再度開くとエラーを解消できる場合があります。
- Core Tools がターミナルでまだ実行されている状態で、アクティビティ バーの Azure アイコンを選択します。 [ワークスペース] 領域で、[ローカル プロジェクト]>[関数] を展開します。 新しい関数を右クリック (Windows) または Ctrl キーを押しながらクリック (macOS) して、[Execute Function Now] (今すぐ関数を実行) を選択します。
- [Enter request body](要求本文を入力してください) に、要求メッセージ本文の値として { "name": "Azure" } が表示されます。 Enter キーを押して、この要求メッセージを関数に送信します。
- ローカルで関数を実行し、応答が返されると、Visual Studio Code で通知が発生します。 関数の実行に関する情報は、 [ターミナル] パネルに表示されます。
Executed function "HttpExample". Response: "Hello, Azure. This HTTP triggered function executed successfully."
- [ターミナル] パネルにフォーカスがある状態で、Ctrl + C キーを押して Core Tools を停止し、デバッガーの接続を解除します。
関数がローカル コンピューター上で正常に動作することを確認したら、Visual Studio Code を使用してプロジェクトを直接 Azure に発行します。
Azureへのサインイン
前節でローカルでの確認ができたのでここからAzureにデプロイしていきます。
- (まだサインインしていない場合は、)アクティビティバーのAzureアイコンを選択します。その後、[リソース] で [Azure にサインイン] を選択します。
↓サインイン後にWebにリダイレクトして表示されるページ
Azureに関数アプリを作成する
- VSCode上でF1キーを押して「Azure Functions: Create Function App in Azure.」と入力してEnterを押します。
- プロンプトで各項目ごとに次のように指定します
Azure に作成されている個々のリソースの状態が、Azure の拡張機能によって [Azure: アクティビティ ログ] パネルに表示されます。
- 関数アプリが作成されると、次の関連リソースがご利用の Azure サブスクリプションに作成されます。 リソースの名前は、関数アプリに入力した名前に基づいて決まります。
環境によって「This region has quota of 0 instances for your subscription. Try selecting different region or SKU.」とエラーが出てしまうこともありえます。その場合は作成可能なリージョンを指定して再度関数アプリを作成するようにします。
Azureにプロジェクトをデプロイする
- VSCodeのコマンドパレットで「Azure Functions: Deploy to Function App.」と入力します
- 作成したばかりの関数アプリを選びます。 前のデプロイの上書きを求められたら、[デプロイ] を選択して、関数コードを新しい関数アプリ リソースにデプロイします。
- デプロイの完了後、[出力の表示] を選択すると、作成済みの Azure リソースなど、作成とデプロイの結果が表示されます。 通知を見逃した場合は、右下隅にあるベル アイコンを選択して、再度確認します。
Azureで関数を実行する
- F1 キーを押してコマンド パレットを表示し、コマンド Azure Functions:Execute Function Now... を検索して実行します。 メッセージが表示されたら、ご使用のサブスクリプションを選択します。
- 新しい関数アプリ リソースと、関数として HttpExample を選択します。
- [要求本文を入力してください] に「{ "name": "Azure" }」と入力し、Enter キーを押して、この要求メッセージを関数に送信します。
- Azure で関数が実行されると、応答が通知領域に表示されます。 通知を展開して、応答全体を確認します。
そのほか、エンドポイントに対してcurlでリクエスをすると同様にレスポンスを確認できます。
関数のURLはAzureのコンソール画面の「Functions」の「関数の URL を取得」から確認できます。
% curl "https://${func_url}.azurewebsites.net/api/HttpExample?name=John"
Hello, John. This HTTP triggered function executed successfully.
リソースをクリーンアップする
検証してリソースを削除したい場合は下記を参考に今回作成したリソースを削除します。
(リソースの削除に5分以上かかりました)
まとめ
VSCode上からAzureにFunctionsをデプロイする方法についてチュートリアルの内容を写経していきました。デフォルトで作成される実装内容を色々と変えてみて挙動の変化を確認していけたらと思いました。またFunctionsからCosmos DBへの接続も同様に検証していきたいと思いました。
Discussion