サーバレスなAWSのコード実行サービス「Lambda」はどのような時に使うか

はじめに

クラウドサービスを利用することでサーバーやネットワーク機器を実際に購入したり設置するスペースを社内に設けたりする必要がなくなり、コストの削減に繋げることができます。これはどのクラウドサービスにも共通するメリットで、サービス形態によってはインフラシステムの保守・管理を担当するエンジニアを自社に配置することなくシステム開発や運用に専念することや、利用状況に応じたリソースの自動スケールアップ・ダウンが可能となります。

クラウドサービスの出始めこそセキュリティ等の懸念から利用される範囲が限定的でしたが、技術の進化とともに大企業のシステム運用でも採用されることが珍しくなくなりました。実際、2010年に米国連邦政府が提唱した「クラウドファースト」というコンセプトは次第に日本にも広がりを見せており、企業だけではなく公的機関・政府のシステムであっても開発する際、システム切り替えをする際にクラウドを第一の選択肢とすることが推奨されています。

AWSの公式サイトにはAWSを導入した事例として、任天堂株式会社、東京海上日動火災保険株式会社、浜松市といった大手企業や公的機関の事例が掲載されていました。そのような背景があり、AmazonのAWS(Amazon Web Services)の他にもGoogleがGCP(Google Cloud Platform)、MicrosoftがMicrosof Azure、AlibabaがAlibaba Cloudをリリースする等、名だたる企業でクラウドサービスが提供されるようになりました。

クラウドサービスには複数のサービス形態があり、その中にはさらに痒い所に手が届くような細かいサービスがたくさん用意されています。AWSにおいては2023年現在、100以上のサービスが提供されています。この記事ではそんなAWSのサーバレスサービスの一つ「Lambda」について紹介していきます。AWS Lambdaの概要についてはもちろん、AWS Fargate、AWS Batchとの違いについても解説するため、これから利用しようと思っていた方、今後を見越して、その他のクラウドサービスと比較検討したいと思っていた方はぜひご覧ください。

クラウドサービスのサービス形態とサーバレスについて

クラウドサービスの基本的な形態はSaaS(Software as a Service)、PaaS(Platform as a Service)、IaaS(Infrastructure as a Service)の3つであり、他にもFaaS(Function as a Service)、DaaS(Desktop as a Service)、CaaS(Container as a Service)等という言葉が出てきています。クラウドサービスの発展と共に新たな概念のサービスも増えると見込まれるため、サービス形態はさらに増えることでしょう。またクラウドサービスにおいて「サーバレスなサービス、サーバレスモデル」という言われ方もしますが、こちらはSaaS、FaaSが該当します。今回取り上げるAWS Lambdaを理解しやすくするために、それぞれがどのようなサービスであるかを簡単に紹介します。もう十分理解しているという方は読み飛ばしてください。

SaaS

すでに開発されたアプリケーション・ソフトウェアで取り扱うデータのみをユーザーが管理するサービスです。サービスによっては仕様として組み込まれた中でのカスタマイズが行える場合もありますが、SaaSは基本的に用意されたサービスをそのまま利用します。有名なものとしてメールサービス「Gmail」やチャットサービス「Slack」、ストレージサービス「Dropbox」、サイボウズのkintone等が挙げられます。

PaaS

SaaSとIaaSの中間に位置するサービスで、ユーザー側の管理範囲はソフトウェア・アプリケーションと、そこで取り扱うデータのみとなります。用途としてはソフトウェア・アプリケーションの開発環境となることが多く、AWSの「Elastic Beanstalk」、GCPの「Google App Engine(GAE)」、Microsoft Azureの「App Service」等が該当します。プログラミング自体は自由にできますが、使用できるOSやプログラミング言語はPaaSサービスとしてあらかじめパッケージされた中からのみ選択が可能となります。

IaaS

インフラ環境の構築からユーザー側で行うことができる自由度の高いサービスです。PaaS同様にOSやプログラミング言語、データベース等はあくまであらかじめパッケージされた中からの選択とはなるものの選択肢が豊富で、CPUやメモリといったスペック、ネットワーク設定、サーバー構成等を自由にカスタマイズできます。そのため管理するにはインフラ関連の十分な知識が必要となりますが、使用するユーザーの状況に見合ったシステムの開発はしやすくなります。AWSの「EC2(Amazon Elastic Compute Cloud)」、Microsoft Azureの「Azure IaaS」、GCPの「Compute Engine」「Persistent Disk」等が代表的なサービスです。

「サーバレス」という言葉について

サーバレスとは、もちろんサーバー無しでシステム運用ができるというわけではなく、サーバーを含めたインフラ環境をユーザー側が意識することなくシステム運用に専念できるサービスのことを表しています。クラウドコンピューティングやリソースの管理やメンテナンス等の保守作業はサービス提供側で行われます。前述したようにSaaS、FaaSといったサービス体系がサーバレスに該当し、自由にカスタマイズできる範囲は限られますが、社内にインフラエンジニア・クラウドエンジニアがいなくても提供されているサービスの知識さえあれば運用が可能となります。

今回取り上げるAWS LambdaはサーバレスでありSaaS、かつFaaSに該当しますが、サーバレスなサービスは多くの人が簡単に利用できる反面、それぞれに独自の仕様を持っているため、新たなサーバレスサービスを採用するごとに操作方法を習得するための学習コストがそれなりにかかることは注意しておかなければなりません。なお、FaaSとは、サーバーの負荷状況に応じて自動的にスケーリングをしながら、プログラムコードの記述さえすれば実行してくれるサービスのことを表します。コードの実行部分のみを賄うため単体で利用されることはほとんどなく、他のサービスと併用される利用方法されます。GCPの場合は「Google Cloud Functions」、Microsoft Azureの場合は「Azure Functions」というサービスがFaaSに該当します。

AWSのLambdaとは?

Lambdaは「ラムダ」と発音されるFaaSサービスで、Lambda関数を使ったコードの実行に特化しています。もちろんクラウドサービスの大きなメリットである「低コストでの運用」が実現できるオートスケーリング、従量課金制という特徴は備えています。細かくは触れませんが、他にもAWSにはアプリケーション統合ができる「Amazon EventBridge」「AWS Step Functions」、Lambdaと同様のコンピューティングとして「AWS Fargate」というFaaSもあります。

サーバレスではあるもののマネジメントコンソールからはメモリ、ユーザー、アクセス許可、セキュリティ等の設定が可能となっています。また、次に紹介するプログラミング言語の実行が可能となっているため、様々なシステムでの利用が見込めます。Lambda自体にログ収集機能は付いていないものの、Amazon CloudWatchやAWS CloudTrailと併せて利用することで実行ログの取得が可能となるため、Lambda自体でログ取得を実行する際のリソースや保存する際の容量確保は不要です。

Lambdaはリクエストが送信されることをトリガーとしてサービスが起動します。Lambdaにリクエストを送信できるサービスは様々で、公式サイトにはストレージサービスである「Amazon S3」のバケット(データを格納する場所)にファイルをアップロードしたことをトリガーとして実行リクエストが送信できることが例として挙げられていました。他にも例えば、メールの送信をトリガーとしてLambda関数を実行し、メールアドレスをデータベースに登録するという仕組みを構築することもできます。なお、Lambda関数については、マネジメントコンソールやLambda APIはもちろん、AWS SDK、AWS CLI、AWS ツールキットから直接呼び出し可能なことも記載されていました。それではLambdaに対応しているプログラミング言語、またその言語がどのような特徴を持ったものかを簡単に紹介します。

Java

オブジェクト指向型の言語として有名で、1990年代中盤にリリースされたから30年程立っている現在でも非常に多くのシステムで利用されています。各種Webサービスやアプリ、業務システム、組み込み系システム、ゲーム等と幅広い分野に対応できるライブラリ・フレームワークも豊富に揃っています。

Go言語

2012年に正式リリースされた比較的歴史の浅い言語で、当初はGoogle内でのみ利用されていましたが、リリース後は様々な企業によってシステム開発に利用されるようになりました。誰でも解読できるようなシンプルな記述でプログラミング可能、高速処理が可能という特徴があります。Go言語が利用されている有名なサービスとしてはYouTubeやメルカリ、ぐるなび等があります。

PowerShell

Microsoftによって開発されたスクリプト言語です。WindowsOSで利用できるコマンドツールと言えばコマンドプロンプトが主流でしたが、今後はコマンドプロンプトの機能が拡張されたPowerShellが推奨されると言われています。それまでWindowsで提供されていたコマンドラインシェルの進化系と見ることができます。

Node.js

名称に「.js」と付いていることからわかるように、JavaScript環境の一つです。それまでJavaScriptはユーザーサイド(フロントエンド)で動作する言語として普及していましたが、サーバーサイドでの開発も行えるようにしたのがNode.jsです。リアルタイムな処理が得意なため、タイムラグを発生させたくないチャットやアプリゲーム等のサービス開発に有効です。

C#

Microsoftの開発したオブジェクト指向の言語です。名称に「C」と付いているので紛らわしいですが、いわゆるC系言語の系譜とは異なります。Microsoftが開発しているため同社のリリースしている製品との相性が良く、各サービスサイトにはC#が利用されているものもあります。しかし実際にはMacOS等、その他OS向けのシステム開発も可能となっています。

Python

Javaより前の1991年にリリースされた言語で、近年は言語の持つメリットを生かしたAI・機械学習、ロボット開発等の分野で利用されています。Webアプリの開発等も可能で、YouTube、Instagram、Dropboxといったサービスの一部もPythonで開発されています。高度な分野の開発ができるもののプログラミング自体はシンプルなため、初心者でも学びやすい言語と言われています。

Ruby

日本国内でJavaと同時期くらいにリリースされた言語で、オブジェクト指向型の言語となっています。同じ宝石の名称が付いている「Perl」という言語を元に開発されており、初心者が学習に取り組みやすいシンプルなコードが特徴となっています。またフレームワークが充実しており、特に「Ruby on Rails」は有名です。アプリやWebサイト、ECサイト、SNSと主にWebサービスに利用されることの多い言語です。

Lambdaを利用するシチュエーション

Lambdaは他のサービスの何らかの挙動がトリガーとなってLambda関数が実行され、その時に料金も発生します。EC2のような仮想マシンサービスであればプログラムを実行するタイミングが1日に数度であってもサーバーを稼働している時間は常に料金が加算されていきます。そのため、実行機会が少ないコードをLambdaに任せるということがコスト面で有効に働きます。クラウドサービスの大きなメリットはコスト削減であるため、Lambdaはクラウドを象徴するAWSサービスの一つと言えるでしょう。もちろんEC2と違ってLambdaはサーバレスであるため、インフラ環境の構築をユーザー側で行わなくて良いという点も大きなメリットとなります。

以上のように、常にインスタンスを稼働させておいたうえでプログラムを実行するこれまでのサーバーサービスと異なり、まるでコールドスタンバイのサーバーのように必要な時に必要な時間分だけ稼働させ、処理を終えたらすぐ停止するという仕組みが採用されているのがLambdaです。ただしLambdaで処理可能な時間は決して長くないため、長時間に渡る処理が必要となる場合の選択肢にはできないことも覚えておきましょう。また1アカウントに対して同時起動可能な数は100が上限となっています。

なおLambdaには多くのリージョンが用意されているため、このメリットを生かすこともできます。例えば東京に設置されたアプリを実行する際にユーザー側が物理的に遠いリージョンからアクセスした場合、本来ならばそれなりの応答時間がかかってしまいます。しかしこの処理をユーザー側に近いリージョンのLambdaで実行させることで応答時間の短縮が図れます。このメリットを使うにはAmazon CloudFrontの「Lambda@Edge」を利用する必要があります。

Lambdaの料金体系と無料枠

ここではLambdaの料金概要について紹介します。実際の料金は変更となる可能性もあるため、Lambdaの課金方式を頭に入れていただき、詳細については公式サイトで確認いただくことをおすすめします。

Lambdaは2023年時点で日本の東京、大阪を含めた全部で29のリージョンが用意されており、ほとんどのリージョンで料金は統一されていますが中東やミラノ、香港、ケープタウン等では多少高くなります。またアーキテクチャはArmとx86の2種類が用意されていて、Armの方が料金が安くなっています。

課金対象はLambda関数の実行回数(リクエスト料金)とメモリに応じた実行時間(期間料金)となります。さらに具体的に述べると、リクエスト料金は関数全体の合計リクエスト数が対象であり、期間料金とはコードの実行が開始されてから結果を返すまで、あるいは終了までの時間が対象です。1か月あたり100万件のリクエスト、1か月あたりメモリ1GBで400,000/秒のコンピューティング時間は毎月無料枠として利用できますが、その後は0.20 USD/1,000,000件のリクエスト(0.0000002 USD/リクエスト)となります。メモリに応じた実行時間は、メモリ1GBで0.00001667USD/秒となります。

なおLambdaはAWSのその他サービスと連携することになりますが、Lambda関数がその他のAWSサービスを使用した場合、データを転送する場合は各サービスにおいて従量課金が発生することも忘れてはなりません。Amazon S3でデータの読み書きをすればAmazon S3側で保存したデータに対して課金され、AWS Lambda関数の内外にデータ転送をした場合はEC2のデータ転送に対する課金がされます。

AWS Fargate、AWS Batchとの違い

AWSのサービスを適切に使い分けできるように、最後にLambdaと似た性質を持っているサービス「Fargate」「Batch」についても紹介します。

Fargateはコンテナ単位の実行が可能なサーバレスサービスです。こちらのサービスもオートスケーリングが可能で、EC2の管理も不要です。料金はワークロード使用量に対して発生する従量課金制です。基本的にECS(Elastic Container Service)というDockerコンテナの実行・停止が可能なサービスと共に利用され、通常は必要となるコンテナの実行環境がFargateを利用することで不要となります。実際に画面上でECSを動作させる環境の選択肢としてEC2とAWS Fargateが表示されるので、AWS Fargateを選択して作成を始めることで利用可能となります。そのためFargate自体が単独のサービスというわけではなく、ECSの1実行環境としてAWS内で提供されていると言えるでしょう。

もう一つのBatchは、名称の通りバッチ処理・ジョブの実行サービスです。バッチやジョブは定期的な特定スクリプトの実行、バックアップ処理といった様々な場面で利用される仕組みで、この処理を同じサーバー内ではなく別のサービスで実行させることでリソースの削減に結びつきます。

キュー機能が初期状態で備わっているため、特に大量データの処理が必要となるバッチを実行する際に適したサービスとなります。入力するパラメータは、スクリプトやコマンドライン引数、制御ファイル、ジョブ制御言語にて可能で、ジョブ定義やジョブキュー、ジョブの作成を順に行い、最終的に実行に至ります。プラットフォームタイプはFargateとEC2のいずれかから選択が可能であるため、この時にFargateを選択することでよりサーバレスを実現したサービスの利用ができるようになると言えるでしょう。

料金についてはBatch自体で発生することはなく、Batchと合わせて利用しているそれぞれの環境で発生することとなります。

まとめ

他のクラウドサービスも同様ですが、AWSには非常に多くのサービスがあり、目的に見合ったサービスがどれになるかがわからないということもあるでしょう。ぜひ今回の記事をきっかけにAWS Lambdaの用途や特徴を覚えていただき、必要な際は選択肢の一つとすることをおすすめします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です