kapieciiのブログ

日々学んだことを残しておくためのブログです。このブログはGoogle Analyticsを利用しています。

Azure FunctionsでPythonを使ってみた

f:id:kapiecii:20190810015227p:plain

先日参加させてもらった「スマートスピーカーを遊びたおす会大阪 vol.1」で、多くの方がAzure Functionsを利用していました。

kotodama.connpass.com

Azure Functionsを使ったことが無かったので使ってみました。

目次

環境

Ubuntu 18.04

手順

Azure Portalにログイン

Azure Portalにログインします。
アカウントを持っていない場合は、新規作成します。

Microsoft Azure

PortalでFunction App を作成する

Pythonを実行するためのFunction Appを作成します。

Create a resource -> Conpute -> Function App

f:id:kapiecii:20190810011155p:plain

作成するFunction Appの設定を入力し、「Create」。
Pythonを実行したい場合は、下記の設定にする必要があります。それ以外は任意の内容で設定します。

Function App作成までは数分かかります。

f:id:kapiecii:20190810011338p:plain

ローカルの環境を整える

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が実行されていることがわかるようにしてみました。

f:id:kapiecii:20190810012237p:plain

実行します。

$ func host start

ブラウザから http://localhost:7071/api/HttpTrigger?name=kapiecii にアクセスすると、先程のPythonが実行されました。

f:id:kapiecii:20190810012354p:plain

コンソールからログも確認できます。

f:id:kapiecii:20190810012432p:plain

Azure環境に公開

Portalから作成したFunction Appで、作成したPythonコードを公開します。

$ func azure functionapp publish myfunctionapp0809

公開されたURLが表示されるので、ブラウザからアクセスしてみます。
Pythonが実行されました。

f:id:kapiecii:20190810012608p:plain

Portalからも確認できました。

f:id:kapiecii:20190810012640p:plain

感じたメリット

上の例では、「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-秒が無料

料金 - AWS Lambda |AWS

最後に

初めてAzure Functionsを使ってみました。
各社の”Functions”なサービスを使った経験はなかったのですが、トリガーの組み合わせ方や、他のサービスとの連携で差異がでますね。
とはいえ、どのサービスでもやりたいことは実現できる方法がありそうなので、皆さんはどうやって採用するサービスを決めてるんだろう。

Microsoft Azure Fundamentalsという資格があるようです。 体系的に知識を身につけるために受験しようかな。

合格対策 Microsoft認定 AZ-900:Microsoft Azure Fundamentalsテキスト&問題集

合格対策 Microsoft認定 AZ-900:Microsoft Azure Fundamentalsテキスト&問題集

  • 作者:吉田 薫
  • 発売日: 2020/03/08
  • メディア: 単行本(ソフトカバー)

kapieciiのブログについてお問い合わせがある場合、下記のフォームからご連絡をお願い致します。
お問い合わせはこちら