Sisimai ♥ Azure Functions

先日のHokkaido.pmの帰りに時間が余ってしまったので、新千歳空港のロビーでダラダラしながら、SisimaiをAzure Functionsで動作させてみました。

Azure FunctionsでPerlが動く

Azure Functions上では、制約がありながらもPerlが稼働します。これは既にHokkaido.pmで発表した通りです。

Sisimaiとは

Sisimai

Sisimaiとは、バウンスメールの解析を行い、その情報を取得したりJSONに変換するためのライブラリです。 Perl版とRuby版が二条項BSDライセンスにて提供されており、GitHub上で開発されています。

本エントリではこれ以降、単にSisimaiと表記する場合は、特筆がない限りPerl版のp5-Sisimaiを指すものとします。

小さく堅牢なSisimaiに注目

ちょうどHokkaido.pmにSisimai作者のazumakuniyukiさんがいましたので、Sisimaiの依存モジュールについて聞いてみました。

わいとん:Sisimaiって依存モジュールどのくらいあるんです?

azumakuniyukiさん:確かJSONとClass::Accessor::Liteくらいだったんちゃうかなぁ・・・「小さく堅牢に」っちゅうのを心がけてるんで、そのくらいやったと思います。

実際metacpanのdependencyを見ても非常に依存が少なく、またXSを利用したモジュールに依存していません。Azure Functionsで稼働させる対象としては適任であると考えられます。

実際に作った

実は去年の夏にSisimaiに関連したエントリを公開しております。

当時はSisimaiが稼働するDockerコンテナを作りましたが、今年はSisimaiが稼働するサーバレスシステムを作りました。

Azure Portalにアクセスできる状態なら、Deploy to Azureボタンを押すだけでデプロイできるようにしてあります。

デプロイが終わったら、適宜バウンスメールが含まれたMailbox形式のファイルを以下のようにPOSTしてみてください。

1
2
3
4
5
ENDPOINT_URL="https://yourfuncname.azurewebsites.net/api/sisimai?code=..."
curl -X POST
-H "Content-Type: text/plain"
--data-binary @path/to/mailbox
$ENDPOINT_URL

以下が動作イメージです。

image

作る上でキモとなった点

Sisimaiをどうやってインストールするか

まずローカル環境でcpanfileを作って以下のような内容とします。

1
requires 'Sisimai';

あとはcpm installするとlocal以下にSisimaiとその依存モジュールが入ってきます。

これだけです。

それらをどうやってアップロードするのか

基本的にはGitHubにあがっていれば、Functionsにそのまま落としてくることが可能ですので、ひとまずGitHubにおきました。

Azure Functions の継続的なデプロイというエントリにそのやり方が書いてありますので、開発中はこの方法でデプロイ済みのAzure Functionsにファイルをアップロードしていきました。

ARM Template

これが一番難しかったのですが、以下のドキュメントを読みながら地道に作っていきました。

まとめ

小さく堅牢に作られたSisimaiをAzure Functionsにデプロイする方法を自動化し、数クリックでデプロイできるようにしました。またそのデプロイボタンを一般公開しました。

エラーメールの解析をサービスとして展開できるので、ぜひお試しいただけると幸いです。