チュートリアル: Azure Table Storage 出力を使用して Python 関数を構成する

このチュートリアルでは、Azure Table Storageを出力バインドとして使用するようにPython関数を構成します。 次に、関数をAzure Functionsにデプロイし、Service Connector を使用して、Azure Functions アプリを Table Storage に接続します。

Visual Studio Codeを使用して、次のタスクを実行します。

  • Python関数プロジェクトを作成します。
  • Table Storage 出力関数バインドを追加します。
  • 関数をローカルで実行します。
  • Azureに関数をデプロイします。
  • Service Connector を使用して、Azure Functions アプリと Table Storage の間に接続を作成します。

Service Connector のソースサービスは Azure Functions であり、ターゲットサービスは Azure Table Storage です。 関数バインドでは、出力としてストレージ テーブルを含む HTTP トリガーが使用されます。 ローカル認証とクラウド認証の種類は接続文字列。

前提条件

  • Azure Functionsの基本的な理解と、Azure Functionsでのサービスへの接続方法。
  • Azure リソース書き込みアクセス許可を持ち、Service Connector をサポートする Azure リージョンでの Azure サブスクリプション。 Azure アカウントを無料で作成します
  • Azure サブスクリプションの Azure Storage アカウント、ストレージ アカウントに testTable という名前のテーブル。
  • Visual Studio Code。次の拡張機能がインストールされています。
    • Python
    • Azure CLI ツール
    • Azure Functions は、次のようにプログラミング モデル V1 を許可するように構成されます。
      1. Visual Studio Codeで、拡張機能の横にある Settings アイコンAzure Functionsを選択し、Settings を選択します。
      2. Settings 画面で、[Azure Functions: プログラミング モデルの選択を許可する の横にあるチェック ボックスをオンにします。
      3. [設定] 画面を閉じます。

関数プロジェクトを作成する

Visual Studio Codeで、HTTP トリガーを使用してPython関数プロジェクトを作成します。

  1. F1 キーを押してコマンド パレットを開き、コマンド Azure Functions: Create New Project を検索して選択します。
  2. [ 関数プロジェクトを含むフォルダーを選択] で、[ 参照] を選択し、新しいフォルダーを作成するか、プロジェクト ワークスペースの空のフォルダーを選択します。 既にワークスペースの一部になっているプロジェクト フォルダーは選択しないでください。
  3. プロジェクトの種類を選択Pythonを選択します。
  4. Python プログラミング モデルの選択では、Model V1 を選択します。
  5. Pythonインタープリターを選んで仮想環境を作成します手動でPythonインタープリターまたはその完全なパスを入力し、 Python実行可能ファイルへの完全なパスを入力します。
  6. プロジェクトの最初の関数のテンプレートを選択するには、[HTTP トリガー] を選択します。
  7. [関数名の指定] に「TableStorageOutputFunc」と入力します。
  8. [承認レベル] で [匿名] を選択します
  9. プロジェクト を開く方法を選択するには、[ 現在のウィンドウで開く] を選択します。

詳細については、「Visual Studio Codeを参照してください。

ストレージ テーブルの出力バインドを追加する

次の手順では、プロジェクト内の function.json ファイルと local.settings.json ファイルを編集して、関数のテーブル出力バインドを作成します。

  1. 関数フォルダー内の function.json ファイルを右クリックし、コンテキスト メニューから [ バインドの追加] を選択します。
  2. コマンド パレットで、[ バインド方向の選択] で [ 出力] を選択します。
  3. 「out」の方向のバインドを選択するには、Azure Table Storage を選択します。
  4. コードでこのバインディングを識別するために使用する名前として、「outMessage」と入力します。
  5. データが書き込まれるストレージ アカウントのテーブル名に、「testTable」と入力します。
  6. "local.settings.json" のストレージ アカウント接続文字列を持つアプリ設定を選択し、新しいローカル アプリ設定の作成 を選択します。
  7. サブスクリプションの選択で、Azure サブスクリプションを選択します。
  8. 開発用のストレージ アカウントの種類を選択しますで、リモート ストレージのAzure Storageを使用する を選択します。
  9. ストレージ アカウントの選択で、出力に使用するAzure Storage アカウントを選択します。

追加されたバインドを確認する

  • TableStorageOutputFunc/function.json ファイルを開き、テーブル出力バインドがファイルに正しく追加されていることを確認します。 値のいずれかが異なる場合は、次の値に編集します。

        {
          "type": "table",
          "direction": "out",
          "name": "outMessage",
          "tableName": "testtable",
          "connection": "<your-storage-account-name>_STORAGE"
        }
    
  • local.settings.json ファイルを開き、次のキーと値のペアがこのファイルにあることを確認します: <your-storage-account-name>_STORAGE: <your-storage-account-connection-string>

Python コードを編集する

TableStorageOutputFunc/__init__.py ファイルを開き、その内容を次のコードに置き換えます。

import logging
import uuid
import json
import azure.functions as func

def main(req: func.HttpRequest, outMessage: func.Out[str]) -> func.HttpResponse:

    rowKey = str(uuid.uuid4())
    data = {
        "Name": "Output binding message",
        "PartitionKey": "message",
        "RowKey": rowKey
    }

    outMessage.set(json.dumps(data))
    return func.HttpResponse(f"Message created with the rowKey: {rowKey}")

関数をローカルで実行する

関数をローカルで実行するには、 F5 キーを押します。 ストレージ アカウントに接続するように求められたら、Azure Storage アカウントを選択します。 この値はAzure Functions ランタイムに使用され、使用できますが、関数の出力に使用するストレージ アカウントと同じである必要はありません。

関数の実行中に、アクティビティ バーのワークスペース ビューで TableStorageOutputFunc 関数を右クリックし、[関数の今すぐ実行] を選択して、Table Storage テーブルに書き込むことができることを確認します。 関数の応答を調べて、テーブルに書き込まれた rowKey 値が含まれていることを確認します。

関数を Azure にデプロイする

Azure Functions アプリを作成し、Azureに関数をデプロイします。

  1. プロジェクト function.json ファイルで、connectionbindings プロパティの値を AZURE_STORAGETABLE_CONNECTIONSTRING に変更します。
  2. F1 キーを押してコマンド パレットを開き、コマンド Azure Functions: Deploy to Function App を検索して選択します。
  3. サブスクリプションの選択で、Azure サブスクリプションを選択します。
  4. [ 関数アプリの選択] で、[ 新しい関数アプリの作成] を選択します。
  5. 新しいリソースの場所を選択しますは、Azure Functions アプリのAzureリージョン (ストレージ アカウントと同じリージョンが好ましい) を選択します。
  6. [新しい関数アプリの名前を入力してください] には、ローカル関数 TableStorageOutputFunc と同じ名前を入力できます。
  7. ランタイム スタックの選択で、Python 3.10 を選択します。
  8. [ リソース認証の種類の選択] で、[シークレット] を選択 します

Important

シークレットを使用する接続文字列認証フローには、アプリケーションに対する高度な信頼が必要であり、他のフローには存在しないリスクが伴います。 このフローは、マネージド ID などのより安全なフローが実行可能ではない場合にのみ使用してください。

サービス コネクタを使って接続を作成する

Functions アプリを作成したら、Service Connector を使用してアプリを Table Storage テーブルに接続できるため、アプリはストレージ アカウントに出力を簡単に書き込むことができます。 次のコマンドは、関数のアプリ設定で AZURE_STORAGETABLE_CONNECTIONSTRING 変数を構成する Service Connector リソースを作成します。

関数バインドは、このアプリ設定を使用してストレージ アカウントに接続し、関数がストレージ テーブルに書き込むことができるようにします。 詳細については、「Service Connector がどのようにして Azure Functions をサービスに接続するか」を参照してください。

接続を作成するには、Visual Studio Codeで次のAzure CLI コマンドを実行するか、Azure Cloud Shell または local Azure CLI を使用します。 プレースホルダーの値を次のように置き換えます。

  • <function-resource-id>:
    /subscriptions/<your-subscription>/resourceGroups/<function-resource-group>/providers/Microsoft.Web/sites/<function-name>

  • <storage-resource-id>:
    /subscriptions/<your-subscription>/resourceGroups/<storage-resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>/tableServices/default

az functionapp connection create storage-table --source-id "<function-resource-id>" --target-id "<storage-resource-id>" --secret

トラブルシューティング

No such host is known (<account-name>.table.core.windows.net:443) など、ストレージ ホストに関連するエラーが発生した場合は、Table Storage への接続に使用される接続文字列にテーブル エンドポイントが含まれていることを確認します。 そうでない場合は、Azure Storage ページに移動し、Access キーから Security + networking の下にある接続文字列をコピーし、値を置き換えます。

ローカルで実行するときにこのエラーが発生した場合は、 local.settings.json ファイルを確認します。 関数をAzureにデプロイするときにエラーが発生した場合は、Functions アプリのアプリ設定を確認します。

リソースをクリーンアップする

このチュートリアル用に作成したAzure リソースが不要になった場合は、それらを削除できます。

  • Azure ポータルで、Functions アプリまたはストレージ アカウント リソースを開き、上部のメニュー バーから Delete を選択します。 リソース名を入力し、[ 削除] を選択します。

  • Azure CLIで、次のコマンドのいずれかまたは両方を実行し、プレースホルダーを独自の情報に置き換えます。

    az functionapp delete --name <functionapp-name> --resource-group <functionapp-resource-group>
    az storage account delete --name <storageaccount-name> --resource-group <storageaccount-resource-group>