IBM Developer Blog

IBM Developer サイトで最新の出来事をフォローし、情報を入手しましょう。

関数チェーンの仕組み、アプリの移行方法、オブジェクトの保管方法など、サーバーレスに関してよくある質問の答えが見つかります。


Knative や OpenWhisk などのプロジェクトの話題が盛り上がっている中、サーバーレスに関する多くの質問が寄せられています。そこで、とりわけよく尋ねられる質問とその答えをこの記事に集めて共有したいと思います。

1. OpenWhisk と Knative の間にはどのような関係があるのでしょうか?

お気付きのように、Kubernetes 分野とサーバーレス分野では Knative という新しいサーバーレス・プラットフォームに注目が集まっています。Knative は Kubernetes をベースに構築された、最新型のサーバーレス・ワークロードをデプロイして管理するためのプラットフォームです。これは比較的新しいオープンソース・プロジェクトであり、この分野での経験が豊富な IBM、Red Hat、Google、Pivotal などの複数の企業が貢献しています。Apache OpenWhisk というオープンソースのサーバーレス・プラットフォームについてもご存知のことでしょう。IBM はこの両方のプロジェクトに深く関わっていることから、この 2 つの間の関係について尋ねられることがよくあります。

OpenWhisk は、イベントに応答して関数を実行できる、オープンソースのサーバーレス・プラットフォームです。OpenWhisk を使用するのに、独自のプラットフォームをセットアップして管理する手間を省くには、IBM Cloud Functions を利用できます。このマネージド・サービスには、以下をはじめとするさまざまな機能が用意されています。

  • Node.js、Scala、PHP、Go、Swift を含む多数の言語に対するサポートを追加設定なしで使用できます。
  • Kafka、Cloud Object Storage、IBM Cloudant、Slack などの各種サービスを簡単に統合できます。
  • アイドル状態のリソースに対して料金を支払わなくても済むよう、アクションが最適利用されます。
  • 仮想マシンやインフラストラクチャー・リソースを管理する必要がないため、市場投入までの時間を短縮できます。コードを作成して IBM Cloud Functions に渡すだけで、アプリケーションを実行できます。

Kubernetes クラスターのユーザーにサーバーレス・エクスペリエンスを提供するために、Knative は Kubernetes クラスター上にインストールされて Kubernetes の機能を拡張します。IBM Cloud Functions のようなプラットフォーム・ソリューションと比べ、Knative を使用する場合は構成、メンテナンス、セットアップの作業が多くなりますが、それと同時により細かい制御が可能になります。すでにアプリケーション用の Kubernetes クラスターを管理している場合、そのスタックに Knative を追加するのは簡単です。例えば IBM Cloud 上では、管理された Knative アドオンを使用して簡単にクラスターに Knative をインストールして稼働させることができます。

OpenWhisk と Knative は、どちらもサーバーレスのメリット (スケーラビリティー、リソースの効率利用、市場投入までの時間短縮) をもたらすオープンソース・プロジェクトです。それほど細かく制御する必要がない場合、あるいはすぐに使用可能なサーバーレス製品を導入したいだけであれば、IBM Cloud Functions のようなソリューションが最適な選択肢となります。一方、すでに Kubernetes を使用しているか、スタックを細かく制御する必要がある場合は、Knative をインストールするのが適切な選択肢です。

2. IBM Cloud Functions ではどのような仕組みで、ある関数が別の関数を呼び出すのですか?

手短な答えとして、複数の関数をつなげる (チェーニングする) にはシーケンスを使用します。シーケンスとは、複数のアクションをチェーニングして順番に呼び出されるようにする特殊なタイプのアクションのことです。シーケンスに含まれる各アクションの結果は、引数として次のアクションに渡されます。action_1 と action_2 をチェーニングするシーケンスを作成するには、以下のようなコマンド・ライン・インターフェース (CLI) を使用できます。

ibmcloud fn action create <sequence_name> --sequence <action_1>, <action_2>

このシーケンスが起動されると、まず、action_1 が起動されます。次に、action_1 の出力が入力として action_2 に渡されます。

これよりも複雑なシナリオとして、例えば action_1action_2 を複数回 (配列に含まれる項目ごとに 1 回) 呼び出す必要がある場合や、action_1 が別の 3 つのアクションを並行して呼び出す必要がある場合はどうなるでしょう。ある関数を別の関数から直接呼び出すには、JavaScript ランタイムに組み込まれた OpenWhisk SDK を使用できます。require でこの SDK を指定した後、目的のアクションの名前とそのパラメーターを指定した invoke 関数を実行するだけで、そのアクションを呼び出すことができます。この仕組みを説明する例は、この画像処理に関するコード・パターンで確認できます。

var openwhisk = require('openwhisk');
const ow = openwhisk()
await Promise.all([
    ow.actions.invoke({
      actionName: "/<namespace>/<package_name>/<action_name_1>",
      params: { bucket: params.bucket, url: params.body, key: params.key }
    }),
    ow.actions.invoke({
      actionName: "/<namespace>/<package_name>/<action_name_2>",
      params: { bucket: params.bucket, url: params.body, key: params.key }
    })]);

上記の 2 つのアクションのそれぞれが並行して実行されます。OpenWhisk SDK では他の方法でも、アクションを操作したり、コードからアクションをトリガーしたりできるようになっています。SDK の詳細については、npm モジュールのページと使用方法のをご覧ください。

アクションをチェーニングするには、IBM Cloud Functions 内で作成された関数ごとに生成される HTTP エンドポイントにアクセスするという方法もあります。

curl -u API-KEY -X POST https://us-east.functions.cloud.ibm.com/api/v1/namespaces/beemarie/actions/my_action?blocking=true

デフォルトでは、関数をトリガーするには POST リクエストを使用します。一方、関数を Web アクションとして使用可能にすることもできます。その場合、HTTP メソッドであればどのメソッド (POST、GET、PUT、PATCH、DELETE、HEAD、または OPTIONS) でも関数を呼び出せるようになります。Web アクションは、任意の Web ベースのアプリから呼び出すこともできます。Web アクションが関連付けられるのは、そのアクションを作成したユーザーであり、アクションの呼び出し元ではないからです。関数を Web アクションに変換した後、セキュリティー、OAuth プロトコル・サポート、レート制限、カスタム・ドメイン・サポートを備えたフル機能の API にアセンブルし、API ゲートウェイを使用して公開することもします。

3. アプリケーションをサーバーレス・ワークロードに移行するにはどうすればよいですか?

この質問はひっきりなしに尋ねられています!サーバーレス・アーキテクチャーは組織に大きなメリットをもたらす可能性があります。移行にあたって胸がワクワクするのは、もっともなことです。IBM では以下の方法を推奨しています。

  • まず、サーバーレスに最適な使用ケースについて理解するところから始めます。サーバーレス・アーキテクチャーに適している使用ケースは多数くあります。バックエンド API、モバイル・バックエンド、データ処理、スケジュールに従って実行されるタスク、イベント駆動型アプリケーションは、その数例にすぎません。これらの使用ケースはいずれも、サーバーレス・アーキテクチャーを導入するのに最適です。
  • あまりにも大がかりな導入を計画しないようにしてください。最初はサーバーレス・プラットフォーム上で実行する意味があり、実現しようとしているメリットと目標に合致する 1 つのマイクロサービスから取り掛かることをお勧めします。例えば、実行しようと考えているアクションの使用パターンに基づいて、自動スケーリングやコスト削減の方法を模索します。
  • アプリケーションまたはマイクロサービスがコンテナー化しやすいものだとしたら、IBM Cloud Functions または Knative 上で手軽にコンテナー化を試すことができます。IBM Cloud Functions に用意されている Docker ランタイムを使用すれば、指定した Docker イメージを簡単に実行できます。Knative のデプロイメント単位はコンテナー・イメージなので、ここでもコンテナー化したアプリケーションを簡単にテストできます。
  • (オープンソース) コミュニティーに参加してください。OpenWhiskKnative には、毎日これらのプロジェクトの構築と具現化に取り組むメンバーからなる素晴らしいコミュニティーがあります。万人のためにプロジェクトを改善するために問題を提起して対話するユーザーとして、皆さんは絶好の立場にいます。Slack 上の OpenWhisk コミュニティー・チャンネルには openwhisk.apache.org/slack.html で、Knative チャンネルには knative.slack.com で参加できます。

4. ファイルの保管場所とデータベースのインストール先はどこですか?

サーバーレス・プラットフォーム上でコードを実行する場合、通常はそのコードが抽出されてコンテナー環境内で実行されます。技術的には、コンテナー環境にはファイル・システムがあり、そのファイル・システムを操作できます。けれども、コンテナー環境内のファイル・システムは永続的なスペースではなく、コンテナーが存続する間しか存在しません。サーバーレス・アクションが不要になったら、そのアクションを実行するコンテナーは削除されます。

サーバーレス・アプリを作成する際の一般的なパターンの 1 つは、オブジェクト・ストレージまたはクラウド・プロバイダーのマネージド・サービスとしてのデータベースを使用するというものです。オブジェクト・ストレージを使用する場合は、オンデマンドでファイルをアップロードします。この場合、基礎となるストレージ・インフラストラクチャーについて考慮する必要はありません。この手法はサーバーレス・モデルにうまく適合します。クラウド・プロバイダーのサービスを使用する場合は、インフラストラクチャー、データベースのメンテナンス、ストレージの管理を完全にプロバイダーに任せることができます。

利用可能なオブジェクト・ストレージまたはデータベース・サービスの中には、イベントをサポートするものもあります。こうしたサービスを利用すれば、サーバーレス・アプリケーション内でイベント駆動型アーキテクチャーを使用できます。例えば、IBM Cloud Functions はクラウド・オブジェクト・ストレージのバケットに追加される新しいアイテムを listen して、アイテムが追加された時点でトリガーを起動できます。

通常、サーバーレス手法とは、可能な場合は常にマネージド・サービスを利用することを意味します。マネージド・サービスを利用すれば、ユーザーのために卓越したビジネス・ロジックを作成するといった、チームのコア・コンピテンシーにフォーカスを置くことができます。

5. サーバーレス関数をデバッグするには、どうすればよいですか?

本番環境内のサーバーレス・アプリケーションをデバッグするのは簡単なことではありません。それは、コードを実行するランタイム環境とインフラストラクチャーにアクセスできないためです。そうは言っても、最近ではデバッグに使用できる有用なツールが登場してきています。サーバーレス分野の成熟に伴って、このようなツールがさらに増えていくはずです。

  • ログ

    stdoutstderr に書き込まれたログはプラットフォームに送信されます。プラットフォームには通常、これらのログを自動的に収集するロギング・サービスが統合されています。例えば、IBM Cloud Functions でサポートしている IBM Log Analysis with LogDNA サービスは、プラットフォームに送信されたログを収集し、ユーザーが問題をデバッグする際に使用できるようにします。

  • 指標

    呼び出しステータスや呼び出しで発生したエラー、アクションの開始時刻と終了時刻、アクションのコールド・スタート回数などの情報を把握したい場合もあるでしょう。このような全体的な指標は、自動的にサーバーレス・プラットフォームに組み込まれるのが通常です。ほとんどのクラウド・プロバイダーはこの指標データをモニタリング・サービスに送信するため、該当するサービスを利用して、アクションをモニタリングするためのダッシュボードをセットアップできます。IBM Cloud Functions では指標を IBM Cloud Monitoring に送信し、Grafana を使用して表示できるようになっています。Grafana を使用すると、ダッシュボードの構成や、指標のイベント値に基づくアラートの作成など、さまざまな目的を果たすことができます。

開発プロセス中にデバッグが必要になることもあります。最近、Apache OpenWhisk コミュニティーに wskdebug というツールが導入されました。このツールは、アクションの完全なデバッグ、コードの自動再ロード、コード変更時の自動アクション呼び出しなどをサポートします。現在のところ、このツールが追加設定なしでサポートしているのは Node.js アクションですが、これ以外の言語のアクションでも、コマンド・ラインを使用して構成できます。

まとめ

この記事が、サーバーレスの探索を開始するきっかけ、あるいはサーバーレスへの移行を続ける意欲になったことを願います。無料の IBM Cloud Lite アカウントを登録して、IBM Cloud Functions を試してください。Knative をさらに詳しく調べるには、IBM Cloud 上で Kubernetes クラスターを作成してから、そのクラスターに対して Knative アドオンを有効にすると、Knative を使用できるようになります。