今日のトピックは誰もが一度は耳にしたことがあってもほとんど誰も説明できないものですサーバーレス一体何なのでしょうか単に何もないところでコードが動いているだけなのでしょうかそれとももっと大きな何かがあるのでしょうかはっきりさせておきましょうサーバーレスとはサーバーがないという意味ではありませんサーバーのことを考えなくて良いという意味でありその違いがソフトウェア構築のあり方を一変させるのですこのエピソードを最後まで見ればAzure Functionsの正体実際の料金体系そしていつ使うべきかが理解できるはずです最大の誤解から始めて構成要素ごとに分解していきましょうサーバーレスの本当の意味とはいくつかの誤解をすぐに解いておきましょうサーバーレスという名称はマイクロソフトが考えた中で最悪のマーケティング用語ですサーバーが文字通り存在しないかのような印象を与えてしまいますそれは間違いですサーバーは存在しますそれも大量にただ私たちが触れる必要が一切ないだけです20年前インターネット上でコードを動かそうと思ったら膨大な作業が必要でした仮想マシンを借りOSをインストールしウェブサーバーを設定してアプリケーションをデプロイするのですそして毎週末セキュリティパッチを当てたり深夜3時にシステムが落ちないよう見守ったりしていましたそれにこれを聞いてくださいコードが動いていようがいまいがサーバー代は支払わなければなりませんでしたサーバーは眠っている間もずっと稼働しお金を浪費し続けていたのですサーバーレスはこのモデルを根元から覆しますコードを書いてアップロードすればあとはプラットフォームがすべて処理してくれますOSの管理セキュリティパッチスケーリング可用性まであなたの仕事は重要なロジックを書くことだけですレストランの厨房を運営することと自動販売機を使うことの違いだと考えてみてくださいレストランの厨房にはスタッフ絶え間ない食材の補充メンテナンスが必要です客が一人も来なくても毎日コストがかかります一方自動販売機は誰かがボタンを押すまで隅でじっとしていますボタンが押されると動き出し仕事を終えるとまた眠りにつきます実際に動いている時だけ電気代を払えば良いのですそれがサーバーレスの真髄ですAzure Functionsはこの仕組みに対するマイクロソフトの回答ですイベントに応じて小さなコード断片を実行しますコードは何かに呼び起こされるまでは休止しており実行が終わればまた眠りにつきますでは実際のコードはどのようなものなのでしょうかAzure Functionsの正体関数とは特定の仕事を一つだけこなすコードの断片のことですそれだけですログイン画面やデータベース20もの画面を持つようなアプリケーション全体ではありません一つの目的に特化したタスクなのです家の照明のスイッチを想像してみてくださいオンになると動き出し仕事が終わればまたオフになります従来のウェブサーバーはその逆で誰もいない家で24時間365日全ての電気をつけっぱなしにしているようなものですAzure Functionsは様々なプログラミング言語をサポートしていますJavaScript、Python、C Sharp、Java、PowerShellなど使い慣れた言語を選べます正解は一つではありませんすでに知っている言語を選びましょうここでよくある混乱を解消しておきましょう関数アプリと関数、ファンクションは同じものではありません関数アプリとはコンテナのようなものです道具箱を想像してくださいまず関数アプリという一つの道具箱を作りその中に複数の関数を追加していきます各関数はそれぞれの仕事をするための個別の道具です例えばユーザー登録を処理する関数、アップロードされた画像を処理する関数、夜間にレポートを送信する関数などがありますそれらはすべて同じ道具箱に入っていますが個別に動作します関数についてもう一つこれらは設計紙ステートレスですつまり実行の合間に情報を保持することはありません関数がファイルを処理して終了すればそこで終わりです次に実行されるときは前回の記憶がない状態でゼロから開始されます制限のように聞こえますが実はこれこそが関数を強力にしている機能なのです関数はメモリや状態を保持しないためトラフィックが急増すればアジュールが瞬時に100個のコピーを立ち上げ減少すれば素早くシャットダウンできますこれこそがアイドル状態のサーバーにコストをかけずにスケーラビリティを実現する方法ですここで疑問です何かが起動させるまで何もしない関数は一体何が起動させているのでしょうかそこで登場するのがトリガーですトリガーとはいつ実行するかを決めるものです全ての関数には必ず一つのトリガーが必要でこれは必須の設定ですトリガーは関数を呼び起こすイベントのことですトリガーがなければコードは何もせずに待機しているだけですトリガーを玄関の予備輪に例えてみましょう関数は家の中で待機していますいつまでも待ち続けることができます誰かが予備輪を鳴らすまでは何も起こりません予備輪が鳴ると関数が動き出しドアを開けて仕事をこなしまた待機状態に戻ります初心者が最もよく遭遇するトリガーは4つありますhttpトリガーが最も一般的な出発点です誰かがurlにアクセスしたりapiを呼び出したりすると関数が起動しますこれを利用すればフルスペックのwebサーバーを構築せずに軽量なapiを作成できます次にスケジュールに従って実行されるタイマートリガーがありますクローン式を設定して1時間ごとや毎晩深夜0時といった時間を指定すればそのタイミングで関数が実行されますメンテナンス作業やクリーンアップジョブ夜間レポートの生成などに最適ですブロブトリガーはファイルがazureストレージにアップロードされたときに起動します例えば誰かが特定のフォルダにpdfをアップロードしたとしますブロブトリガーがそのアップロードを検知し自動的に関数を実行しますこれは画像処理やドキュメント変換ファイルの検証などに非常に役立ちますそしてqトリガーはqにメッセージが届いたときに起動しますqはシステムの各パーツを素結合にするための手段ですあるサービスがqにメッセージを入れれば関数がそれを受け取り準備ができたときに処理しますこれにより一つの遅いサービスが他のすべてをブロックするのを防げますここが重要なポイントですトリガーが起動するとデータが自動的に関数へ渡されますポーリングしたり何かが起きたかを確認したりする必要はありませんトリガーが必要なものすべてを提供してくれるので関数はそれを処理するだけですトリガーのない関数は何もせずにただそこに存在するコードにすぎませんトリガーこそが関数に目的を与えるのですつまりトリガーは関数に実行タイミングを伝えますではデータはどこから来てどこへ行くのでしょうかそこで登場するのがバインディングですバインディングはデータの入出力を担いますバインディングを使えば余計なコードを書かずにどのデータを読み込みどこに結果を送るかを関数に指定できます少しややこしいので簡単に説明しましょう2種類存在します入力バインディングはデータを関数に取り込みます出力バインディングはデータを外へ送り出しますバインディングがなければストレージアカウントやデータベースQと通信するたびにSDKコードを書く必要があります接続文字列の管理やリトライ処理データのシリアライズレスポンスのデシリアライズが必要ですたった一つのファイルを読み込むために大量の提携コードが必要になってしまいますバインディングを使えば必要なものを宣言するだけで済みますこのブログコンテナから読み込みたいと指定するだけですあるいはこのQに書き込みたいといった具合です残りの処理はランタイムが言ってくれます接続を開きデータを読み込みパラメータとして関数に渡してくれます関数が終了すると戻り値を受け取り指定した場所に書き込んでくれますバインディングはパイプのようなものだと考えてください関数をストレージアカウントやデータベースQに接続しますデータはそれらのパイプを通って自動的に流れます関数はパイプの仕組みを知る必要はありません流れてきたものを受け取り送るべきものを送り出すだけです具体的な例を見てみましょうブロブ入力バインディングがある場合で説明します関数が開始されるとブロブストレージからファイルが自動的に読み込まれパラメータとして渡されますストレージのSDKコードを書く必要はありませんデータを受け取って処理するだけです別の例としてQの出力バインディングがあります関数で何らかの処理を行い最後に値を返すだけですランタイムがその値を受け取りシリアル化してQに格納しますQを操作するコードを書く必要はありません値を返すだけでいいのですバインディングはオプションです0個でも1個でも複数でも構いませんトリガーだけでバインディングを一切必要としない関数もあります逆に異なるサービスに接続するバインディングを3つや4つ持つものもありますトリガーとバインディングの組み合わせこそがAzure Functionsを強力にしているのですあなたはビジネスロジックつまり実際の意思決定を行うコードを書くだけです統合に関連する処理はすべてプラットフォームが担いますそのため関数は小さく焦点を絞った理解しやすい状態にもたれます次は料金についてですこの料金体系はほとんどの初心者を驚かせます多くの場合消費プランコンサンプションプランがデフォルトの選択肢であり9割のケースでこれから始めるべきです仕組みはこうです関数が実際に実行された時だけ料金が発生しますアイドル状態であれば料金はかかりません0、1000もかかりません料金は2つの要素で構成されます1つ目は実行数つまり関数が何回起動したかです2つ目は実行時間でギガバイト秒という単位で計測されますこれは基本的に関数の実行時間に使用メモリ量を掛け合わせたものです無料枠は非常に寛大です毎月100万回の実行と40万ギガバイト秒までが完全に無料ですほとんどの小規模プロジェクトやホビーアプリ、プロトタイプであれば費用は一切かかりません一生無料ですもし無料枠を超えても料金は驚くほど安価です100万回実行あたり20セントですタイプミスではありません100万回の実行でわずか20セントですスイッチを入れた時だけ電気代を払うようなものだと考えてください壁の中の配線に対して月額の基本料金を払う必要はありません実際に使用した電力分だけを支払うのですさて他のプランも存在しますフレックスコンサンプションは比較的新しく仮想ネットワークをサポートしていますプレミアムは関数を常にオウム状態に保つためコールドスタートによる遅延がありませんデリケーテッドは従来のアップサービスプランで固定容量を提供しますしかしまずはコンサンプションプランを選択するのがほとんどの場合において最適ですただし一つ注意点があります無料枠は同じサブスクリプション内の全ての関数アプリで共有されますもし10個の関数アプリがあればそれら全てが同じ100万回の無料枠を分け合うことになりますそのためアプリを複数作り始める場合はその点に注意してください料金は素晴らしいですよでは具体的な例を挙げてみていきましょう現実世界のシナリオですユーザーがプロフィール写真をアップロードするウェブサイトを運営していると想像してくださいそれらの画像が1枚10MBもあるような巨大なものだとしますするといくつか深刻な問題が発生します大きなファイルはストレージ費用がかさみページを読み込むたびにサイトの表示速度が低下し写真の読み込みを待たされるユーザーをイライラさせてしまいますそこで画像を自動的に縮小する方法が必要になりますAzure Functionsを使わなければバックグラウンドで動作するワーカーをゼロから構築しなければなりませんつまり別のサーバーを用意しワークロードを管理するキューを設定し複雑な処理を行うコードを書く必要があるのです画像の縮小という単純な作業にしてはあまりにも複雑すぎますAzure Functionsなら必要なのは一つのブロブトリガーと一つの関数だけですサーバーを管理する心配もありません仕組みを説明しましょうユーザーがウェブサイトから写真をアップロードするとそのファイルがAzureブロブストレージに保存されますファイルが保存された瞬間ブロブトリガーが自動的に起動します関数が動作して圧縮コードを実行し縮小されたバージョンをストレージに保存しますこれらすべてが数秒のうちに完了しますこの処理はすべてバックグラウンドで目に見えない形で行われるためユーザーが待たされることはありませんもう一つ日常的な例を挙げますサービス登録時のウェルカムメール送信ですhttpトリガーがウェブサイトからの登録リクエストをキャッチします関数が起動してユーザーのメールアドレスを取得しセンドグリッド経由でウェルカムメールを送信して完了ですユーザーはほぼ瞬時にメールを受け取りますメールサーバーの設定も送信級の管理も不要一つの関数で一つの仕事を完了するだけです ワークフローではなく何かのきっかけで起動し特定の処理を的確に行うためのものですアジュールファンクションズはいつ使うべきでしょうかではいつ関数を選択しいつ別の手段を使うべきなのでしょうか判断するための簡単な基準がありますそのタスクが短時間で終わりイベント駆動型でありステートレスであるかどうかを自問してみてくださいすべてイエスならアジュールファンクションズが最適なツールですまずは適したユースケースから見ていきましょうAPIやWebhookは完璧な組み合わせですhttpリクエストに応答して一つの処理を行い結果を返す軽量なエンドポイントが必要な場合まさにhttpトリガーがうってつけですファイルや画像の処理も重要なユースケースですファイルがストレージに保存されると関数が起動し処理して結果を保存するこれらすべてがサーバーレスで実現できます夜間のクリーンアップやレポート生成のような定期的なタスクにはタイマートリガーが最適ですETLパイプラインのためのデータ変換もよくある用途ですまたファンクションズは本来連携しない2つのサービスを接続する統合の接着剤としても完璧ですでは次にファンクションズが適さない場合についてお話しします長時間実行される処理は問題になります重量課金プランでは関数のタイムアウト制限はデフォルトで5分設定しても最大10分だからですそれ以上の時間がかかるジョブであれば別の手段が必要ですステートフルなアプリケーションも不向きですファンクションズは実行間で何も記憶しませんセッション状態の保持やステップ間の進捗管理が必要な場合その設計思想に反することになります高負荷な計算処理も適していません数分から数時間にわたってCPUを占有する必要があるなら仮想マシンやコンテナの方が良い選択ですまたあるタスクが別のタスクに依存するような複雑なワークフローはデュラブルファンクションズやロジックアップスで処理する方が適していますここで代替手段の概要を簡単に説明しますAzure Logic Appsはサービスを接続するためのノーコードの選択肢ですカスタムコードを書く必要がないのであればロジックアップスならビジュアルデザイナーだけで作業を完結できますAzure Appsサービスは24時間365日稼働するフル機能のウェブアプリケーション向けです常時稼働する完全なウェブサイトやAPIが必要ならこれが最適なツールですAzure Container Appsはランタイムをより詳細に制御できるコンテナ化されたマイクロサービスを提供しますそしてAzure Virtual Machinesは必要に応じてオペレーティングシステム全体を完全に制御できますここで単純な目安を紹介しましょうジョブを一文で説明できるならそれはファンクションズに適した候補と言えます画像がアップロードされたら圧縮する誰かがサインアップしたらウェルカムメールを送る毎晩深夜にクリーンアップジョブを実行する一つの文一つの仕事一つの関数避けるべき初心者のよくある失敗では注意すべき点についていくつかお話ししますこれらは初心者の誰もが最初に陥りやすいミスですよくある初心者のミスはファンクションズは常に無料だと思い込むことです無料枠は寛大で100万回実行は多く聞こえるかもしれませんが関数が急激に拡散したりボットの攻撃を受けたりすると実行回数はすぐに積み上がりますですので使用状況を監視しAzureで予算アラートを設定して月末に予期せぬ請求が来ないようにしましょうもう一つのミスはコールドスタートを無視することですアイドル状態から関数が初めて実行される際は時間がかかります重量課金プランでは数秒かかることがありますほとんどの用途では問題ありませんしかしミリ秒単位が重要な0.4に敏感なAPIを構築している場合はプレミアムプランを検討するかAlways Ready Instanceを有効にしてくださいそれから実行時間が長すぎる関数を書くことも避けるべきです重量課金プランにはタイムアウトがありデフォルトは5分最大でも10分ですもし関数の処理に15分かかる場合途中で強制終了されてしまいますジョブを細かく分割するか別のホスティングプランを使用してください見落としがちなも一つのポイントはパッケージからの実行デプロイを使っていないことですこれは簡単な設定変更でコールドスタートを改善しデプロイをより確実にします個別のファイルをコピーする代わりにジップパッケージをデプロイするのですポータルでチェックボックスを一つ入れるだけです実行しましょう認証なしでhttpエンドポイントを公開するのもありがちな罠ですテスト中に匿名設定のままにしておきロックするのを忘れがちです最初から権限レベルを正しく設定しておきましょう関数キーまたは管理者キーを使用してください扉を開けっぱなしにしないでください複数の関数アプリでストレージアカウントを使い回すのも問題です開発環境であれば共有しても問題ありません本番環境では各関数アプリに専用のストレージアカウントが必要ですそうしないとある関数のトラフィックが別の関数を遅くする隣接干渉の問題が起きます最後はアプリケーションインサイトを有効にしていないことですこれがないと手探り状態で運用することになります失敗やエラーパフォーマンスの問題を把握できません関数が長時間実行されているのかサイレントに失敗しているのかもわかりません初日から必ず有効にしてください設定は30秒で済みデバッグの時間を何時間も節約できますこれらすべてに共通する黄金率は関数を小さく焦点を絞りステートレスに保つことです関数一つにつき一つの仕事それ以上は不要ですシステムについては以上ですAzure Functionsはイベントに応答して小さなコードを実行するサーバーレスコンピューティングですコードが実行される時だけ料金が発生しますトリガーが起動のタイミングを伝えバインディングが必要なデータに接続し重量課金プランなら小規模プロジェクトはほぼ無料で運用できます今すぐできる最善の一手はAzureポータルでシンプルなhttpトリガー関数を作成することです5分で完了し費用はかかりませんマイクロソフトナレッジナゲッツを登録してわかりやすい解説をチェックしサーバーレスとは何かと聞いてくる友人にこの動画をシェアしてくださいフラウ