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

Appsody スタックのカスタマイズ: 概要

Appsody は、クラウド・ネイティブのアプリケーション開発を単純化するオープンソース・プロジェクトです。Appsody の主要なコンポーネントとなっているスタックは、事前構成された Docker イメージをビルドします。スタックによってビルドされたイメージは、クラウド環境にそのままデプロイすることができます。スタックによってビルドする Docker イメージには、カスタマイズしたコンテンツをいくつでも組み込むことができます。イメージの固定部分 (スタック・イメージ) とユーザーが変更または拡張できる部分 (テンプレート) はスタック・ビルダーに決定させることができます。

この記事では、Appsody のリポジトリー、スタック、テンプレートの概要を説明し、新しいスタックを作成すべき場合、既存のスタックを変更すべき場合、あるいはテンプレートをそのまま、もしくは変更を加えて使用すればよい場合を判断できるようお手伝いします。

リポジトリー、スタック、テンプレート

Appsody 内のオブジェクトの階層は、最上位のリポジトリー、その下にあり、キュレートされた多数のテクノロジーのイメージを格納したスタック 、最下位のテンプレートからなります。Appsody のスタックを使用する際は、Appsody のリポジトリーがハブとして機能します。

フロー図

appsody CLI を使用して、リポジトリーの追加と削除、スタックに基づく新しいプロジェクトの初期化を行うことができます。例えば、 ローカル・デプロイメントに使用できるようになったスタックとテンプレートを格納する新しいリモート・スタック・リポジトリーをローカルのインストール済み環境に認識させるには、appsody repo add kabanero https://github.com/kabanero-io/collections/releases/download/v0.1.2/kabanero-index.yaml を使用します。

一例として、以下に appsody list の出力を記載します。この例では、複数のリポジトリーがローカルの (~/.appsody 内に格納された) Appsody 構成に登録されています。

$  appsody list

REPO            ID                              VERSION         TEMPLATES               DESCRIPTION
appsodyhub      java-microprofile               0.2.13          *default                Eclipse MicroProfile on Open Liberty & OpenJ9 using Maven
appsodyhub      java-spring-boot2               0.3.11          *default, kotlin        Spring Boot using OpenJ9 and Maven
appsodyhub      nodejs                          0.2.5           *simple                 Runtime for Node.js applications
appsodyhub      nodejs-express                  0.2.5           *simple, skaffold       Express web framework for Node.js
appsodyhub      nodejs-loopback                 0.1.4           *scaffold               LoopBack 4 API Framework for Node.js
appsodyhub      python-flask                    0.1.3           *simple                 Flask web Framework for Python
appsodyhub      swift                           0.1.4           *simple                 Runtime for Swift applications
custom_stack    my-stack-name                   1.0.0           *default                My custom stack
experimental    java-spring-boot2-liberty       0.1.8           *default                Spring Boot on Open Liberty & OpenJ9 using Maven
experimental    nodejs-functions                0.1.3           *simple                 Serverless runtime for Node.js functions
experimental    quarkus                         0.1.5           *default                Quarkus runtime for running Java applications
experimental    vertx                           0.1.1           *default                Eclipse Vert.x runtime for running Java applications
local_stack     java-microprofile               0.2.6           *default                Eclipse MicroProfile using OpenJ9 and Maven
local_stack     java-spring-boot2               0.3.2           *default                Spring Boot using OpenJ9 and Maven
local_stack     nodejs                          0.2.3           *simple                 Runtime for Node.js applications
local_stack     nodejs-express                  0.2.3           *simple                 Express web framework for Node.js
local_stack     nodejs-loopback                 0.1.0           *                       LoopBack API framework for Node.js
local_stack     swift                           0.1.2           *simple                 Runtime for Swift applications
my_local        java-microprofile               0.2.6           *default, gdpr, restapi Eclipse MicroProfile on Open Liberty & OpenJ9 using Maven
my_stacks       java-microprofile               0.2.6           *default                Eclipse MicroProfile using OpenJ9 and Maven
my_stacks       java-spring-boot2               0.3.2           *default                Spring Boot using OpenJ9 and Maven
my_stacks       nodejs                          0.2.3           *simple                 Runtime for Node.js applications
my_stacks       nodejs-express                  0.2.3           *simple                 Express web framework for Node.js
my_stacks       nodejs-loopback                 0.1.0           *                       LoopBack API framework for Node.js
my_stacks       swift                           0.1.2           *simple                 Runtime for Swift applications

最初の列はリポジトリー、2 番目の列はスタック名、3 番目の列はスタックのバージョン、4 番目の列は使用可能なテンプレートのリストです。Appsody CLI はこれらの要素の組み合わせによってアプリを初期化します。例えば、以下のインスタンスがあるとします。

$ appsody init  my_local/java-microprofile default

このインスタンスでは、CLI がデフォルトの Java MicroProfile テンプレートに基づいてアプリケーションを初期化します。

スタックを使用、変更、または作成すべきかを判断するための決定木

Appsody アプリケーションの内部にはスタックから作成された Docker イメージがあり、そこにテンプレートとユーザー・ファイルが注入されます。Dockerfile はスタックの一部となっているため、ユーザーがスタックにアクセスして Dockerfile に変更を加えることはできません。一方、テンプレートは appsody init の処理中にローカル・マシンの作業ディレクトリーにコピーされます。Appsody ユーザーはテンプレートに含まれているものには自由に変更を加えることができます。テンプレートは appsody build フェーズでスタック・イメージに結合されるため、変更がスタックに反映されます。

必要に応じて、以下のいずれかの方法をとることになります。

  • 既存のスタックを選択し、そのスタックに含まれるいずれかのテンプレートをアプリケーションのベースにする
  • スタックを変更または拡張する
  • まったく新しいスタックを作成する

ここで疑問となるのは、特定の使用ケースに最適な方法を判断するにはどうすればよいかという点です。その判断を行えるようサポートするために、決定木を作成しました。

フロー図

スタックを作成または変更する場合

スタックには、常にアプリケーションの一部となり、変更できないコードが含まれている場合がありますが、テンプレートに含まれるコードはユーザーが変更できます。たとえば、組織でプライベート・リポジトリーを使用しているとします。その組織のメンバーがマイクロサービスを作成するときには、必ず一連の依存関係とライブラリーをそのマイクロサービスに含めさせるようにするには、一連のカスタマイズしたスタックを作成してプライベート・リポジトリーに格納することになります。

スタックを作成または変更すべき場合には、次のようなシナリオも挙げられます。

  • 組織がすべてのマイクロサービスに特定の共通機能 (ヘルス・チェック、テレメトリー、セキュリティー、ロギングなど) を組み込むことを要件にして、これらの共通機能を含めて事前ビルドされた状態のベース・イメージのライブラリーを作成する場合。Appsody リポジトリー内に格納された、共通機能を制御する Dockerfile はいつでも更新できます。ビルド時に、Appsody CLI は使用可能な最新バージョンをプルします。
  • ユーザーが Appsody テンプレートのインスタンスを初期化するときに、初期化の一環として Dockerfile がユーザーのサンドボックスにダウンロードされない場合。この場合、appsody build ステップで毎回リポジトリーから Dockerfile をダウンロードし、ユーザーのコードをコンパイルしてベース・イメージ内の適切なパスに追加します。

    一例として、Java MicroProfile スタックの Dockerfile から抜粋した以下のコードでは、スタックの Dockerfile が Java ソース・コードをイメージにコピーしてコンパイルします。この Dockerfile はスタックの一部としてのみ使用できるため、リポジトリーに対する書き込みアクセス権を持っていない開発者が変更することはできません。

      COPY . /project
    
      WORKDIR /project/user-app
    
      RUN mvn install -DskipTests
    
      RUN cd target && \
          unzip *.zip && \
          mkdir /config && \
          mv wlp/usr/servers/*/* /config/
    

スタックを変更しなくても、言語依存のメカニズムを使用して依存関係をコンテナーに追加することができます。例えば、Maven が Java スタックに依存関係を追加するようにするには、pom.xml に変更を加えます。Python スタックに依存関係を追加するには、Pipfile に変更を加えます。

テンプレートを使用する場合

スタックに新しい関数を追加する必要がなければ、既存のテンプレートのいずれかを出発点として使用するか、必要を満たす新しいテンプレートを作成するという方法をとることができます。テンプレートを使用すると、scaffold を生成するコードを提供できます。こうしたコードは、例えば Web またはモバイル・アプリケーションの REST API バックエンドを作成するなどといった特定のタスクに対応するマイクロサービスを起動するのに適しています。

テンプレートには以下の特性があります。

  • 簡単に作成できます。既存のスタックをコピーして調整するだけでテンプレートを作成できます。
  • さまざまな使用ケースに応じて、既存のスタックの多数のバリアントを作成できます。
  • ユーザーがサービスを作成する際の出発点として使用できる一方、特定の要件に縛られることはありません。

まとめ

Appsody は、クラウド・ネイティブ・アプリケーションの開発を迅速化します。Appsody を使用すると、ゼロから始めるのではなく、特定の使用ケースに合わせて最適化された既存のスタックとテンプレートをベースにアプリケーションを作成できるからです。この記事を読んで、Appsody のさまざまな構成要素が連動する仕組み、そして新しいスタックを作成すべき場合、既存のスタックを変更すべき場合、あるいはテンプレートそのまま、もしくは変更を加えて使用すればよい場合を理解していただけたことを願います。

次のステップ