🕌

Azure Functions + PythonでBlob Storageの入出力バインド

2022/05/14に公開

Microsoft Azure の Azure Functions を Python で作成し、Azure Blob Storageをバインドして使っていきます。

Azure Blob Storage は、Microsoft のクラウド用オブジェクト ストレージ ソリューションで、テキストデータやバイナリデータをAzure上に作成できるようになります。入力または出力のバインドを使用すると、関数を他のAzureサービスに接続して使用できます。

この記事の前提条件

  • アクティブなサブスクリプションが含まれる Azureアカウント がある
  • Azureに ストレージアカウント が作成済である
  • ChromeBook で開発する
  • ChromeBook には VSCode がインストールされている
  • HttpトリガーのFunctionが作成済である

ChromeBook への VSCode のインストール、PythonでのAzure開発の始め方は、次の記事を参考にしてください。
https://zenn.dev/gatabutsu/articles/82008b901c4f04
https://zenn.dev/gatabutsu/articles/73c2cdeb0f264a

ストレージへの接続

接続文字列の確認

まずは、Blob Storageにアクセスするための接続文字列を確認します。
Azureにサインインし、入出力先となるストレージアカウントを選択します。メニューから「アクセスキー」を表示し「キーの表示」をクリックしたあと、表示された key1 → 接続文字列 の値をコピーします。

local.settings.jsonの編集

ローカルでの開発時に参照される接続文字列をlocal.settings.jsonに書いていきます。

local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "<コピーした接続文字列>",
    "FUNCTIONS_WORKER_RUNTIME": "python"
  }
}

Azure上でサービスを実行する場合には、Azure Functionsのアプリケーション設定に設定されている同キーの値が参照されます。

入力バインド

Httpトリガーで起動された関数が、予め Azure Blob Storage 上に作成されたテキストファイルを読み取って表示するというプログラムを書いていきます。

function.jsonの編集

バインディング構成ファイルであるfunction.jsonに、バインド設定を書いていきます。
ここでは、入力バインドの名前を「inputblob」としBLOBパスcontainer/sample.txtstringとしてバインドします。

function.json
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "inputblob",
      "type": "blob",
      "dataType": "string",
      "path": "container/sample.txt",
      "connection": "",
      "direction": "in"
    },    
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

connectionは空にしているので、Functions ランタイムは、先程設定したアプリケーション設定内の AzureWebJobsStorage という名前の既定のストレージ接続文字列を使用します。

プロパティ設定値の詳細は公式を参照してください。
Azure Functions における Azure Blob Storage の入力バインド | Microsoft Docs

Azure Blob Storage には、コンテナーを作成し、ファイルをアップロードしておきます。

Python関数の編集と実行

function.jsonで設定した入力バインド「inputblob」をそのままHttpResponseとして出力してみます。

__init__.py
import logging

import azure.functions as func

def main(req: func.HttpRequest,inputblob: str) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    return func.HttpResponse(f"{inputblob}")

実行すると Azure Blob Storage 上のcontainer/sample.txtの内容がそのまま表示されます。

sample.txt
これはサンプルデータです

出力バインド

入力バインドで読み込んだテキストデータを加工し、別のファイルとして Azure Blob Storage にテキストファイルを作成するというプログラムを書いていきます。

function.jsonの編集

バインディング構成ファイルであるfunction.jsonに、バインド設定を追加していきます。
ここでは、出力バインドの名前を「outputblob」としBLOBパスcontainer/sample-modify.txtstring型としてバインドします。

function.json
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "req",
      (略)
    },
    {
      "name": "inputblob",
      (略)
    },    
    {
      "name": "outputblob",
      "type": "blob",
      "dataType": "string",
      "path": "container/sample-modify.txt",
      "connection": "",
      "direction": "out"
    },    
    {
      "name": "$return",
      (略)
    }
  ]
}

Python関数の編集と実行

入力バインド「inputblob」に文字列を追加してcontainer/sample-modify.txtに出力します。
関数のパラメーターをfunc.Out[str]として宣言し、文字列をBLOB ストレージに書き込みます。

__init__.py
import logging

import azure.functions as func

def main(req: func.HttpRequest,inputblob: str,outputblob:func.Out[str]) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    # 入力バインドでファイルから読み取った文字列を編集します
    outputtext = f"{inputblob}追加コメントです"
    # 出力バインドしたファイルに変数の値を書き込みます
    outputblob.set(outputtext)

    return func.HttpResponse(f"{outputtext}")

実行すると Azure Blob Storage 上のcontainerにsample-modify.txtが出力されます。すでにファイルがある場合は上書きされます。

まとめ

本記事では Python で作成した Azure Functions で Azure Blob Storageをバインドして使う方法を紹介しました。
Blob Storage にバインドすることで、Azure Logic Appsなど 他のAzureサービスとの連携が簡単にできるようになります。
ただし、自由自在にファイル名をつけるなど、少し込み入ったことをやろうとするとバインディングでは余計に難しなる場面もありますので、そういったときには Bolb Storage SDK を使うのが良いと思います。

参考

Discussion