Writer:安藤 隼人
Azure Functionsとは?サーバーレスによるWebサービス開発のメリットを解説
サーバーの存在をほとんど意識せずにWebサービスを構築できるAzureのサービスが「Azure Functions」です。従来のクラウドサービスでは、物理的なサーバーの管理こそ無くなりましたが、仮想マシンの作成からミドルウェアのインストール、アプリケーションのビルドとデプロイなどの手間はかかってしまうのが一般的でした。Azure Functionsでは、このような作業は意識せずコーディングだけに集中してWebサービスを簡単に構築することができます。
ネクストステップにおすすめ
Azure Functionsとは
Azure Functionsは、サーバーの存在をほとんど意識せずにWebサービスを構築できるサーバーレスのスクリプト実行環境です。サーバーレスとは、サーバーの構築やリソースの割り当てをAzureが行い、ユーザーは管理をせずに済むということです。
従来のクラウドにおけるWebサービス構築では、仮想マシンの作成やミドルウェアのインストール、アプリケーションのビルドとデプロイなど開発以外のサーバー自体の管理に手間がかかっていました。一方、Azure Functionsでは、仮想マシンの立ち上げやWeb APIのビルド、アプリケーションのビルドとデプロイ、仮想マシン使用後の解放など、コード開発以外の処理をAzure側で自動実行することにより、開発者が最も重要なコードに集中できる仕組みを提供しています。
Azure Functionsの拡張機能である「Durable Functions」により、サーバーレスコンピューティングでは難しかったステートフルな(セッション情報を保持する)アプリケーションを簡単に構築できる点も魅力です。例えば複数の処理を並列で実行し、すべての処理が終了するまで待機する、といったことも簡単に実装できるようになります。
また、Azure Functionsは、C#、Java、JavaScript、PowerShell、Pythonなどさまざまなプログラミング言語をサポートしています。サポート外の言語でもカスタムハンドラーで対応できるため、言語の制限は実質ありません。イベントの発生に応じてコードを呼び出すトリガー機能に、処理するデータを結びつけて応答を返す「バインド機能」を組み合わせて使用することもできます。例えば、新しいログがキューに格納されることをトリガーとして、データベースにログの行を書き込んでいくなどの仕組みが構築できるでしょう。
さらにAzure Functionsは関数の実行を監視する「Azure Application Insights」と連携でき、各種データを収集してパフォーマンスの異常が自動的に検出されるほか、強力な分析ツールを備え、より簡単にアプリケーションの問題を診断できます。
Azure Functionsのメリット
Azure Functionsには、サービス連携がスムーズであることやステートフルなアプリケーションの実装、無駄なコストを抑えられるなどのメリットがあります。それぞれ内容をみていきましょう。
従来のサーバーレス環境よりもサービス連携がスムーズ
従来のサーバーレス環境では、ミドルウェアやOSなどの環境はクラウド任せでブラックボックスのため、他サービスとの連携までコーディングする必要がありました。Azure Functionsでは「バインド機能」によって連携が簡単になるだけではなく、他のSaaSプロバイダーがAPIの形式を変更した場合もバインド機能の設定を変更するだけでよく、アプリケーション側でのメンテナンスが不要になるため、API仕様の変化を特に気にせずにSaaSに接続できるようになります。
ステートフルなアプリケーションを構築できる
自動機械学習とは、前処理済みのデータから最適な機械学習モデこれまでのサーバーレスな環境では、セッション情報を保持しないステートレスな処理がメインで使用されてきました。処理が完了する度にセッションを破棄するため、サーバーに負担がかからないことが大きなメリットだったためです。しかしながら、ステートレスな処理では複数の処理を連携させるために複雑なプログラムを作りこむ必要があり、どうしても実装の難易度は上がってしまうのが実情でした。一方、Azure Functionsでは、拡張機能であるDurable Functionsを用いることで、複雑なプログラムなしにサーバーレス環境で複数の処理を連携させるステートフルな処理の実装を可能にしています。
無駄なコストを抑えられる
Azure Functionsには、従来型の仮想マシン起動時間に課金されるプラン以外に、リソースの使用量とコードを実行した実行回数に課金される従量課金プランも選択可能なため、無駄がありません。2022年10月現在の従量課金プランでは、リソース使用量での課金は1GB/秒につき約0.00232円、コード実行回数での課金は100万実行回数につき約29円ですので、非常にリーズナブルです。対する仮想マシン起動時間に課金されるプランでは、例えばApp Serviceプラン内のBasicサービスプラン「B1」でも、2022年10月現在の費用は1時間あたり約10.875円です。常に立ち上げたまま他の処理に使用していて、かつ使用頻度が低い仮想マシンが既にある場合は、その仮想マシンを共用する方がよいでしょう。
Azure Functions料金体系を選択する際の注意点
上述の通りAzure Functionsの従量課金プランは、実行回数に対して課金されるため無駄がありませんが、関数の呼び出しが一定時間ないとインスタンスが開放されて次回の起動はインスタンスの立ち上げからになり、コードの実行開始までに時間を要することに注意が必要です。時間を短縮したい場合は、PremiumプランもしくはApp Serviceプランを選択すると、仮想マシンが最初から立ち上がっているため、素早い実行が可能です。定期的な呼び出しがある場合は、PremiumプランもしくはApp Serviceプランを契約し、インスタンスを保持して効率よくプログラムを実行しましょう。
また、従量課金プランは5分を経過すると関数の実行がタイムアウトします。タイムアウト時間は最長10分までしか設定できないので、大きな処理を実行する場合は、PremiumプランやApp Serviceプランを利用する必要があります。プランの詳細な内容については後述します。
Azure Functionsのユースケース
Azure Functionsのユースケースとしては、画像アップロード処理やIoTデータ構造化などの例があります。順番に内容をみていきましょう。
ユースケース1:Azure Blob Storageにリサイジングした画像をアップロード
画像がAzure Blob Storageの特定のフォルダにアップロードされたら、それをトリガーにAzure Blob Storageの別フォルダにリサイジングした画像をアップロードするというような処理ができます。特定のストレージにファイルが追加されたというイベントを検知して自動処理がなされます。
ユースケース2:IoTデータをリアルタイムに構造化
IoTデバイスから送られてくるデータをリアルタイムに構造化してデータベースに保存が可能です。エッジデバイスから送付されたデータをAzure IoT Hubで収集し、Azure Functionsで構造化し、データベースに保存します。
Azure Functionsは、APIを作成してサーバーを意識せずにシステムを構築するためのサービスなので、あまり表立って稼働するようなサービスではありません。しかしながら、ここで紹介したユースケース以外にもさまざまな形で、他のサービスと連携のうえ企業に導入されています。導入事例の一例を以下に紹介していますので参考にしてください。
Azure Functionsの料金
Azure Functionsの料金は、2022年10月現在では次の3つのプランがあります。
従量課金プラン
リソースの使用量とコードを実行した実行回数で課金
Premiumプラン
vCPU・メモリの数と使用時間に応じて課金
App Serviceプラン
選択した仮想マシンの性能に応じて課金
前述した通り、定期的なプログラムの呼び出しや処理時間が10分を超える規模の大きな処理が想定される場合は、従量課金プランではなくPremiumプランもしくはApp Serviceプランを選択しましょう。
従量課金プランとPremiumプランの詳細は下記公式サイトをご覧ください。
App Serviceプランの詳細は下記公式サイトをご覧ください。
Azure FunctionsでサーバーレスWebサービスの実現を
Azure Functionsは、サーバーの存在をほとんど意識せずにWebサービスを構築できるサーバーレスのスクリプト実行環境です。特定の処理が実施されたことをトリガーに、イベント(Function)を起動して自動処理がなされていきます。また業務要件に応じてスケーリングが可能で、Webシステムなどのアプリケーションをクラウド上で簡単に構築できます。
プログラミング言語のサポートもC#、Java、JavaScript、PowerShell、Pythonなど充実しており、ユーザーが慣れている言語を選択して使えます。拡張機能のDurable Functionsを用いてステートフルな処理が簡単に実装できるのも魅力です。
またバインド機能によって他サービスとの連携が簡単になり、かつ他サービスのAPIが変更されてもアプリケーションの逐一更新が不要で、アプリケーションの保守運用も効率化できるのが大きなメリットです。
Azure Functionsを使ってサーバーレス環境でアプリケーションを構築し、効率的なWebサービス運営を実現していきましょう。
Appendix:Azure Functionsランタイムバージョンと言語の対応表
(プログラム言語サポートはAzure Functionsのバージョンでサポート内容が異なります。詳細を確認されたい方は公式ページをご覧ください。)
Language | 1.x | 2.x | 3.x | 4.x |
---|---|---|---|---|
C# | GA (.NET Framework 4.8) | GA (.NET Core 2.1) | GA (.NET Core 3.1) GA (.NET 5.0) |
GA (.NET 6.0) プレビュー (.NET 7) プレビュー (.NET Framework 4.8) |
JavaScript | GA (Node.js 6) | GA (Node 10、8) | GA (Node.js 14、12、10) | GA (Node.js 14) GA (Node.js 16) プレビュー (Node.js 18) |
F# | GA (.NET Framework 4.8) | GA (.NET Core 2.1) | GA (.NET Core 3.1) | GA (.NET 6.0) |
Java | 該当なし | GA (Java 8) | GA (Java 11、8) | GA (Java 11、8) プレビュー (Java 17) |
PowerShell | 該当なし | GA (PowerShell Core 6) | GA (PowerShell 7.0、Core 6) | GA (PowerShell 7.2) |
Python | 該当なし | GA (Python 3.7、3.6) | GA (Python 3.9、3.8、3.7、3.6) | GA (Python 3.9、3.8、3.7) |
TypeScript | 該当なし | GA | GA | GA |
※2022年10月時点