How to quickly develop and deploy serverless applications?
はじめに:本記事では、サーバーレスアプリケーションの開発とデプロイ方法について詳しく紹介します。Alibaba Cloud Function Compute コンソールおよび開発者ツール Serverless Devs を通じてアプリケーションの初期化とデプロイを行い、最後にアプリケーションのデバッグや、体系的なリリース、可観測性などを通じたデプロイと運用保守のまとめを共有します。さらに、アプリケーションの初期化からデバッグ、リリース、運用保守に至る基本的なプロセスと核心的なステップを探ります。
1. サーバーレスアプリケーションの開発とデプロイ方法
1. コンソールを通じた関数の作成
次に、サーバーレスアーキテクチャに基づく FaaS プラットフォーム上で Hello world を出力する実装を行います。基本的な手順は以下のとおりです。
1) アカウントを登録してログインする。
2) 対応する FaaS プロダクトを見つける:Alibaba Cloud の Function Compute。
3)「関数の作成」ボタンをクリックして関数を作成する。
4) 関数を設定する。関数名、ランタイム(使用するプログラミング言語やプログラミング環境など)を含みます。
5) 作成を完了してテストする。
Alibaba Cloud Function Compute を例に取ると、Alibaba Cloud アカウントの登録とログイン後、Function Compute プロダクトを見つけてプロダクトホームページにアクセスする必要があります。
Alibaba Cloud Function Compute プロダクトホームページ
左側の「サービスと関数」を選択し、サービスを作成します。
Alibaba Cloud Function Compute 関数作成ページ
他のクラウドプラットフォームと比較して、Alibaba Cloud Function Compute プラットフォームでは、作成する関数の関数名の設定やランタイムの選択だけでなく、関数が属するサービスも設定する必要があります。Alibaba Cloud 関数コンピューティングシステムにおいて、サービスの概念を導入することには以下のようなメリットがあります。
・関連する関数をサービスの下に分類でき、ラベルによる分類よりも直感的です。
・関連する関数が同じサービスの下で VPC 設定、NAS 設定、ログストア設定などの一部の設定を共有できます。
・サービスを通じて、関数の環境を適切に分割できます。たとえば、あるアルバムプロジェクトに本番環境、テスト環境、開発環境がある場合、サービスレベルで album-release、album-test、album-dev の 3 つのサービスを作成し、環境を分離可能です。
・サービスを活用することで、関数を適切に整理可能です。プロジェクトが比較的大きい場合、多数の関数が生成される可能性があり、同じ階層に置くと非常に混乱しやすくなります。このような場合、サービスを活用して効果的に整理可能です。
関数の作成後、コードを編集できます。Alibaba Cloud Function Compute は、オブジェクトストレージからのコードアップロード、コードパッケージの直接アップロード、およびオンライン編集に対応しています。さらに、Alibaba Cloud Function Compute はフォルダーの直接アップロードにも対応しています。図を参照してください。
コードを保存した後、「実行」ボタンをクリックして関数をトリガーし、テスト可能です。
システムが関連するログを出力していることが確認できます:Hello world。これで、非常にシンプルな関数の作成に成功しました。
2. ツールを通じた関数の作成とデプロイ
サーバーレス開発者ツールを利用することで、サーバーレスアプリケーションの開発、デプロイ、運用保守を非常に簡単に始められます。Serverless Devs を例に、Alibaba Cloud Function Compute アプリケーションのデプロイを紹介し、ツール側での関数の作成、デプロイ、その他の関連機能を探ります。
Serverless Devs は、開発者に強力なツールチェーンを提供することに特化したオープンソースのサーバーレス開発者プラットフォームです。このプラットフォームを通じて、開発者はマルチクラウドのサーバーレスプロダクトをワンクリックで体験し、サーバーレスプロジェクトを迅速にデプロイ可能です。現在の公式説明によると、Serverless Devs は AWS Lambda、Alibaba Cloud Function Compute、Baidu Smart Cloud Function Computing、Tencent Cloud Cloud Function、Cloud Function Workflow など、複数のクラウドベンダーに対応しています。
サーバーレス関連プロダクト。
Serverless Devs 開発者ツールを使用し、Alibaba Cloud Function Compute を例に、サーバーレスアプリケーションの作成とデプロイ方法を実践的に探りましょう。
1) Serverless Devs 開発者ツールをインストールします(npm install -g @Serverless-devs/s コマンドを実行)。
2) Aliyun の認証情報を設定します(s config add --AccessKeyID AccessKeyID --AccessKeySecret AccessKeySecret --AccountID AccountID コマンドを実行)。
3) テンプレートプロジェクトを作成します(s init node.js12-http -d fc-hello-world-demo コマンドを実行)。初期化プロセスは図を参照してください。
Serverless Devs を使用したプロジェクト作成
4) プロジェクトディレクトリに移動し(cd fc-hello-world-demo コマンドを実行)、デプロイします(s deploy コマンドを実行)。デプロイ後の結果は図を参照してください。
Serverless Devs を使用したプロジェクトのデプロイ
プロジェクトのデプロイが成功したら、以下のような追加の操作が実行可能です。関数のトリガー(s invoke コマンドを実行)
Serverless Devs を使用した関数のトリガー
オンライン関数の詳細を表示する(s info コマンドを実行)
Serverless Devs を使用した関数の詳細表示
Serverless Devs には、比較的充実したデスクトップクライアントもあります。開発者はデスクトップクライアントを通じてアプリケーションの作成と管理、および関連する付随機能を利用できます。たとえば、アプリケーション一覧の表示やアプリケーションの素早い作成が可能です。図を参照してください。
Serverless Devs デスクトップクライアントを通じたアプリケーション一覧の表示
アプリケーションの作成後、アプリケーションを管理可能です。下図は Serverless Devs デスクトップクライアントのアプリケーション管理画面です。
Serverless Devs デスクトップクライアントを通じたアプリケーションの管理
その他の付随機能の利用方法は以下のとおりです。図はワンクリック負荷テスト関数のパフォーマンスを示しています。
Serverless Devs デスクトップクライアントを通じたワンクリック負荷テスト関数のパフォーマンス
ワンクリックでの関数リソースのデバッグ。図を参照してください。
Serverless Devs デスクトップクライアントを通じた関数リソースのワンクリックデバッグ
関数の多次元指標情報をワンクリックで表示する。図を参照してください。
Serverless Devs デスクトップクライアントを通じた関数の多次元指標情報のワンクリック表示
さらに、Serverless Devs には便利な YAML 可視設定機能もあります。下図を参照してください。
Serverless Devs デスクトップクライアントを通じた YAML 可視設定
2. サーバーレスアプリケーションのデバッグ方法
アプリケーション開発中または開発完了後、実行結果が期待に沿わない場合、通常何らかのデバッグが必要になります。ただし、サーバーレスアーキテクチャでは、デバッグはしばしば大きな課題に直面します。特に環境要因による制約がある場合です。通常、以下のような状況が発生します:ローカルで開発したアプリケーションは正常に期待どおり動作するが、FaaS プラットフォーム上では予期しない問題が発生する、あるいは一部の特殊な環境ではオンライン環境をローカルでシミュレートできず、アプリケーションのデバッグが困難になります。サーバーレスアプリケーションのデバッグは常に批判の的となってきましたが、各クラウドベンダーはデバッグの方向での深い探求を諦めていません。以下にいくつかの方法を紹介します。
1. オンラインデバッグ
(1) シンプルデバッグ
シンプルデバッグとは、コンソール上でデバッグを行うことです。Alibaba Cloud Function Compute を例に取ると、コンソールの「コード実行」ボタンを通じて基本的なデバッグを実行可能です。下図を参照してください。
必要に応じて、Event を設定することで一部のイベントをシミュレートすることも可能です。
オンラインデバッグの利点は、一部のオンライン環境をコードテストに利用できることです。オンライン環境に VPC などのリソースがある場合、ローカル環境でのデバッグは困難です。
(2) ブレークポイントデバッグ
シンプルなオンラインデバッグに加えて、一部のクラウドベンダーはブレークポイントデバッグにも対応しています。たとえば、Alibaba Cloud Function Compute のリモートデバッグがあります。Alibaba Cloud Function Compute のリモートデバッグを例に、コンソールを通じた関数のオンラインデバッグの方法を紹介します。関数の作成後、リモートデバッグを選択し、「デバッグを有効にする」ボタンをクリックします。図を参照してください。
Function Compute リモートデバッグページ
デバッグを有効にした後、しばらく待つと、システムがリモートデバッグインターフェイスに入ります。図を参照してください。
Function Compute リモートデバッグ開始ページが表示されたら
下図に示すインターフェイスが表示されたら、ブレークポイントデバッグを実行可能です。
Function Compute リモートデバッグ ブレークポイントデバッグページ
2. デバイス・クラウド連携デバッグ
ローカルでサーバーレスアプリケーションを開発する際、オブジェクトストレージのトリガーを通じた関数実行のトリガーや VPC を通じたデータベースへのアクセスなど、一部のオンラインリソースが関与することがよくあります。このとき、オンラインとオフラインの環境の不一致により、オフラインの開発とデバッグは非常に大きな課題に直面します。Serverless Devs 開発者ツールは、プロキシ補助関数を構築することでオンラインとオフラインのリソースを接続し、開発者がローカルでアプリケーションを開発・デバッグできるよう迅速に支援します。このデバッグ方法はデバイス・クラウド連携デバッグと呼ばれます。
下図に示すように、Serverless Devs 開発者ツールは YAML 設定ファイルに基づいて補助サービスと補助関数を作成し、補助サービスと補助関数を通じてオンラインとオフラインのリソースを接続し、エンドツーエンドのデバイス・クラウド連携デバッグを実現します。
Serverless Devs デバイス・クラウド連携デバッグの原理概略図
Serverless Devs 開発者ツールは YAML 設定ファイルの内容に基づいて補助サービスと補助関数を作成します(補助サービスは YAML で宣言されたビジネスサービスの設定と一致します)。
補助関数(Function Compute C)はトリガー(SDK、API、s proxied invoke コマンド、またはその他のトリガーを含む)を通じてトリガーされ、リクエストフローはローカルのデバッグインスタンス(ローカル環境 A)に返されます。このとき、ローカルデバッグインスタンス(ローカル関数実行環境コンテナ)が受信するイベントとコンテキストは、実際にはオンラインからのものです。
ローカルデバッグインスタンス(ローカル環境 A)は以下に直接アクセスできます。
・VPC 内網リソース(RDS、Kafka 内網アドレスなど)
・一部のクラウドサービスの内網アドレス
・ディスクマウントサービス(NAS への直接アクセス)
デバイス・クラウド連携デバッグの手順は以下のとおりです。
1) s proxied setup コマンドを実行して、デバイス・クラウド連携デバッグに必要な補助リソースとローカル環境を準備します。
2) トリガーのない一般的なイベント関数または HTTP トリガーの場合、準備完了後、別の新しいターミナルを起動し、プロジェクトパスに切り替えて、s proxied invoke コマンドを実行してローカル関数を呼び出します。
3) デバッグタスクが完了したら、s proxied cleanup コマンドを実行して、デバイス・クラウド連携デバッグに必要な補助リソースとローカル環境をクリーンアップします。
コマンドによるデバイス・クラウド連携デバッグ機能の利用に加えて、VSCode 開発者ツールでもデバイス・クラウド連携デバッグ機能を利用可能です。図を参照してください。
VSCode でのデバイス・クラウド連携デバッグ機能の使用
3. リモートデバッグ
デバイス・クラウド連携デバッグには、ローカルにチャネルサービスコンテナのほかに、ローカル関数を実行する関数コンピューティングコンテナもあります。リモート補助関数はシンプルにリモートトラフィックをローカルに送信します。実際のデバッグプロセスでは、インスタンスにログインしてプロジェクトをデバッグする必要があります。この場合、リモートデバッグの使用を選択可能です。
デバイス・クラウド連携デバッグと比較して、リモートデバッグはローカルにチャネルサービスコンテナのみを持ち、実行プロセスは完全にオンラインに依存します。リモート関数は実行結果を返します。リモートデバッグの全体的なアーキテクチャ概略図は図を参照してください。
上記のリモートデバッグアーキテクチャ図に示すチャネルサービスを通じてオンライン環境にログインしてコードデバッグや問題の特定を行うだけでなく、一部のクラウドベンダーはインスタンスに直接ログインしてコードデバッグを行う機能も提供しています。Serverless Devs を例に取ると、Alibaba Cloud Function Compute を使用する場合、instance コマンドを通じてオンラインインスタンスに直接ログイン可能です。
instance ログインコマンドは便利なログイン体験を提供し、複雑なシナリオでのアプリケーション例外の特定などの問題を解決するのに役立ちますが、インスタンスにログインした後、ユーザーは関数のログやモニタリング指標を通じて直接問題を特定することはできず、coredump、tcpdump、jmap などのツールを使用して詳細なトラブルシューティングを行う必要があります。
たとえば、あるユーザーが最近オンラインプログラムで関数のエラープロンプトが表示され、エラー内容はリモートサービスへの接続がタイムアウトしたというものでした。ユーザーは関数インスタンスとリモートサービス間のネットワーク接続が不安定であると疑い、インスタンスに入ってインスタンスとリモートサービス間のネットワーク状況を分析したいと考えます。この場合、以下の手順に従って問題をトラブルシューティング可能です。
1) 図に示すように、インスタンスにログインした後、apt-get update コマンドと apt-get install tcpdump コマンドを実行して tcpdump ツールをインストールする必要があります。
2) インストール完了後、tcpdump コマンドを実行してリモートサービス IP のリクエストをキャプチャし、キャプチャ結果を tcpdump.cap ファイルに保存します。
3) パケットキャプチャ後、OSS コマンドラインツール ossutil64 を使用して tcpdump.cap ファイルを自身の OSS にアップロードし、ローカルにダウンロードして解析ツール Wireshark で分析します。
4. ローカルデバッグ
(1) コマンドラインツール
ほとんどの FaaS プラットフォームは、ユーザーに比較的充実したコマンドラインツールを提供しています。たとえば、Alibaba Cloud の Funcraft や、Serverless Framework、Serverless Devs などのマルチクラウドベンダーに対応したオープンソースプロジェクトもあります。コマンドラインツールを通じたコードデバッグの方法は非常にシンプルです。Serverless Devs を例に取ると、Alibaba Cloud Function Compute のローカルデバッグ方法は以下のとおりです。まず、ローカルに Function Compute プロジェクトがあることを確認し、プロジェクトの下でデバッグコマンドを実行します。たとえば、Docker でのデバッグは以下のとおりです。
コマンドラインを通じたローカルデバッグ
(2) エディタープラグイン
VSCode プラグインを例に取ると、Alibaba Cloud Function Compute の VSCode プラグインをダウンロードしてアカウント情報を設定した後、ローカルで新しい関数を作成し、クリック後にブレークポイントデバッグを実行します。図を参照してください。
3. 開発者ツールを通じた依存関係のインストールとプロジェクトビルド
サーバーレスアーキテクチャでのアプリケーション開発と従来のアーキテクチャでのアプリケーション開発の大きな違いの一つは、両者の内容の次元が異なることです。たとえば、理想的な状態では、前者はサーバーなどの基盤リソースに注意を払う必要がありません。
しかし、現在のサーバーレス開発段階において、サーバーレスアーキテクチャでのアプリケーション開発は本当にサーバーに追加の注意を払う必要がないのでしょうか。実際にはそうではありません。サーバーレスアーキテクチャは Noserver の理念を強調していますが、実際の開発では、プラットフォーム間で使用できない多くの依存関係があります。たとえば、Python 言語の一部の依存関係はバイナリコンパイルが必要で、オペレーティングシステムやソフトウェア環境などと比較的大きな関連があるため、このような依存関係をプロジェクトに導入する場合、関数コンピューティングプラットフォームのオンライン環境と一致する環境で依存関係のインストール、コードのパッケージング、またはプロジェクトのデプロイを行う必要があります。
Alibaba Cloud Function Compute は、自身のオンライン関数環境について詳細な説明を提供し、対応するドキュメントを用意しています。たとえば、C、C++、Go でコンパイルされた実行ファイルは、Function Compute の動作環境と互換である必要があります。
Function Compute の Python 動作環境は以下のとおりです。
・Linux カーネルバージョン:Linux 4.4.24-2.al7.x86_64
・Docker ベースイメージ:docker pull python:2.7; docker pull python:3.6
しかし、実際のアプリケーション開発プロセスでは、依存関係のパッケージングは依然として多くの開発者にとって頭の痛い問題です。多くのサーバーレスアプリケーションの開発で同様の課題に直面します:プロジェクトはローカルでは正常に動作するが、オンラインにリリースすると特定の依存関係が見つからない、しかし実際には依存関係は存在する。このとき、問題の特定が非常に困難になります。
現在、サーバーレスアプリケーションの依存関係のインストールやプロジェクトビルドには通常 3 つの方法があります。
1) ローカルでプロジェクトを作成した後、クラウドベンダーが提供する環境データに基づいて自らオンライン環境を構築し、依存関係をインストールします。この方法は比較的自由度が高く制御しやすいですが、非常に難易度が高く操作も煩雑です。
2) 既存の開発者ツールを使用して依存関係をインストールします。図を参照してください。
Serverless Devs 開発者ツールと Alibaba Cloud Function Compute プロダクトを例に取ると、開発者は言語の慣習に従って対応する言語の依存関係インストールファイルを準備するだけです。たとえば、Python 言語の requirements.txt、Node.js 言語の package.json などです。その後、現在のプロジェクトの下で s build --use-docker コマンドを実行すると、Alibaba Cloud Function Compute プラットフォームのオンライン環境と一致する環境で依存関係のインストールが完了します。Python プロジェクトを例に取ると、開発者はプロジェクトディレクトリで以下の操作を完了するだけです。
1. ソースコードを開発する。
2. s build --use-docker コマンドを実行した後、requirements.txt ファイルに基づいて対応する依存関係をローカルに自動的にダウンロードし、ソースコードと一緒にデリバブルを構成する。
3. s deploy コマンドを実行してデリバブル全体をパッケージングし、関数を作成し、依存パッケージの環境変数を設定して、関数が入力時にコード依存パッケージに直接アクセスできるようにする。
3) 現在、一部のクラウドベンダーの FaaS プラットフォームコンソールは WebIDE に対応しています。Alibaba Cloud の WebIDE はコマンドラインプログラムを実行する機能を持つため、コンソールの WebIDE で直接依存関係をインストールすることもできます。
1. サーバーレスアプリケーションの開発とデプロイ方法
1. コンソールを通じた関数の作成
次に、サーバーレスアーキテクチャに基づく FaaS プラットフォーム上で Hello world を出力する実装を行います。基本的な手順は以下のとおりです。
1) アカウントを登録してログインする。
2) 対応する FaaS プロダクトを見つける:Alibaba Cloud の Function Compute。
3)「関数の作成」ボタンをクリックして関数を作成する。
4) 関数を設定する。関数名、ランタイム(使用するプログラミング言語やプログラミング環境など)を含みます。
5) 作成を完了してテストする。
Alibaba Cloud Function Compute を例に取ると、Alibaba Cloud アカウントの登録とログイン後、Function Compute プロダクトを見つけてプロダクトホームページにアクセスする必要があります。
Alibaba Cloud Function Compute プロダクトホームページ
左側の「サービスと関数」を選択し、サービスを作成します。
Alibaba Cloud Function Compute 関数作成ページ
他のクラウドプラットフォームと比較して、Alibaba Cloud Function Compute プラットフォームでは、作成する関数の関数名の設定やランタイムの選択だけでなく、関数が属するサービスも設定する必要があります。Alibaba Cloud 関数コンピューティングシステムにおいて、サービスの概念を導入することには以下のようなメリットがあります。
・関連する関数をサービスの下に分類でき、ラベルによる分類よりも直感的です。
・関連する関数が同じサービスの下で VPC 設定、NAS 設定、ログストア設定などの一部の設定を共有できます。
・サービスを通じて、関数の環境を適切に分割できます。たとえば、あるアルバムプロジェクトに本番環境、テスト環境、開発環境がある場合、サービスレベルで album-release、album-test、album-dev の 3 つのサービスを作成し、環境を分離可能です。
・サービスを活用することで、関数を適切に整理可能です。プロジェクトが比較的大きい場合、多数の関数が生成される可能性があり、同じ階層に置くと非常に混乱しやすくなります。このような場合、サービスを活用して効果的に整理可能です。
関数の作成後、コードを編集できます。Alibaba Cloud Function Compute は、オブジェクトストレージからのコードアップロード、コードパッケージの直接アップロード、およびオンライン編集に対応しています。さらに、Alibaba Cloud Function Compute はフォルダーの直接アップロードにも対応しています。図を参照してください。
コードを保存した後、「実行」ボタンをクリックして関数をトリガーし、テスト可能です。
システムが関連するログを出力していることが確認できます:Hello world。これで、非常にシンプルな関数の作成に成功しました。
2. ツールを通じた関数の作成とデプロイ
サーバーレス開発者ツールを利用することで、サーバーレスアプリケーションの開発、デプロイ、運用保守を非常に簡単に始められます。Serverless Devs を例に、Alibaba Cloud Function Compute アプリケーションのデプロイを紹介し、ツール側での関数の作成、デプロイ、その他の関連機能を探ります。
Serverless Devs は、開発者に強力なツールチェーンを提供することに特化したオープンソースのサーバーレス開発者プラットフォームです。このプラットフォームを通じて、開発者はマルチクラウドのサーバーレスプロダクトをワンクリックで体験し、サーバーレスプロジェクトを迅速にデプロイ可能です。現在の公式説明によると、Serverless Devs は AWS Lambda、Alibaba Cloud Function Compute、Baidu Smart Cloud Function Computing、Tencent Cloud Cloud Function、Cloud Function Workflow など、複数のクラウドベンダーに対応しています。
サーバーレス関連プロダクト。
Serverless Devs 開発者ツールを使用し、Alibaba Cloud Function Compute を例に、サーバーレスアプリケーションの作成とデプロイ方法を実践的に探りましょう。
1) Serverless Devs 開発者ツールをインストールします(npm install -g @Serverless-devs/s コマンドを実行)。
2) Aliyun の認証情報を設定します(s config add --AccessKeyID AccessKeyID --AccessKeySecret AccessKeySecret --AccountID AccountID コマンドを実行)。
3) テンプレートプロジェクトを作成します(s init node.js12-http -d fc-hello-world-demo コマンドを実行)。初期化プロセスは図を参照してください。
Serverless Devs を使用したプロジェクト作成
4) プロジェクトディレクトリに移動し(cd fc-hello-world-demo コマンドを実行)、デプロイします(s deploy コマンドを実行)。デプロイ後の結果は図を参照してください。
Serverless Devs を使用したプロジェクトのデプロイ
プロジェクトのデプロイが成功したら、以下のような追加の操作が実行可能です。関数のトリガー(s invoke コマンドを実行)
Serverless Devs を使用した関数のトリガー
オンライン関数の詳細を表示する(s info コマンドを実行)
Serverless Devs を使用した関数の詳細表示
Serverless Devs には、比較的充実したデスクトップクライアントもあります。開発者はデスクトップクライアントを通じてアプリケーションの作成と管理、および関連する付随機能を利用できます。たとえば、アプリケーション一覧の表示やアプリケーションの素早い作成が可能です。図を参照してください。
Serverless Devs デスクトップクライアントを通じたアプリケーション一覧の表示
アプリケーションの作成後、アプリケーションを管理可能です。下図は Serverless Devs デスクトップクライアントのアプリケーション管理画面です。
Serverless Devs デスクトップクライアントを通じたアプリケーションの管理
その他の付随機能の利用方法は以下のとおりです。図はワンクリック負荷テスト関数のパフォーマンスを示しています。
Serverless Devs デスクトップクライアントを通じたワンクリック負荷テスト関数のパフォーマンス
ワンクリックでの関数リソースのデバッグ。図を参照してください。
Serverless Devs デスクトップクライアントを通じた関数リソースのワンクリックデバッグ
関数の多次元指標情報をワンクリックで表示する。図を参照してください。
Serverless Devs デスクトップクライアントを通じた関数の多次元指標情報のワンクリック表示
さらに、Serverless Devs には便利な YAML 可視設定機能もあります。下図を参照してください。
Serverless Devs デスクトップクライアントを通じた YAML 可視設定
2. サーバーレスアプリケーションのデバッグ方法
アプリケーション開発中または開発完了後、実行結果が期待に沿わない場合、通常何らかのデバッグが必要になります。ただし、サーバーレスアーキテクチャでは、デバッグはしばしば大きな課題に直面します。特に環境要因による制約がある場合です。通常、以下のような状況が発生します:ローカルで開発したアプリケーションは正常に期待どおり動作するが、FaaS プラットフォーム上では予期しない問題が発生する、あるいは一部の特殊な環境ではオンライン環境をローカルでシミュレートできず、アプリケーションのデバッグが困難になります。サーバーレスアプリケーションのデバッグは常に批判の的となってきましたが、各クラウドベンダーはデバッグの方向での深い探求を諦めていません。以下にいくつかの方法を紹介します。
1. オンラインデバッグ
(1) シンプルデバッグ
シンプルデバッグとは、コンソール上でデバッグを行うことです。Alibaba Cloud Function Compute を例に取ると、コンソールの「コード実行」ボタンを通じて基本的なデバッグを実行可能です。下図を参照してください。
必要に応じて、Event を設定することで一部のイベントをシミュレートすることも可能です。
オンラインデバッグの利点は、一部のオンライン環境をコードテストに利用できることです。オンライン環境に VPC などのリソースがある場合、ローカル環境でのデバッグは困難です。
(2) ブレークポイントデバッグ
シンプルなオンラインデバッグに加えて、一部のクラウドベンダーはブレークポイントデバッグにも対応しています。たとえば、Alibaba Cloud Function Compute のリモートデバッグがあります。Alibaba Cloud Function Compute のリモートデバッグを例に、コンソールを通じた関数のオンラインデバッグの方法を紹介します。関数の作成後、リモートデバッグを選択し、「デバッグを有効にする」ボタンをクリックします。図を参照してください。
Function Compute リモートデバッグページ
デバッグを有効にした後、しばらく待つと、システムがリモートデバッグインターフェイスに入ります。図を参照してください。
Function Compute リモートデバッグ開始ページが表示されたら
下図に示すインターフェイスが表示されたら、ブレークポイントデバッグを実行可能です。
Function Compute リモートデバッグ ブレークポイントデバッグページ
2. デバイス・クラウド連携デバッグ
ローカルでサーバーレスアプリケーションを開発する際、オブジェクトストレージのトリガーを通じた関数実行のトリガーや VPC を通じたデータベースへのアクセスなど、一部のオンラインリソースが関与することがよくあります。このとき、オンラインとオフラインの環境の不一致により、オフラインの開発とデバッグは非常に大きな課題に直面します。Serverless Devs 開発者ツールは、プロキシ補助関数を構築することでオンラインとオフラインのリソースを接続し、開発者がローカルでアプリケーションを開発・デバッグできるよう迅速に支援します。このデバッグ方法はデバイス・クラウド連携デバッグと呼ばれます。
下図に示すように、Serverless Devs 開発者ツールは YAML 設定ファイルに基づいて補助サービスと補助関数を作成し、補助サービスと補助関数を通じてオンラインとオフラインのリソースを接続し、エンドツーエンドのデバイス・クラウド連携デバッグを実現します。
Serverless Devs デバイス・クラウド連携デバッグの原理概略図
Serverless Devs 開発者ツールは YAML 設定ファイルの内容に基づいて補助サービスと補助関数を作成します(補助サービスは YAML で宣言されたビジネスサービスの設定と一致します)。
補助関数(Function Compute C)はトリガー(SDK、API、s proxied invoke コマンド、またはその他のトリガーを含む)を通じてトリガーされ、リクエストフローはローカルのデバッグインスタンス(ローカル環境 A)に返されます。このとき、ローカルデバッグインスタンス(ローカル関数実行環境コンテナ)が受信するイベントとコンテキストは、実際にはオンラインからのものです。
ローカルデバッグインスタンス(ローカル環境 A)は以下に直接アクセスできます。
・VPC 内網リソース(RDS、Kafka 内網アドレスなど)
・一部のクラウドサービスの内網アドレス
・ディスクマウントサービス(NAS への直接アクセス)
デバイス・クラウド連携デバッグの手順は以下のとおりです。
1) s proxied setup コマンドを実行して、デバイス・クラウド連携デバッグに必要な補助リソースとローカル環境を準備します。
2) トリガーのない一般的なイベント関数または HTTP トリガーの場合、準備完了後、別の新しいターミナルを起動し、プロジェクトパスに切り替えて、s proxied invoke コマンドを実行してローカル関数を呼び出します。
3) デバッグタスクが完了したら、s proxied cleanup コマンドを実行して、デバイス・クラウド連携デバッグに必要な補助リソースとローカル環境をクリーンアップします。
コマンドによるデバイス・クラウド連携デバッグ機能の利用に加えて、VSCode 開発者ツールでもデバイス・クラウド連携デバッグ機能を利用可能です。図を参照してください。
VSCode でのデバイス・クラウド連携デバッグ機能の使用
3. リモートデバッグ
デバイス・クラウド連携デバッグには、ローカルにチャネルサービスコンテナのほかに、ローカル関数を実行する関数コンピューティングコンテナもあります。リモート補助関数はシンプルにリモートトラフィックをローカルに送信します。実際のデバッグプロセスでは、インスタンスにログインしてプロジェクトをデバッグする必要があります。この場合、リモートデバッグの使用を選択可能です。
デバイス・クラウド連携デバッグと比較して、リモートデバッグはローカルにチャネルサービスコンテナのみを持ち、実行プロセスは完全にオンラインに依存します。リモート関数は実行結果を返します。リモートデバッグの全体的なアーキテクチャ概略図は図を参照してください。
上記のリモートデバッグアーキテクチャ図に示すチャネルサービスを通じてオンライン環境にログインしてコードデバッグや問題の特定を行うだけでなく、一部のクラウドベンダーはインスタンスに直接ログインしてコードデバッグを行う機能も提供しています。Serverless Devs を例に取ると、Alibaba Cloud Function Compute を使用する場合、instance コマンドを通じてオンラインインスタンスに直接ログイン可能です。
instance ログインコマンドは便利なログイン体験を提供し、複雑なシナリオでのアプリケーション例外の特定などの問題を解決するのに役立ちますが、インスタンスにログインした後、ユーザーは関数のログやモニタリング指標を通じて直接問題を特定することはできず、coredump、tcpdump、jmap などのツールを使用して詳細なトラブルシューティングを行う必要があります。
たとえば、あるユーザーが最近オンラインプログラムで関数のエラープロンプトが表示され、エラー内容はリモートサービスへの接続がタイムアウトしたというものでした。ユーザーは関数インスタンスとリモートサービス間のネットワーク接続が不安定であると疑い、インスタンスに入ってインスタンスとリモートサービス間のネットワーク状況を分析したいと考えます。この場合、以下の手順に従って問題をトラブルシューティング可能です。
1) 図に示すように、インスタンスにログインした後、apt-get update コマンドと apt-get install tcpdump コマンドを実行して tcpdump ツールをインストールする必要があります。
2) インストール完了後、tcpdump コマンドを実行してリモートサービス IP のリクエストをキャプチャし、キャプチャ結果を tcpdump.cap ファイルに保存します。
3) パケットキャプチャ後、OSS コマンドラインツール ossutil64 を使用して tcpdump.cap ファイルを自身の OSS にアップロードし、ローカルにダウンロードして解析ツール Wireshark で分析します。
4. ローカルデバッグ
(1) コマンドラインツール
ほとんどの FaaS プラットフォームは、ユーザーに比較的充実したコマンドラインツールを提供しています。たとえば、Alibaba Cloud の Funcraft や、Serverless Framework、Serverless Devs などのマルチクラウドベンダーに対応したオープンソースプロジェクトもあります。コマンドラインツールを通じたコードデバッグの方法は非常にシンプルです。Serverless Devs を例に取ると、Alibaba Cloud Function Compute のローカルデバッグ方法は以下のとおりです。まず、ローカルに Function Compute プロジェクトがあることを確認し、プロジェクトの下でデバッグコマンドを実行します。たとえば、Docker でのデバッグは以下のとおりです。
コマンドラインを通じたローカルデバッグ
(2) エディタープラグイン
VSCode プラグインを例に取ると、Alibaba Cloud Function Compute の VSCode プラグインをダウンロードしてアカウント情報を設定した後、ローカルで新しい関数を作成し、クリック後にブレークポイントデバッグを実行します。図を参照してください。
3. 開発者ツールを通じた依存関係のインストールとプロジェクトビルド
サーバーレスアーキテクチャでのアプリケーション開発と従来のアーキテクチャでのアプリケーション開発の大きな違いの一つは、両者の内容の次元が異なることです。たとえば、理想的な状態では、前者はサーバーなどの基盤リソースに注意を払う必要がありません。
しかし、現在のサーバーレス開発段階において、サーバーレスアーキテクチャでのアプリケーション開発は本当にサーバーに追加の注意を払う必要がないのでしょうか。実際にはそうではありません。サーバーレスアーキテクチャは Noserver の理念を強調していますが、実際の開発では、プラットフォーム間で使用できない多くの依存関係があります。たとえば、Python 言語の一部の依存関係はバイナリコンパイルが必要で、オペレーティングシステムやソフトウェア環境などと比較的大きな関連があるため、このような依存関係をプロジェクトに導入する場合、関数コンピューティングプラットフォームのオンライン環境と一致する環境で依存関係のインストール、コードのパッケージング、またはプロジェクトのデプロイを行う必要があります。
Alibaba Cloud Function Compute は、自身のオンライン関数環境について詳細な説明を提供し、対応するドキュメントを用意しています。たとえば、C、C++、Go でコンパイルされた実行ファイルは、Function Compute の動作環境と互換である必要があります。
Function Compute の Python 動作環境は以下のとおりです。
・Linux カーネルバージョン:Linux 4.4.24-2.al7.x86_64
・Docker ベースイメージ:docker pull python:2.7; docker pull python:3.6
しかし、実際のアプリケーション開発プロセスでは、依存関係のパッケージングは依然として多くの開発者にとって頭の痛い問題です。多くのサーバーレスアプリケーションの開発で同様の課題に直面します:プロジェクトはローカルでは正常に動作するが、オンラインにリリースすると特定の依存関係が見つからない、しかし実際には依存関係は存在する。このとき、問題の特定が非常に困難になります。
現在、サーバーレスアプリケーションの依存関係のインストールやプロジェクトビルドには通常 3 つの方法があります。
1) ローカルでプロジェクトを作成した後、クラウドベンダーが提供する環境データに基づいて自らオンライン環境を構築し、依存関係をインストールします。この方法は比較的自由度が高く制御しやすいですが、非常に難易度が高く操作も煩雑です。
2) 既存の開発者ツールを使用して依存関係をインストールします。図を参照してください。
Serverless Devs 開発者ツールと Alibaba Cloud Function Compute プロダクトを例に取ると、開発者は言語の慣習に従って対応する言語の依存関係インストールファイルを準備するだけです。たとえば、Python 言語の requirements.txt、Node.js 言語の package.json などです。その後、現在のプロジェクトの下で s build --use-docker コマンドを実行すると、Alibaba Cloud Function Compute プラットフォームのオンライン環境と一致する環境で依存関係のインストールが完了します。Python プロジェクトを例に取ると、開発者はプロジェクトディレクトリで以下の操作を完了するだけです。
1. ソースコードを開発する。
2. s build --use-docker コマンドを実行した後、requirements.txt ファイルに基づいて対応する依存関係をローカルに自動的にダウンロードし、ソースコードと一緒にデリバブルを構成する。
3. s deploy コマンドを実行してデリバブル全体をパッケージングし、関数を作成し、依存パッケージの環境変数を設定して、関数が入力時にコード依存パッケージに直接アクセスできるようにする。
3) 現在、一部のクラウドベンダーの FaaS プラットフォームコンソールは WebIDE に対応しています。Alibaba Cloud の WebIDE はコマンドラインプログラムを実行する機能を持つため、コンソールの WebIDE で直接依存関係をインストールすることもできます。
Related Articles
-
A detailed explanation of Hadoop core architecture HDFS
Knowledge Base Team
-
What Does IOT Mean
Knowledge Base Team
-
6 Optional Technologies for Data Storage
Knowledge Base Team
-
What Is Blockchain Technology
Knowledge Base Team
Explore More Special Offers
-
Short Message Service(SMS) & Mail Service
50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00
