Azure FunctionsでPythonを使ってみた
先日参加させてもらった「スマートスピーカーを遊びたおす会大阪 vol.1」で、多くの方がAzure Functionsを利用していました。
Azure Functionsを使ったことが無かったので使ってみました。
今日いろんな人が使ってたのでazure functions便利なんだろうなぁ。試してみよう。
— kapiecii / かぴし (@kapiecii) 2019年8月1日
目次
環境
Ubuntu 18.04
手順
Azure Portalにログイン
Azure Portalにログインします。
アカウントを持っていない場合は、新規作成します。
PortalでFunction App を作成する
Pythonを実行するためのFunction Appを作成します。
Create a resource -> Conpute -> Function App
作成するFunction Appの設定を入力し、「Create」。
Pythonを実行したい場合は、下記の設定にする必要があります。それ以外は任意の内容で設定します。
Function App作成までは数分かかります。
ローカルの環境を整える
Python
2019/08時点で、Azure Functionsで実行できるPythonは3.6のようです。
HTTP 要求に応答する関数を Azure で作成する | Microsoft Docs
Pythonのvenv環境を使います。
$ sudo apt install python3-venv $ python3.6 -m venv .venv $ source .venv/bin/activate
Azure CLI
Azure CLIをインストールします。
$ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
Azure Functions Core Tools
Azure Functions Core Toolsをインストールします。
$ sudo apt install npm $ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} $ npm install -g azure-functions-core-tools
ローカルにプロジェクトを作成
funcコマンドでプロジェクトを作成します。
作成したプロジェクト名のサブディレクトリが生成されます。
$ func init MyFunctionProj Select a worker runtime: 1. dotnet 2. node 3. python (preview) 4. powershell (preview) Choose option: 3 python Writing .funcignore Writing .gitignore Writing host.json Writing local.settings.json Writing /{path}/MyFunctionProj/.vscode/extensions.json $ ls -al total 16 drwxr-xr-x 4 jiro jiro 4096 Aug 9 16:11 . drwxr-xr-x 4 jiro jiro 4096 Aug 9 16:06 .. drwxr-xr-x 3 jiro jiro 4096 Aug 9 16:11 MyFunctionProj drwxr-xr-x 6 jiro jiro 4096 Aug 9 16:09 .venv
サブディレクトリの中身はこのようになっていました。
$ ls MyFunctionProj/ host.json local.settings.json requirements.txt
プロジェクトにFunctionを追加
「func new」でFunctionを作成します。
今回はHTTP triggerを選択しました。
$ cd MyFunctionProj $ func new Select a template: 1. Azure Blob Storage trigger 2. Azure Cosmos DB trigger 3. Azure Event Grid trigger 4. Azure Event Hub trigger 5. HTTP trigger 6. Azure Queue Storage trigger 7. Azure Service Bus Queue trigger 8. Azure Service Bus Topic trigger 9. Timer trigger Choose option: 5 HTTP trigger Function name: [HttpTrigger] Writing /{path}/MyFunctionProj/HttpTrigger/__init__.py Writing /{path}/MyFunctionProj/HttpTrigger/function.json The function "HttpTrigger" was created successfully from the "HTTP trigger" template.
2つのファイルが生成されました。
$ ls -a HttpTrigger/ . .. function.json __init__.py
func.jsonには、Function Appの各種設定が記載されています。
$ cat HttpTrigger/function.json { "scriptFile": "__init__.py", "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "req", "methods": [ "get", "post" ] }, { "type": "http", "direction": "out", "name": "$return" } ] }
init.pyには、実行されるPythonのコードが記載されていました。
$ cat HttpTrigger/__init__.py import logging import azure.functions as func def main(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}!") else: return func.HttpResponse( "Please pass a name on the query string or in the request body", status_code=400 )
Functionをローカルで実行する
Python以外のパターンも検証していたため、少しだけPythonコードに手を加えてPythonが実行されていることがわかるようにしてみました。
実行します。
$ func host start
ブラウザから http://localhost:7071/api/HttpTrigger?name=kapiecii
にアクセスすると、先程のPythonが実行されました。
コンソールからログも確認できます。
Azure環境に公開
Portalから作成したFunction Appで、作成したPythonコードを公開します。
$ func azure functionapp publish myfunctionapp0809
公開されたURLが表示されるので、ブラウザからアクセスしてみます。
Pythonが実行されました。
Portalからも確認できました。
感じたメリット
上の例では、「HTTP trigger」を選択しましたが、「Timer trigger」を選択すれば、「0 /5 * * * 」のような指定方法で定期実行することもできます。
Cloud Functionsだと時間をトリガーにした定期実行はできないようなので、この点は強みだなと思いました。
イベントとトリガー | Google Cloud Functions に関するドキュメント
Cloud Functionsの場合は、こちらの記事のようにGCPのサービスを組み合わせる必要があるようです。
GCP Cloud Functionsで気象庁天気予報情報を定期的にスクレイピングして、BigQueryへinsertする方法 - Qiita
AWSの場合は、CloudWatchと連携すると定期実行できるようです。
Amazon CloudWatch Events とは - Amazon CloudWatch Events
ルールのスケジュール式 - Amazon CloudWatch Events
Azure Functionsの「単体で定期実行を設定できる点」は、強みだなと感じました。
料金
料金も気になるところです。
類似サービスをざっとみたところ、無料枠は大きな差は無い印象です。
Cloud Functions の料金: 最初の 200 万回無料
料金 | Google Cloud Functions に関するドキュメント
Azure Functions の価格: 100 万実行無料、400,000 GB 秒無料
価格 - Functions | Microsoft Azure
AWS Lambda の料金詳細: 1,000,000 件のリクエストは無料、月間 400,000 GB-秒が無料
最後に
初めてAzure Functionsを使ってみました。
各社の”Functions”なサービスを使った経験はなかったのですが、トリガーの組み合わせ方や、他のサービスとの連携で差異がでますね。
とはいえ、どのサービスでもやりたいことは実現できる方法がありそうなので、皆さんはどうやって採用するサービスを決めてるんだろう。
Microsoft Azure Fundamentalsという資格があるようです。 体系的に知識を身につけるために受験しようかな。
合格対策 Microsoft認定 AZ-900:Microsoft Azure Fundamentalsテキスト&問題集
- 作者:吉田 薫
- 発売日: 2020/03/08
- メディア: 単行本(ソフトカバー)