新しい IBM Developer JP サイトへようこそ!サイトのデザインが一新され、旧 developerWorks のコンテンツも統合されました。 詳細はこちら

クイック・ラボ: インフラストラクチャーは不要です。必要なのはコードだけです。サーバーレスがいかにシンプルなのかを確かめてください。

サーバーレス・コンピューティングとは、サーバーの存在が完全に抽象化されて、サーバーを意識する必要がないコンピューティング・モデルのことです。サーバーは存在していても、開発者はその動作について考慮する必要はありません。さらに、スケーラビリティー、高可用性、インフラストラクチャーのセキュリティーなどといった低レベルのインフラストラクチャーの詳細や運用上の詳細について考慮する必要からも解放されます。サーバーレス・コンピューティングは基本的に、メンテナンス作業を削減して、開発者が付加価値を与えるコードの開発にすぐに注力できるようにすることを目的としています。

サーバーレス・コンピューティングは、クラウド・ネイティブ・アプリケーションの開発を単純化します。これは特に、複雑なアプリケーションを簡単に交換できる小さい独立したモジュールに分解する、マイクロサービス指向のソリューションについて言えることです。

サーバーレス・コンピューティングは特定のテクノロジーを意味するものではなく、上述のコンピューティング・モデルの基礎となるコンセプトを表します。Apache OpenWhisk をはじめ、最近ではサーバーレス・モデルで使われている開発手法を容易にする、有望なソリューションが登場しています。

IBM Cloud Functions (ICF) は、Apache OpenWhisk オープンソース・プロジェクトをベースに構築された、IBM Cloud 上の Function-as-a-Service (FaaS) プラットフォームです。ICF を利用すると、イベントに応答してコードを実行することができます。

ICF は、サーバーレスのデプロイおよび運用モデルとなります。どのような規模にも対応できる粒度の細かい料金体系となっているため、必要な分のリソースだけを利用できます。しかも料金が発生するのは、実際にコードを実行した時間に対してのみです。この柔軟なプログラミング・モデルには、JavaScript、Swift、Python、Java などの言語に対するサポートも、Docker コンテナーを使用してカスタム・ロジックを実行するためのサポートも組み込まれています。このプログラミング・モデルを使用すれば、小規模でアジャイルなチームが既存のスキルを再利用することも、目的に適した方法で開発することも可能になります。ICF には、ビルディング・ブロックを開発して、それらを宣言型でチェーニングするためのツールも組み込まれています。したがって、マイクロサービスをチェーニングし、コンポジションによってワークフローを形成できます。ICF はオープンソースであり、場所を問わずに実行できるため、どのような形のベンダーロックインも回避できます。

所要時間

このチュートリアルの所要時間は約 45 分です。

前提条件

このチュートリアルに従うには、IBM Cloud アカウントが必要です。まだお持ちでない場合、アカウントを登録する手順について詳しくは、IBM Cloud への登録に関するドキュメントをご覧ください。

手順

このチュートリアルを完了するために必要なステップは以下のとおりです。

  1. アクションを作成する
  2. パラメーターを使用してアクションを呼び出す
  3. トリガーを作成する
  4. Web アクションを作成する

1. アクションを作成する

ICF を利用するには、主に 2 つの方法があります。どちらの方法でも、アクション、トリガー、ルール、シーケンスを作成、更新、削除することによって、基本的な Cloud Functions エンティティーを操作します。

コマンド・ライン・インターフェースを使用する場合、シェルから基本的なオペレーションを実行します。Cloud Functions ユーザー・インターフェースを使用する場合は、同じオペレーションをブラウザーから実行します。このチュートリアルでは、ブラウザー内でユーザー・インターフェースを使用します。

  1. https://cloud.ibm.com にアクセスして IBM Cloud にログインします。

  2. ヘッダー内のナビゲーション・メニューをクリックします。

    IBM Dashboard のトップ・メニューのスクリーンショット

  3. Functions」をクリックして ICF にアクセスします。これで、IBM Cloud 上でクラウド・ネイティブの開発エクスペリエンスを開始できます。

    IBM Cloud のサービス・ドロップダウンのスクリーンショット

  4. ICF Web コンソールがアクティブになっているはずです。表示されるページの左側にあるメニューを使用して、ICF の最上位レベルのすべての機能にナビゲートできます。このチュートリアルでは、このメニューに示される以下の機能エリアを探ります。

    • Actions (アクション): サポートされているプログラミング言語のいずれかを使用してアクションを作成、編集、管理する際に使用します。

    • Triggers (トリガー): イベントを使用してアクションの実行または起動を自動化するトリガーを作成、編集、管理する際に使用します。

    • Monitor (モニター): アカウント上のアクションとトリガーの呼び出し (実行など) に関する情報を表示する際に使用します。「Monitor (モニター)」にはアクティビティーの要約とタイムラインも表示されます。

  5. 最初のアクションを作成するために、Functions ホーム・ページ上にある「Start Creating (作成を開始)」ボタンをクリックします。

    ICF の「Start Creating (作成を開始)」メニューのスクリーンショット

    Create Action (アクションの作成)」をクリックします。

    ICF アクションの作成を開始するページのスクリーンショット

  6. 新しく作成するアクションの名前 (例: hello) を入力します。ランタイム・ドロップダウンにデフォルトの Node.js ランタイムの最新バージョン (例: Node.js 10) が示されていることを確認してから、「Create (作成)」ボタンをクリックします。

    ICF アクションを作成する画面のスクリーンショット

  7. クラウド・ベースのコード・エディターが開きます。ここで、アクションの関数を作成、変更できます。このエディターには、Node.js で作成された Hello World 関数が事前に取り込まれているはずです。

     javascript
     function main(params) {
            return { message: "Hello World" };
        }
    

    注: 上記のコード・スニペットが表示されない場合、上記のコードをコピーし、コード・エディターに貼り付けて既存のコードを置き換えてから、「Save (保存)」をクリックしてください。これによって、次のステップに進むための「Invoke (呼び出す)」ボタンが表示されるはずです。

  8. Invoke (呼び出す)」ボタンをクリックして、ブラウザーから直接アクションをテストします。

    ICF の「Invoke (呼び出す)」ボタンを示す画面のスクリーンショット

    「Activations (起動)」セクションが表示され、アクションの呼び出しによって生成された起動レコードが示されます。このレコードには、起動 ID、呼び出し結果、関数によって書き込まれたすべてのログ・エントリー (この例の場合、ログ・エントリーは書き込まれませんでした) が記録されます。

    ICF の「Activations (起動)」セクションを示す画面のスクリーンショット

    この呼び出しの結果、JSON オブジェクトに格納された Hello World メッセージが表示されます。

     json
     {
       "message": "Hello World"
     }
    

    呼び出しごとに一意の起動レコードがログに記録されます。このページに表示されない詳細な構成と指標に関する情報は、起動レコードに記録されています。このチュートリアルの後半で、アカウントでのすべての起動履歴を表示して、その詳細にアクセスできる、「Monitor (モニター)」ダッシュボードについて詳しく探ります。

    注: このウィンドウから離れた後、再びウィンドウに戻ると、ここに示されていた「Activations (起動)」セクションはリセットされています。

2. パラメーターを使用してアクションを呼び出す

ユーザー・インターフェースを使用して、名前付きパラメーターを宣言し、JSON オブジェクト形式で関数に渡すことができます。

  1. コード・ウィンドウが編集モードになっていることを確認します。hello アクション関数を以下のコードで更新してから、「Save (保存)」をクリックします。

     javascript
     function main(params) {
        return { message: "Hello, " + params.name + " from " + params.place };
     }
    
  2. 更新後のアクションには、入力パラメーター name および place の値を渡す必要があります。パラメーターを追加するには、「Invoke with parameters (パラメーターを使用して呼び出す)」をクリックします。

    ICF の「Invoke with parameters (パラメーターを使用して呼び出す)」ボタンを示す画面のスクリーンショット

    Change Action Input (アクションへの入力の変更)」ダイアログが表示されます。

  3. Change Action Input (アクションへの入力の変更)」ダイアログの入力領域に以下の JSON データを追加してから、「Apply (適用)」をクリックします。

     json
     {
       "name": "Elrond",
       "place": "Rivendell"
     }
    

    ICF アクションへの入力を示す画面のスクリーンショット

  4. 新しい入力データを使用してアクションを再実行するために、「Invoke (呼び出す)」をクリックします。以下の結果を受け取るはずです。

     json
     {
       "message": "Hello, Elrond from Rivendell"
     }
    

3. トリガーを作成する

FaaS プラットフォームとしての ICF は、イベントに応答してコードを実行します。イベントを生成するには、以下の手段があります。

  • API 呼び出し。標準的な Web またはモバイル・アプリケーションによって起動される API 呼び出しを、アクションをトリガーするように構成できます。これが、これまでユーザー・インターフェース内で行ってきたことです。つまり、「Invoke (呼び出す)」ボタンによってアクションを直接呼び出しました。

  • サービス。IBM Cloud プラットフォームに組み込まれているサービス、またはトリガーを使用する外部サービス・プロバイダーのサービスを利用して、イベントを生成できます。

以降のステップでは、ICF に組み込まれたアラーム・サービスを利用して定期的に関数を実行するトリガーを作成します。

  1. 既存の hello アクションを以下のサンプル・コードで更新してから、「Save (保存)」をクリックします。

     javascript
     var counter = 0; // global variable
     function main(msg) {
         var date = new Date();
         var time = date.getHours() + ":" + date.getMinutes() + ":" +
         date.getSeconds();
         counter++;
         return { message: "It is " + time + ". This action has been called " + counter + " time(s)." };
     }
    

    更新後のアクションは、呼び出された時刻と頻度を返します。カウンターをグローバル変数として使用し、カウントを維持します。グローバル変数であるため、同じアクションが何度呼び出されても存続します。

  2. 左側のメニューにある「Connected Triggers (接続済みトリガー)」をクリックし、「Add Trigger (トリガーの追加)」をクリックします。

    ICF の「Connected Triggers (接続済みトリガー)」メニュー項目のスクリーンショット

    トリガー・タイプとして「Periodic (定期的)」を選択します。

    ICF の定期的トリガーを選択する画面のスクリーンショット

  3. トリガーの名前として「minute alarm」と入力します。次に、「Timer Settings (時間設定)」セクションの「UTC Minutes (UTC 分)」パターンまでスクロールダウンして、ドロップダウンから「Every Minute (毎分)」を選択します。「Create & Connect (作成して接続)」ボタンをクリックします。これで、トリガーが作成されて hello アクションに接続されます。

    ICF の定期的トリガーを構成する画面のスクリーンショット

  4. 左上に示されているパンくずリストを使用して「Actions (アクション)」セクションにナビゲートします。左側のメニューから「Monitor (モニター)」を選択して、アクションとトリガーの最近のアクティビティーを表示します。

    パンくずリストを示す画面のスクリーンショット

    「Activity Log (アクティビティー・ログ)」セクションには、定期的な alarm フィードによって毎分 minute alarm トリガーが起動され、それによってトリガーに接続された hello アクションが起動されたことが示されます。

    ICF mの「Monitor (モニター)」ページのスクリーンショット

  5. 必ずトリガーを削除してください。そうしないと、このトリガーが引き続き毎分起動し、その計算使用量に対してアカウントに料金が請求されます。

    minute alarm」の横にあるごみ箱 (以下を参照) をクリックして、このトリガーを削除します。

    トリガーを削除するアイコンを示す画面のスクリーンショット

    表示される確認ダイアログで「Delete (削除)」を選択します。

    注: 別の方法として、トリガーの名前をクリックし、「Connection (接続)」列に示されている「Enabled (有効)」設定のチェック・マークを外して、トリガーを無効にすることもできます。その後、パンくずリストを使用して「Triggers (トリガー)」ページに戻ります。

4. Web アクションを作成する

次は、hello アクションに Web からアクセスできるようにして、ICF によってアクションの HTTP エンドポイントを自動的に作成します。

  1. 左側のメニューから「Actions (アクション)」を選択します。次に、「hello」アクションを選択します。

    ICF の hello アクションを示す画面のスクリーンショット

  2. 既存の hello アクションを以下のコードで更新します。

    function main(params) {
        let html = '<html style="color:red"><body><p>' +
        'Hello, ' + params.name + ` from ` + params.place +
        '</p></body></html>'
        return { headers: { "Content-Type": "text/html" },
                 body: html };
    }
    

    Save (保存)」ボタンをクリックします。

    ICF Web アクションを作成する画面のスクリーンショット

    更新後の関数は、HTML 形式の Hello World メッセージを返します。このメッセージは HTTP レスポンスの body で返されたものです。HTTP レスポンス・ヘッダー内の Content-Typetext/html に設定していることに注目してください。

  3. アクションを Web アクションにするには、左側のメニューにある「Endpoints (エンドポイント)」をクリックします。「Enable as Web Action (Web アクションとして有効にする)」チェックボックスにチェック・マークを付けてから、「Save (保存)」をクリックします。

    ICF で Web アクションとして有効化するボタンのスクリーンショット

  4. アクションが保存されたら、Web ブラウザー内で、生成された URL をクリックして開くことができます。

    ICF Web アクションの URL を示す画面のスクリーンショット

    以下のメッセージが表示されるはずです。

    ICF Web アクションの出力を示す画面のスクリーンショット

    けれども nameplace の値は undefined と示されています。これを修正しましょう。

  5. ブラウザー内で以下のクエリー・パラメーターを URL の末尾に追加し、リクエストを再送信します。

     ?name=Frodo&place=Shire
    

    ご覧のように、nameplace のクエリー・パラメーターが入力パラメーターとしてアクションに渡されました。

    ICF Web アクションの出力パラメーターを示す画面のスクリーンショット

まとめ

お疲れさまでした!ブラウザー内から一貫して Cloud Functions を利用し、いくつかのサーバーレス関数を作成してデプロイできました。また、ブラウザーからでもマイクロサービスからでも呼び出せる Web アクションも作成しました。

このチュートリアルで学んだ手順を独自のコードに適用し、Node.js で作成されたクラウド・ネイティブのサーバーレス・アプリを実行して試してください。