OthloBlog - オスロブログ -

名古屋のIT系学生コミュニティOthloTechのブログです。

クラウド技術を使い分けろ!2018年XaaSの使い方

f:id:Juju_62q:20180708233928p:plain

おはこんばんちは!@ジュジュです!
最近コンテナのおかげでサーバサイドエンジニアとインフラエンジニアの垣根がなくなっていたり、FireBaseのおかげでモバイルエンジニアとサーバサイドエンジニアの切れ目が減ってきていたり、便利になっているなぁということを肌で感じます。

今回は最近増えてきたクラウド技術を一体どうやって使い分けるべきなのかをCNCF Serverless Whitepaperに基づいて記述していきたいと思います。
※なお筆者が読んで書き下したものであるため主観が含まれる場合等がございます。予めご了承ください。

対象読者

  • インフラ技術の勉強をしている人。
  • クラウドって技術が多すぎてどうしたらいいのかいまいちわからない人。
  • XaaSの使い道のプラクティスが知りたい人。

記事の内容

  • XaaSっていったい何?という疑問に答えていきます。
  • CNCF Serverless Whitepaper v1.0に基づいてXaaSの使い分けについて記述を行います。

CNCFとは

CNCFとはCloud Native Computing Foundationの略称でクラウド標準に則った構成や持続可能性の高いシステムを作る際の標準を謡っている会社です。マイクロサービス化を推進し、ソフトウェアエンジニアがより高速且つ柔軟に開発を進めるためのOSS等を定義しています。具体的にはKubernetesやfluentd、新たな通信規格であるgRPC、メトリクス監視ソフトウェアのPrometheus等が上記理念を実現するためのソフトウェアとして推奨されています。

CNCF is an open source software foundation dedicated to making cloud native computing universal and sustainable. Cloud native computing uses an open source software stack to deploy applications as microservices, packaging each part into its own container, and dynamically orchestrating those containers to optimize resource utilization. Cloud native technologies enable software developers to build great products faster.

Home Page - Cloud Native Computing Foundation

XaaSとは

最近よく聞くXaaSです。IaaS、CaaS、PaaS、FaaS等どんどんいろんな名称で出てきています。これは「〇〇 as a Service」の略称で、上記例であればそれぞれInfrastructure, Container, Platform, Functionを指します。これらの違いとしては利用したときにエンジニアが管理すべき領域が変わってきます。IaaSであればOS以上、PaaSであればWebアプリケーションプログラムとなります。
具体的には下記の画像をご覧いただくとどこを管理するのかのイメージがわくかと思います。

f:id:Juju_62q:20180707114312j:plain

上記画像はJapan Container Daysの発表資料である下記スライドから引用しています。

『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法

IaaS(Infrastructure as a Service)

IaaSはクラウド技術でもっとも有名なものなのではないでしょうか?AWSであればEC2、AzureであればVirtual Machines、GCPであればGCEがこれにあたります。クラウド技術の中でも最も抽象度が低いサービスでOS以上のレイヤをすべて開発者が管理する必要があります。それゆえに自由度も非常に高くOSレベルでのアプリケーションチューニング等を行うことができます。その一方で開発におけるワークロードが定まっておらず、生産性がほかの技術と比べると低いケースが存在します。なお、クラウド技術の中でもっとも古くからある技術であるためにプラクティスは十分に存在し、成熟した技術であるといえます。現在のKubernetesのワーカーノードではIaaSが利用されることが多いです。なおServerless WhitepaperではIaaSに対する言及はされていません。

メリット

  • ベアメタルからの移行でも比較的小さい変更で運用可能。
  • OSレベルでのアプリケーションチューニングやログ収集が可能。
  • 自由度が非常に高く、ほとんど任意の開発環境を用意できること。

デメリット

  • 開発者の管理領域が大きく開発に伴う作業が肥大化すること。
  • 開発以外にも運用に時間コストがかかってしまうこと。

ユースケース

  • 現在ベアメタルで運用しているシステムをクラウドに移行したいとき。
  • OSレベルのチューニングやログ監視が要求されるとき。

CaaS(Container as a Service)

これは少し耳慣れない言葉かもしれません。CaaSはDockerをはじめとするコンテナにパッキングしたものを動作させるランタイムを指します。例を挙げると各パブリッククラウドで用意されているKubernetesエンジンであったり、AWSであればECSやFargate、さくらインターネットであればArukasになります。CaaSではコンテナ特有の"less-opinionated"という特徴をそのままに運用することが可能でベンダーロックインなどの恐れはほとんどありません。コンテナ技術を利用するがゆえに自由度もとても高くなります。しかしながらIaaSと同様に管理範囲は大きなものとなってきます。IaaSとの違いとしてはOSや環境に依存しない携帯性や再利用性の高さがあげられます。

メリット

  • コンテナならではのベンダーに左右されない携帯性や再利用性の高さ。
  • 動作環境の制御性の高さ。
  • イメージ指定等のポリシー指定の柔軟さ。
  • IaaSと比較したときのスケールアウトの高速さ。

デメリット

  • PaaS, FaaSと比較したときの開発者が持つべき責任の大きさ。
  • "less-opinionated"故の生産性の低さ。

ユースケース

  • 既存アプリケーションをマイクロサービス化して展開したいとき。
  • マルチクラウドの利用を念頭に入れているとき。
  • 柔軟なポリシーに基づいたアップデートやスケールアウトを行いたいとき。

PaaS(Platform as a Service)

PaaSは言語の実行環境を提供してくれるクラウドサービスで開発者はアプリケーションの管理のみをすれば開発可能になります。なお、PaaS以上の抽象度ではアプリケーションは大小ありますがベンダーロックインすることになります。
PaaSの例としてはAzureのWeb Apps、GCPのApp Engine、Heroku等があげられます。PaaSでは開発者はアプリの実行プラットフォームについては考慮しなくていいので開発が容易になるほか提供ベンダによってはスケールアウトやデプロイなどについてもマネージしてくれます。開発の指針としてはTwelve-Factor Appが有名です。

メリット

  • 開発者はスケールアウトやデプロイなど運用の面などをクラウドに投げることが可能。
  • オペレーティングシステムやランタイムの管理をしなくてよい。
  • FaaSと比較してステートの存在するアプリケーションを構成可能。
  • Twelve-Factor Appに則って開発できるために生産性が高い。

デメリット

  • OSや実行環境に対しての制御がしにくい。
  • Twelve-Factor Appに則るが故の自由度の低下。
  • ベンダーロックイン。

ユースケース

  • ロックインが需要できて、高速に開発を進めていきたいとき。
  • インフラエンジニアが不在な環境での開発。
  • FaaSと比較してウェブアプリケーションという形式での開発に慣れている。

FaaS(Function as a Service)

FaaSはサーバレスとも呼ばれ、あるイベントに基づいて関数が動作するという動作をするクラウドサービスです。例としてはAWSのLambdaやAzureのAzure Functions、GCPのGoogle Cloud Functionsが挙げられます。
サーバレスではイベントの実行に対して課金が発生するためにIaaSのように毎月一定の額が徴収されるというわけではなく、厳密に利用した分だけお金を支払うという構図となります。これゆえに課金額は抑えることができますが、一定時間以上イベントが発生しない場合にクラウド側に展開されない状態となってしまうため、そうなってしまった場合の駆動は遅くなってしまいます。また、イベントが呼び出された場合に関数は引数に合わせて1から動作するため状態を持った動きを定義するためには外部ストレージ等を駆使して工夫する必要があります。
なお、イベント駆動がゆえにスケーリングに関しては非常に強力でクラウド資源がベンダに存在する限り事実上無限となります。

メリット

  • 理論上無限のスケーリング等にほとんどコストを割かなくてよい。
  • クラウドの基本理念である"pay as you go"に完全に則るが故の課金額の安さ。
  • 抽象度が最も高く開発者が管理するものが少ない。
  • 意識せずともマイクロサービスに近いような設計になる。

デメリット

  • ステートのあるプログラムの記述がしたい場合に工夫する必要がある。
  • 成熟してないがゆえにベストプラクティスが存在しない。
  • 一定期間動作しなかった場合に初回動作が低速になる。
  • ベンダーロックイン。
  • 開発工数の管理の難しさ(Functionで工数管理ができ、容易という説もある。)
  • FaaSならではの設計を行う必要がありパラダイムシフトが必要。

ユースケース

  • どこまでスケールするか分からないシステム。
  • 新たな技術に挑戦するのに慣れているチーム。
  • 運用を極端にまで少なくしたいチーム。
  • クラウド利用料を抑えたい場合。
  • IoT連携等完全にイベント駆動で動作するシステム。

まとめ

CNCFではクラウドネイティブなアプリケーション開発を行う指針としてCaaS, PaaS, FaaSの使い分け方について紹介をしています。これらに関してはそれぞれメリットデメリットがあり、今はまだどれが正解という段階にはありません。これはWhitepaperにも記述があるのですがマイクロサービス化したうえで得意な部分を該当サービスを利用して開発運用するというのが現状はベストなのではないかと思います。1つの技術にこだわらずに多角的に見て正しいクラウドネイティブアプリケーションを構築することで開発者より時間を運用から開発に回すことができ、最近のインフラ業界の合言葉にもなっている"less Ops, More Code"にもつながっていくのではないかと思っています。

終わりに

最近はとりあえず動かしてみようという気持ちで利用できるクラウドシステムが非常に増えてきたように思います。それとともに初学者にとってはサービスが非常に多いという状況を生んでしまい、何をどうやって使うのかがよくわからないという状況を招いてしまっています。

今回はブログの中でクラウドシステムの主だったXaaSとしてIaaS, CaaS, PaaS, FaaSについての解説をするとともにユースケースを紹介しました。何かの役に立つと嬉しいなと思います!それではみなさん、快適なハックライフを!