Perl Hackers Hub

第54回 サーバレスでもPerl―Microsoft Azure Functionsで動かそう!(1)

この記事を読むのに必要な時間:およそ 2.5 分

本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはPerlとAzureが好きなわいとんさんで,テーマは「サーバレスでもPerl」です。

サーバレスという言葉が出てきて数年が経過しましたが,Perlとは縁のないものだと思っていませんか? 本稿では,Microsoft Azure Functions(以下,Functions)上でPerlスクリプトを使って顔認識を行います。動作するまでの流れを通じ,その可能性を感じていただければ幸いです。

本稿のサンプルコードは,本誌「WEB+DB PRESS Vol.109」サポートサイトから入手できます。

Microsoft Azure Functions ─⁠─ AzureにおけるFaaS

Microsoft Azure(以下,Azure)は,Microsoftが提供するクラウドプラットフォームです。Amazon Web ServicesやGoogle Cloud Platformと同様に,IaaSInfrastructure as a ServiceとしてVMVirtual Machine仮想マシン)やネットワークをクラウド上で構成し,動作させたいソフトウェアを設定して利用できます。また,DBaaSDatabaseas a ServiceのAzure Cosmos DBや検索サービスのAzure Searchなど,一通りのSaaSSoftware as a Serviceもあります。

今回紹介するFunctionsは,AzureにおけるFaaSFunction as a Serviceです。

サーバレスの中心にFaaSあり

サーバレスとはサーバレスアーキテクチャのことを指し,フルマネージドなクラウドサービスを利用して,システム稼働に必要なリソースを動的に確保するよう構築し,運用する方法となります。サーバレスを構成する要素の中心がFaaSです。

FaaSの特徴

FaaSとは,プログラム実行環境を提供するクラウドサービスで,関数と呼ばれる単位でプログラムを管理します。FaaSは次の特徴を持ちます。

関数が稼働した分だけ課金

FaaSでは関数が稼働した分だけ課金されます。特に,時間あたりのCPU,メモリ使用量が増えるほど,課金額が高くなる傾向にあります。

常時課金されるIaaSやPaaSPlatform as a Serviceと比べ,関数自体の処理時間や,CPUやメモリの使用量を減らすとお得になります。

OS/VMの管理は不要

FaaSはオンプレミスやIaaSと違い,OSやVM,ネットワークを自分で管理する必要がありません。

OSのアップデートやセキュリティパッチ,VMやネットワークはクラウドベンダーが管理してくれますので,関数の開発に意識を集中できます。作成した関数のパフォーマンスは,利用者の責任において監視,管理する必要があります。

関数の起動にはトリガが必要

FaaSのもう一つの大きな特徴として,イベントドリブンであることが挙げられます。FaaSでは,関数の起動にはクラウドベンダーが提供する各種トリガの中から1つ指定する必要があります。トリガが引かれるというイベントが発生しない限り,関数は起動されません。

FunctionsのPerlサポート

Functionsは,ランタイムのバージョンに応じてv1とv2に大別され,それぞれサポート言語が異なります。言語のバージョンや後述するトリガの仕様,バインディングの仕様にも違いがあります。

しかし,v1とv2ともにPerlはサポートされていません。では,どのようにPerlを実行させるのでしょうか。実は,FunctionsにはPerl(執筆時点2019年1月ではx86_64-msys-thread-multi v5.26.2)が付属しています。Functionsはgitに対応しており,gitをインストールするためにはPerlが必要だからです。

筆者が検証した限り,Functions v1ではbash経由でPerlプログラムを関数として実行できていますが,v2ではPerlの動作を確認できていません。そのため,ここからはv1を前提に解説します。

プロジェクトのファイル構成

Functions v1でPerlプログラムを関数として利用する場合,プロジェクトのファイル構成は次のとおりです。

./プロジェクト名
├── host.json
├── proxies.json
└── 関数名
        ├── function.json
        ├── run.sh
        └── task.pl

1つのプロジェクトには複数の関数を定義できます。複数定義する場合,関数ごとに関数名フォルダを用意します。

各関数名フォルダには,関数のトリガとデータ入出力を定義するfunction.json関数本体となるrun.shそして関数本体から呼び出されるPerlスクリプトのtask.plが必要となります。

また,関数名フォルダと同階層に,Functions内すべての関数に対する設定ファイルhost.jsonと,HTTPプロキシ設定ファイルproxies.jsonを配置できます。

なお,本稿ではhost.jsonproxies.jsonは利用しません。これらのファイルについて知りたい人は,公式ドキュメントのhost.jsonのリファレンスAzure Functionsプロキシの操作をご確認ください。

関数起動のためのトリガ

Functionsでは,関数の起動トリガをfunction.jsonで指定します。トリガには,以降で紹介するHTTPトリガ,Timerトリガ以外に,Cosmos DBトリガやBlobトリガ,Queueトリガなどがあります。

HTTPトリガ ─⁠─ 関数がWeb APIとして動作

HTTPトリガを指定すると,FunctionsはHTTPリクエストを受け取ったときに関数を起動します。その際,HTTPリクエストボディはファイルとして,クエリパラメータとHTTPヘッダは環境変数として,それぞれ関数に引き渡されます。

起動された関数は,出力ファイルに対してHTTPレスポンスをJSON形式で書き込みます。それを受けてFunctionsは,出力ファイルの内容をHTTPレスポンスとしてクライアントに返します図1)⁠

図1 HTTPトリガ

図1 HTTPトリガ

HTTPトリガで起動される関数では,function.jsonは次のようになります。

HTTPトリガで起動される関数のfunction.json

{
  "bindings": [
    {
      "type":      "httpTrigger",
      "direction": "in",
      "name":      "req",
      "authLevel": "anonymous"
    },
    {
      "type":      "http",
      "direction": "out",
      "name":      "res"
    }
  ],
  "disabled": false
}
Timerトリガ ─⁠─ 時間指定バッチとして定期的に起動

Timerトリガは,cron式で指定されたタイミングに基づき関数を起動します図2)⁠このcron式は通常のcron式に加え,秒単位での起動指定ができます。Timerトリガで起動される関数では,function.jsonは次のようになります。

Timerトリガで30分おきに起動される関数のfunction.json

{
  "bindings": [
    {
      "type":      "timerTrigger",
      "direction": "in",
      "name":      "timer",
      "schedule":  "0 */30 * * * *"
    }
  ],
  "disabled": false
}

図2 Timerトリガ

図2 Timerトリガ

データの入出力を行うためのバインディング

Functionsではバインディングというしくみで入出力に対応できます。バインディングは,トリガと同様にfunction.jsonで設定します。

先ほどHTTPトリガのfunction.jsonを示しましたが,クライアントに対してHTTPレスポンスを返す必要があるため,HTTPバインディングを使ってレスポンスを出力するよう定義してあります。バインディング入出力の向きはdirectionで指定され,inなら入力,outなら出力となります。バインディングにはHTTP以外に,Cosmos DBやBlob Storage,Queue Storageなどがあります。

Functions v1のトリガとバインディングに関する詳細は,公式ドキュメントのAzure Functionsのトリガとバインドの概念を参照してください。

<続きの(2)こちら。>

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.112

2019年8月24日発売
B5判/168ページ
定価(本体1,480円+税)
ISBN978-4-297-10787-1

  • 特集1
    React/Vue.jsで実践!
    コンポーネント設計
    モダンフロントエンドの構造化と分割の新提案
  • 特集2
    RDBMS徹底比較
    PostgreSQL,MySQL,SQL Server,Oracle Database
  • 特集3
    実践Scala
    オブジェクト指向×関数型
  • 一般記事
    自作キーボードのススメ
    デザイン,配列,打鍵感……自由自在