CaaS(サービスとしてのコンテナ)とは?

サービスとしてのコンテナ

この記事では、CaaS(Containers as a Service)について説明する。新しいが強力なクラウドモデルの1つだ。そのコア機能、長所と短所、他のクラウドモデルとの比較、そしてコンテナを使ってシンプルなアプリケーションをデプロイする方法について学ぶ。

Contents

要点

  • CaaSは、組み込まれた機能により、シームレスな開発と展開を容易にする。
  • CaaSは高い拡張性と移植性を提供し、ベンダーロックインを緩和する。
  • CaaSの限界には、潜在的なセキュリティ・リスクや急な学習曲線が含まれる。

サービスとしてのコンテナとは何か?

CaaSの定義は、サービスとしてのコンテナは、開発者がコンテナをアップロード、ビルド、スケーリング、管理できるようにするクラウド・コンピューティング・モデルである。

DevOpsコンテナは、アプリケーションの実行に必要なすべてを含む、軽量のスタンドアロン実行可能パッケージである。ランタイム、コード、ライブラリ、設定ファイルなどで構成される。コンテナは移植性が高く、サイズが小さく、効率的だ。

CaaSを活用することで、開発者やIT運用チームは基盤となるインフラについて心配する必要がなくなる。その代わりに、より高いレベルで考えることができる。

アプリケーションをコーディングし、ドッカー化してクラウドにプッシュするだけだ。あとはクラウド・プロバイダーが、スケーリングやロードバランシング、モニタリングなど、すべてを引き受けてくれる!

その上、CaaSはアジャイル開発を促進し、マイクロサービス・アーキテクチャをサポートし、スケーラビリティの高いアプリケーションを迅速に構築するのに非常に役立つため、優れている。

Containers as a Serviceの中核機能とは?

CaaSがどのような機能を含まなければならないかを定義する公式な仕様はない。ベンダーによって異なるからだ。とはいえ、サービスとしてのコンテナの最も基本的な機能は以下の通りだ:

  • コンテナランタイム(コンテナ化されたアプリケーションの実行を担当)
  • コンテナレジストリ(ビルド済みのDockerイメージを保存・配布できる)
  • 自動スケーリング(トラフィックに応じてコンテナ数を増減)
  • CI/CDシステム内蔵GitHubや GitLabなどのVCSシステムからコードを取り込む)
  • ロードバランシング(複数のコンテナ間でトラフィックを分割し、パフォーマンスを向上させる)
  • モニタリング&ロギング(高度なコンテナモニタリング機能を提供)

サービスとしてのコンテナの利点は何ですか?

より迅速な開発と展開

CaaSを利用することで、ソフトウェア開発とデプロイメントプロセスを大幅に加速することができる。コンテナを利用することで、入社した開発者は簡単にローカル開発環境を構築できる。多くの依存関係をインストールしたり、OSの設定をいじったりする代わりに、コマンドを1つか2つ実行するだけでいいのだ。

さらに、いったんプロジェクトがコンテナ化されれば、どのCaaSベンダーにも簡単にデプロイできる。

資源効率

コンテナはリソースに優しい性質を持っている。CPU、メモリ、ストレージなどのシステムリソースを効率的に利用するように設計されている。コンテナを使えば、一般的に少ないシステムリソースでより多くのアプリケーションを実行できる。VMと比較して、コンテナはよりリソースが最適化されている。

携帯性

コンテナ化されたアプリケーションは、オペレーティング・システムや基盤となるハードウェアに依存しないため、移植性が高い。CaaSを使えば、「私のマシンでは動かない」という問題は二度と起こらない。

その上、コンテナはベンダーロックインのリスクを排除する。現在のベンダーに不満がある場合、コードをあまり修正することなく、ベンダーを簡単に切り替えることができる。

スケーラビリティ

Kubernetesのようなオーケストレーション・ソフトウェアと組み合わせたコンテナは、非常にスケーラブルだ。ほとんどのCaaSベンダーは、オートスケール機能やロードバランシング機能などを内蔵している。そのため、どのようなトラフィックにも対応でき、トラフィックの急増が終わると素早くスケールダウンできる。

簡易操作

CaaSは、開発環境と本番環境のギャップを埋める。その上、VCSシステムと統合する組み込みのCI/CDシステムを提供することで、DevOpsプロセスを簡素化します。

何よりも、CaaSを利用すれば、シスアドやDevOpsエンジニアが不要になるため、大幅なコスト削減が可能になる。

サービスとしてのコンテナの限界は?

セキュリティ問題

コンテナは同じシステム・カーネルを共有するため、VMよりも分離とセキュリティが低い。これは潜在的なセキュリティ・リスクとなり得る。Dockerコンテナ・プロセスをrootとして実行している場合、ハッカーがコンテナから抜け出してホスト・システムをコントロールする可能性がある。

コントロールの欠如

CaaSプラットフォームは通常、他のクラウドモデルと比較して制御レベルが低い。顧客は、コンテナが実行されるマシンを微調整したり、アプリケーションのスケール方法を設定したりすることはできない。

学習曲線

Containers as a Serviceモデルは、PaaSやBaaSよりも難しい。プログラミング、コンテナ化技術、Dockerなどに関する多くの技術的知識を必要とする。学習曲線は険しいが、マスターすれば時間とコストを大幅に節約できる。

データの永続性

コンテナはステートレスであるように設計されている。ファイルやデータベースなど、データの永続性を必要とするものの保存には使うべきでない。CaaSを使う場合は、AWS S3やGoogle Cloud Storageなど、ファイルをホスティングするサードパーティーのサービスを利用する必要がある。データベースに関しては、マネージド・データベース・ソリューションを利用することができる。

DockerとKubernetesはCaaSプラットフォームでどのような役割を果たすのか?

DockerとKubernetesは、ほとんどのCaaSプラットフォームで重要な役割を果たしている。

Dockerは、コンテナを構築、デプロイ、実行、管理するためのフリーでオープンソースのプラットフォームだ。2013年にリリースされ、コンテナ化されたソフトウェアをパッケージ化するためのデファクトスタンダードとなっている。

Kubernetes(K8sと呼ばれることもある)はオーケストレーション・ソフトウェアだ。Dockerよりも高いレベルで動作する。Kubernetesの目的は、コンテナクラスタがうまく連携するようにすることだ。スケーリング、ロードバランシング、壊れたコンテナの交換などを行う。

Containers as a Serviceは他のモデルと比較してどうですか?

このセクションでは、CaaSをIaaS、PaaS、BaaSなどの他のクラウドコンピューティングサービスと比較します。どれも長所と短所があり、プロジェクトを展開する際に考慮する必要があります。

抽象化レイヤーに基づくと、CaaSはIaaSとPaaSの中間に位置する(下図)。

Iaas vs Caas vs PaaS vs BaaS

CaaSとIaaSの比較

IaaS(Infrastructure as a Service)とは、クラウド・プロバイダーが基本的なインフラを仮想化環境で提供する柔軟なクラウド・コンピューティング・モデルである。これには、サーバー、ストレージ、オペレーティング・システム、ネットワークなどが含まれる。IaaSは最も抽象度の低いオプションで、クライアントがインフラを完全にコントロールできる。

CaaSはIaaSに比べて柔軟性に欠け、管理レベルも低い。しかしその反面、管理は非常に簡単で、スケーラビリティとポータビリティを高めることができる。経験則として、高度な制御が必要な場合はIaaSを使い、スケーラブルなコンテナ化アプリを迅速にデプロイする必要がある場合はCaaSを使う。

CaaSとPaaSの比較

PaaS(Platform as a Service)はクラウド・コンピューティング・サービスで、開発者にアプリケーションを構築・デプロイするためのツールを提供する。PaaSを利用することで、ユーザーは基盤となるインフラを気にすることなく、アプリケーションに集中することができます。ほとんどのPaaSプロバイダーは、1~2回のクリックでアプリケーションを実行できるようにします!

CaaSはPaaSに比べて柔軟性と拡張性が高い。PaaSプロバイダーは通常、いくつかのプログラミング言語に制限されているのに対し、CaaSは実質的に何でもデプロイできる。ソフトウェア開発ツールや機能の面では、PaaSの方が進んでいる。PaaSはモノリシックなアプリケーションに適しているのに対し、CaaSはマイクロサービス・アーキテクチャに適している。

Platform as a Serviceの詳細については、Paasとは?

CaaSとBaaSの比較

Backend as a Service(BaaS)は、プロジェクトのバックエンド側を完全に抽象化したクラウド・コンピューティング・モデルだ。データベース、ファイルストレージ、ユーザー管理、API、SDK、プッシュ通知、認証などが含まれる。BaaSを利用することで、繰り返しのプログラミング作業に時間とお金を費やすことなく、フロントエンドとビジネスロジックに集中することができます。

CaaSはバックエンドとフロントエンドのデプロイに使用できるが、BaaSは主にバックエンドのデプロイに使用される。BaaSは非常に使いやすく、コードを必要としないこともある。一方CaaSは、プログラミング、ドッカー化、DevOpsなどの技術的な知識がそれなりに必要になる。

Backend as a Serviceの詳細については、BaaSとは?

Containers as a Serviceのベスト・プロバイダーは?

Back4app Containers

Back4app Containersは、グローバルに分散されたコンテナ上にアプリケーションをデプロイし、スケーリングするためのCaaSプラットフォームを提供する強力なクラウドサービスです。

開発者はDevOpsを気にすることなく、ソフトウェアとDocker化プロセスに集中できる。このプラットフォームにはCI/CDシステムが組み込まれており、GitHubとの統合、ノーダウンタイムのデプロイをサポートしている。

何よりも、無料プランがあり、数分でアプリを起動させることができる!

Amazon Elastic Container Service

Amazon Elastic Container Service(ECS)は、コンテナ化されたソフトウェアの管理とデプロイを簡素化する、フルマネージドのコンテナオーケストレーションサービスです。アプリケーションと必要なリソースを記述するだけで、あとはすべてAWSが処理します。

ECSはバックグラウンドで他のAWSサービスを利用するため、ECS専用の料金は発生しない。ECSを効果的に利用するには、AWSのエコシステムに精通している必要がある。また、AWSは新規顧客向けに無料ティアを提供している。

Google Cloud Kubernetes

Google Cloud Kubernetes(GKE)は、GoogleのKubernetesベースのオーケストレーション・プラットフォームだ。コンテナを自動操縦することができ、ノードを管理する必要がなくなります。Kubernetesアプリケーションやテンプレート、オートスケール機能、マルチクラスタ管理などがあらかじめ用意されています!

GKEは非常に高性能で柔軟だが、初期設定がかなり必要だ。そのため、初心者には適していない。他の2つのオプションと同様に、Googleも新規ユーザーに無料のクレジットを提供している。

コンテナを使ってシンプルなアプリケーションをホストするには?

このセクションでは、シンプルなPythonウェブアプリケーションをビルドし、Docker化し、デプロイする方法を見ていきます。このガイドはBack4app Containers専用に設計されていますが、同様の手順は他のCaaSプロバイダにも適用できます。

目的

  1. アプリケーションをコーディングする。
  2. アプリケーションをDocker化してテストする。
  3. ソースコードをGitHubにプッシュする。
  4. アプリをCaaSにデプロイする。

コードアプリ

デプロイメント・プロセスを実演するために、FastAPI(本番環境ですぐに使えるAPIを構築するための、モダンで高性能なPythonフレームワーク)を使ってシンプルなRESTful APIを構築する。

プロジェクト設定

プロジェクト専用のフォルダと仮想環境を作成することから始める:

$ mkdir fastapi-example && cd fastapi-example
$ python3.9 -m venv env && source env/bin/activate

次に、FastAPI を依存関係と共にインストールします:

$ pip install "fastapi[all]"

extra 指定子を使うと、UvicornサーバーやJinja2テンプレートエンジンなど、いくつかのオプションの依存関係がインストールされます。最低限必要なものだけをインストールしたいのであれば、extra指定子は使わないでください。

以下の内容でmain.pyファイルを作成します:

# main.py

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Back4app Containers rocks!"}

これは最も基本的な FastAPI アプリです。FastAPIをインポートし、初期化し、ルートエンドポイントを登録する必要がありました。アクセスすると、Back4app Containers rocks!

実行とテスト

ウェブアプリを実行するには、組み込みのUvicornASGIサーバーを使用できます:

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [9528] using WatchFiles
INFO:     Started server process [26308]
INFO:     Waiting for application startup.
INFO:     Application startup complete.  

reloadフラグを追加したのは、ソースコードに変更を加えた場合にサーバーをリロードさせたいからだ。

cURLを使ってAPIルートにGETリクエストを送る:

$ curl http://localhost:8000/

{
    "message": "Back4app Containers rocks!"
}

要件.txt

もうひとつ必要なのは、すべての要件をrequirements.txtファイルに凍結することだ。そうすることで、他の人がプロジェクトに必要なすべての依存関係を素早くインストールできるようになる。

$ pip freeze > requirements.txt

fastapi==0.97.0
pydantic==1.10.9
python-dotenv==1.0.0
...

このファイルを使って、Dockerイメージ構築プロセスでPythonの依存関係をインストールする。

Dockerizeアプリ

以下に進む前に、ローカル・マシンにDockerが入っていることを確認してほしい。それを確認する最善の方法は、ターミナルでdocker --version を実行することだ。

ドッカーファイル

プロジェクトをDocker化するには、Dockerfileを使う。Dockerfileは、ユーザーがイメージを組み立てるために実行できるすべてのコマンドを含むテキストファイルだ。

プロジェクト・ルートにDockerfileを以下のように作成する:

# Dockerfile

# Use Alpine Linux as the base image
# we're using it since it's tiny in size (~5 MB)
FROM python:3.9.6-alpine

# Set the working directory
WORKDIR /app

# Set environmental variables
ENV PYTHONDONTWRITEBYTECODE 1  # Prevents Python from writing out .pyc files
ENV PYTHONUNBUFFERED 1         # Keeps Python from buffering stdin/stdout

# Copy over the requirements file and install the dependencies
COPY ./requirements.txt .
RUN pip install --no-cache-dir --upgrade -r ./requirements.txt

# Copy over the source code
COPY . .

# Expose the port
EXPOSE 80

# Run the server
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

コメントをチェックして、さまざまな指示がどのように機能するのかを把握しよう。

ご心配なく。すべての手順を暗記する必要はありません。もし行き詰まったら、いつでもDockerのドキュメントをチェックできる。さらに、ほとんどの言語とフレームワークのDockerfileはオンラインで見つけることができる。それらをコピーして、あなたのニーズに合わせるだけでいい。

.dockerignore

プロジェクトには、Dockerイメージに含めたくないファイルやディレクトリがあります。それらを無視するには、.dockerignoreファイルを使います。

プロジェクトルートに.dockerignoreファイルを作成します:

# .dockerignore

.git/
.idea/
venv/

ファイルやディレクトリは自由に追加できる。

ビルド、実行、テスト

コードをCaaSにデプロイする前に、プロジェクトがあなたのマシン上で正常にビルドされ、実行されることを確認してください。

Dockerイメージのビルドから始める:

$ docker build -t fastapi-example:1.0 .

論点の整理

  1. -t fastapi-example:1.0タグを付ける。
  2. ビルドコンテキストを定義する

次に、イメージのビルドが成功したかどうかを確認する:

$ docker images

REPOSITORY        TAG       ID             CREATED AT      SIZE
fastapi-example   1.0       33feac11707d   4 seconds ago   72.8MB

その後、新しく作成したイメージを使って新しいコンテナをスピンアップする:

$ docker run -p 80:80 --name fastapi-example -d fastapi-example:1.0

論点の整理

  1. -p 80:80はポート80を公開する。
  2. --name fastapi-exampleはコンテナの名前を指定する。
  3. -d は、コンテナをデタッチモードで(ターミナルを占有せずに)実行する。
  4. fastapi-example:1.0は使用するイメージを指定します。

稼働中のコンテナをチェックする:

$ docker ps

ID        IMAGE                 COMMAND                CREATED   PORTS                
e67fdeg   fastapi-example:1.0   "uvicorn main:app.."   9s ago    0.0.0.0:80->80/tcp  

最後に、APIインデックスにGETリクエストを送信し、メッセージを取得できるかどうかを確認する:

$ curl http://localhost/

{
    "message": "Back4app Containers rocks!"
}

コンテナを停止するには、以下のコマンドを使用できる:

$ docker kill fastapi-example

GitHubにプッシュする

次のステップでは、GitHub のアカウントが必要です。まだ持っていない場合は、サインアップしましょう。さらに、あなたのマシンにGit がインストールされ、設定されていることも確認しましょう。

リポジトリの作成

GitHub アカウントにログインすると、ダッシュボードにリダイレクトされます。画面右上の追加ボタンを押すと、リポジトリ作成フォームが表示されます。

GitHub リポジトリの作成

次に、リポジトリにわかりやすい名前を付け、「リポジトリを作成」ボタンをクリックします。

GitHub リポジトリ作成フォーム

GitHub はリポジトリの作成に少し時間がかかります。リポジトリが作成されると、そこにリダイレクトされます。リモートリポジトリの URL” に注目してください。

GitHub リモートURLの取得

ソースコードをプッシュする

続けて、ローカル・プロジェクトに戻る。

コードをバージョン管理する前に、.gitignoreファイルを作成するのが賢明です。.gitignoreファイルによって、バージョン管理システムに追加すべきでないファイルやディレクトリを定義することができます。このファイルは.dockerignoreファイルと同じ働きをします。

プロジェクト・ルートに以下の内容の.gitignoreファイルを作成する:

# .gitignore

.idea/
venv/
.env
build/

ご自由に変更してください。

次に、ターミナルを開いて以下のコマンドを実行し、ローカルのGitリポジトリを初期化する:

$ git init

それからすべてのファイルをVCSに追加し、最初のコミットを作成する:

$ git add .
$ git commit -m "my initial commit"

最後に、リモートのGitHubオリジンを追加し、ソースコードをプッシュする:

$ git remote add origin <remote_url>
$ git push origin master

必ず を前のステップのリモートURLに置き換えてください。

これで完了だ。GitHub リポジトリのページを確認すると、すべてのファイルが正常に追加されているはずです。

アプリのデプロイ

アプリをBack4app Containersにデプロイするには、Back4appアカウントが必要です。まだお持ちでない方は、登録してください。

ログインすると、アプリのリストが表示されます。Build new app “ボタンをクリックすると、アプリの作成プロセスが初期化されます。

Back4app アプリケーションの作成

Back4appでは、Backend as a Service (BaaS)とContainers as a Service (CaaS)の2種類のアプリをデプロイできる。コンテナ化されたアプリケーションをデプロイするので、”Containers as a Service “オプションを選ぼう。

サービスとしてのBack4appコンテナ

まだ GitHub プロファイルをリンクする必要がある場合は、前のステップで作成したリポジトリをインポートします。次に、それを選択します。

Back4app Containers リポジトリを選択

Back4app Containersでは、デプロイを高度にカスタマイズできます。デプロイブランチ、ルートディレクトリ、自動デプロイの切り替え、環境変数の設定が可能です。

今回はシンプルなアプリをデプロイするので、これらのオプションは必要ない。アプリ名」を設定し、「アプリを作成」ボタンをクリックするだけだ。

Back4app Containers アプリの構成

Back4app Containersは、GitHubからソースコードを取得し、イメージをビルドし、新しいコンテナをスピンアップするのに数分かかります。アプリケーションの準備が完了すると、ステータスが “Ready “に変わります。

そうなったら、画面左側の緑色のリンクをクリックして、ブラウザでアプリを開くことができます。また、Back4app Containersがあなたのアプリのために無料のSSL証明書を発行したことに気づくかもしれません。

Back4appコンテナのデプロイ完了

よくやった!

結論

結論として、マイクロサービス・アーキテクチャに最適なクラウド・ネイティブ・モデルの1つであるCaaSについて学んだことになる。CaaSの主な特徴、利点、制限、そして最適なCaaSベンダーを知ることができました。さらに、シンプルなDocker化アプリケーションをBack4app Containersにデプロイする方法も学びました。

プロジェクトのソースコードは、back4app-containers-fastapiリポジトリで入手できます。

さらなるステップ

  1. Dockerfileを改善し、メンテナンスしやすくするために、Multi-stage buildsを検討してください。
  2. Dockerコンテナ・プロセスを非ルート・ユーザーで実行することは、良いセキュリティ慣行です。
  3. 他のプログラミング言語やフレームワークのデプロイ方法については、Back4app Containersのドキュメントをご覧ください。

よくあるご質問

コンテナ・アズ・ア・サービス(CaaS)とは?

コンテナ・アズ・ア・サービス(CaaS)は、開発者がコンテナをアップロード、構築、スケーリング、および管理できるクラウドコンピューティングモデルです。コンテナは、どこにでも簡単にデプロイ可能な小さな実行可能アプリケーションパッケージです。CaaSを使うことで、開発者やIT運用チームは基盤となるインフラストラクチャを気にせず、より高次のレベルで作業できます。

CaaSの利点は?

– 開発とデプロイの高速化
– リソースの効率化
– ポータビリティ
– スケーラビリティ
– 運用の簡素化

CaaSの欠点は?

– セキュリティの問題
– 制御の欠如
– 学習の難しさ
– データの永続性

おすすめのCaaSプロバイダーは?

– Back4app Containers
– Amazon Elastic Container Service (ECS)
– Google Cloud Kubernetes (GKE)

コンテナを使ってアプリをデプロイする方法は?

1. アプリケーションをコーディングします。
2. アプリをDocker化してローカルマシンでテストします。
3. ソースコードを GitHub にプッシュします。
4. アプリを Back4app Containers にデプロイします。


Leave a reply

Your email address will not be published.