Azure Functions + PythonでBlob Storageの入出力バインド
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開発の始め方は、次の記事を参考にしてください。
ストレージへの接続
接続文字列の確認
まずは、Blob Storageにアクセスするための接続文字列を確認します。
Azureにサインインし、入出力先となるストレージアカウントを選択します。メニューから「アクセスキー」を表示し「キーの表示」をクリックしたあと、表示された key1 → 接続文字列 の値をコピーします。
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.txt
をstring
としてバインドします。
{
"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として出力してみます。
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
の内容がそのまま表示されます。
これはサンプルデータです
出力バインド
入力バインドで読み込んだテキストデータを加工し、別のファイルとして Azure Blob Storage にテキストファイルを作成するというプログラムを書いていきます。
function.jsonの編集
バインディング構成ファイルであるfunction.json
に、バインド設定を追加していきます。
ここでは、出力バインドの名前を「outputblob」としBLOBパスcontainer/sample-modify.txt
をstring
型としてバインドします。
{
"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 ストレージに書き込みます。
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