ISO/IEC 22123-2によると、サーバーレスコンピューティングとは、「顧客がハードウェアまたはソフトウェアリソースのプロビジョニング、展開、管理を行うことなく、顧客が様々なクラウド機能を利用できるクラウドサービスカテゴリーです。サーバーレスコンピューティングは、仮想化コンピューティングの一形態です。」[1] シーン・ブリサルズ氏によると、サーバーレスコンピューティングは、クラウドプロバイダー、Function as a Service(FaaS)、マネージドサービス、ツール、フレームワーク、エンジニア、ステークホルダー、その他の相互接続された要素を含む広範なエコシステムです。[2]
サーバーレスとは、クラウドサービスプロバイダーが開発者向けのコード実行に依然としてサーバーを使用しているという意味で、誤った名称です。サーバーレスコンピューティングの定義は時間の経過とともに進化し、多様な解釈が生まれています。ベン・キーホー氏によると、サーバーレスとは厳密な定義ではなく、幅広い範囲を指すものです。厳密な定義や特定の技術に重点を置くのではなく、サーバーレスの考え方を取り入れ、サーバーレスソリューションを活用してビジネス課題に対処することに重点を置くべきです。[3]
サーバーレスコンピューティングは複雑さを解消するものではなく、運用チームから開発チームへと多くの複雑さを移行させます。しかし、運用チームは引き続きアイデンティティおよびアクセス管理(IAM)、ネットワーク、セキュリティポリシー、コスト最適化といった側面を管理するため、この移行は絶対的なものではありません。さらに、アプリケーションをより細分化されたコンポーネントに分割すると管理の複雑さが増す可能性がありますが、粒度と管理の難易度の関係は必ずしも直線的ではありません。多くの場合、モジュール化には最適なレベルがあり、そのメリットが管理オーバーヘッドの増加を上回ることがあります。[4] [2]
Yan Cui氏によると、サーバーレスは顧客価値をより迅速に提供できる場合にのみ導入すべきです。そして、導入にあたっては、組織は小さなステップを踏みながら、リスクを軽減していく必要があります。[5]
サーバーレスアプリケーションは分散コンピューティングに関する誤解に陥りやすい。さらに、以下のような誤解にも陥りやすい。[6] [7]
サーバーレスアプリケーションの監視とデバッグは、分散型、イベント駆動型、そして独自の環境という特性上、特有の課題を抱える場合があります。従来のツールでは不十分な場合があり、サービス間の実行フローの追跡が困難になることがあります。しかし、分散トレースツール(AWS X-Ray、Datadogなど)、集中ログ、クラウドに依存しない可観測性プラットフォームといった最新のソリューションは、これらの課題を軽減しています。OpenTelemetry、AIを活用した異常検知、サーバーレスに特化したフレームワークといった新興技術は、可視性と根本原因分析をさらに向上させています。課題は依然として残っていますが、監視およびデバッグツールの進歩により、これらの限界は着実に解決されつつあります。[8] [9]
OWASPによると、サーバーレスアプリケーションは、従来の攻撃のバリエーション、安全でないコード、そしてサーバーレス特有の攻撃(ウォレット拒否攻撃など[10])に対して脆弱です。つまり、リスクは変化しており、攻撃の防止には考え方の転換が必要です。[11] [12]
サーバーレスコンピューティングはサードパーティサービスとして提供されます。サーバーレス環境で実行されるアプリケーションやソフトウェアは、デフォルトで特定のクラウドベンダーにロックされます。この問題はサーバーレスコンピューティングにおいてさらに深刻化します。抽象化レベルが高まっているため、パブリックベンダーは顧客がFaaSプラットフォームにコードをアップロードすることしか許可せず、基盤となる環境を構成する権限を与えないからです。さらに重要なのは、バックエンド・アズ・ア・サービス(BaaS)を含むより複雑なワークフローを考えると、BaaSサービスは通常、同じプロバイダーのFaaSサービスをネイティブに起動することしかできないということです。そのため、サーバーレスコンピューティングにおけるワークロードの移行は事実上不可能です。したがって、マルチクラウドの観点からサーバーレスワークフローの設計と展開方法を検討することで、この問題を軽減できる可能性があります。[13] [14] [15]
サーバーレスコンピューティングは、クラウドプロバイダーによって最大メモリ、CPU、ランタイム制限など、リソース制限が課せられることが多いため、特定の高性能コンピューティング(HPC)ワークロードには適さない場合があります。持続的または予測可能なリソース使用量を必要とするワークロードの場合、サーバーレスプラットフォームに典型的な従量課金モデルよりも、一括プロビジョニングされたサーバーの方が費用対効果が高い場合があります。しかし、サーバーレスコンピューティングは、その拡張性と弾力性を活用することで、特に高度な並列化とイベント駆動型のワークロードなど、特定のHPCワークロードをサポートできる能力が高まっています。HPCにおけるサーバーレスコンピューティングの適合性は、クラウド技術の進歩とともに進化し続けています。[16] [17] [18]
「砂粒アンチパターン」とは、システム内に過度に小さなコンポーネント(関数など)を作成することを指し、多くの場合、複雑さの増加、運用オーバーヘッド、パフォーマンスの非効率性につながります。[19]「ラムダピンボール」は、サーバーレスアーキテクチャで関数(AWS Lambda、Azure Functionsなど)が断片化されたチェーンで過度に互いを呼び出す場合に発生する可能性のある関連するアンチパターンであり、レイテンシ、デバッグとテストの課題、および観測性の低下につながります。[20]これらのアンチパターンは、分散モノリスの形成に関連しています。
これらのアンチパターンは、多くの場合、公開インターフェースと公開インターフェースを区別する明確なドメイン境界を適用することで対処されます。[20] [21]公開インターフェースは、メソッド、クラス、APIエンドポイント、トリガーなど、技術的にアクセス可能なインターフェースですが、正式な安定性の保証はありません。一方、公開インターフェースには、正式なバージョン管理、徹底したドキュメント、明確な非推奨ポリシー、そして多くの場合、後方互換性のサポートなど、明示的な安定性契約が締結されています。公開インターフェースでは、複数のバージョンを同時に維持し、互換性を破る変更が導入された場合には、正式な非推奨プロセスに従うことが求められる場合もあります。[21]
関数呼び出しの断片化された連鎖は、サーバーレスコンポーネント(関数)が他のリソースと複雑なパターンで相互作用するシステムでよく見られ、スパゲッティアーキテクチャや分散モノリスと呼ばれることもあります。対照的に、より明確な境界を持つシステムでは、サーバーレスコンポーネントがまとまりのあるグループに編成され、内部の公開インターフェースがコンポーネント間の通信を管理し、公開インターフェースがグループ境界を越えた通信を定義します。この違いは、安定性の保証と保守のコミットメントの違いを浮き彫りにし、依存関係の複雑さの軽減に貢献します。[20] [21]
さらに、過剰なサーバーレス関数チェーニングに関連するパターンは、個々の関数ではなくネイティブサービス統合を重視するアーキテクチャ戦略によって対処されることがあります。これは「関数レス・マインドセット」と呼ばれる概念です。しかし、このアプローチは学習曲線が急峻であること、そして同じクラウドベンダーのエコシステム内であっても統合の制限が異なる可能性があることが指摘されています。[2]
サーバーレスデータベースでのレポート作成には課題があります。レポートサービス用のデータを取得すると、境界付きコンテキストが破壊されるか、データの適時性が低下するか、あるいはその両方が発生する可能性があるためです。これは、データがデータベースから直接取得されるか、HTTP経由で取得されるか、あるいはバッチで収集されるかに関係なく当てはまります。マーク・リチャーズはこれを「リーチイン・レポート・アンチパターン」と呼んでいます。[19]このアプローチの代替案として、レポートサービスがデータを取得するのではなく、データベースが必要なデータを非同期的にレポートサービスにプッシュする方法があります。この方法では、サービスとレポートサービスの間に個別の契約が必要になり、実装が複雑になる可能性がありますが、境界付きコンテキストを維持しながら、高いレベルのデータの適時性を維持するのに役立ちます。[19]
DevSecOpsプラクティスを採用することで、サーバーレス技術の利用とセキュリティを向上させることができます。[22]
サーバーレスアプリケーションでは、インフラストラクチャとビジネスロジックの区別が曖昧になることが多く、アプリケーションは通常複数のサービスに分散されます。テストの有効性を最大化するために、サーバーレスアプリケーションでは統合テストが重視されます。[5]さらに、デバッグと実装を容易にするために、境界付けられたコンテキスト内ではオーケストレーションが使用され 、異なる境界付けられたコンテキスト間では振り付けが採用されます。[5]
エフェメラルリソースは通常、高い凝集性を維持するためにまとめて管理されます。しかし、 AWS RDSクラスターやランディングゾーンなど、スピンアップに長い時間がかかる共有リソースは、別々のリポジトリ、デプロイメントパイプライン、スタックで管理されることがよくあります。 [5]