Aidemy Tech Blog

機械学習・ディープラーニング関連技術の活用事例や実装方法をまとめる、株式会社アイデミーの技術ブログです。

大公開!初心者でもわかるAidemy社内インフラの全容とその設計思想

インフラって初学者にとってかなりブラックボックスですよね。

インフラ構成なんて会社の業態やサービス形態によって様々なので、初心者にとってどれが重要なのかわかりにくい(そもそもあんまり公開されてないし)。また、調べてみても各サービスの個別的な情報ばかりで、なかなか社内インフラの設計思想のような体系的な情報はでてきません。なにより、何から理解すればいいのかわからないので地道に勉強するのがめんどくさい!

そこで、先日Microsoft社で行われたハックフェストに参加し、マンツーマンでインフラ構成について教えていただきました!

ハックフェストで教わったことを踏まえ、Aidemyのインフラ構成を例に、重視しているポイントや、用いているサービス・ツールについて、インフラに触れた経験のない人でもわかるように解説していきたいと思います。

f:id:aoi_tsuno:20180428194732j:plain

Microsoftオフィスでのハックフェストの様子

Aidemyのインフラ構成設計思想

Aidemyのインフラ設計では以下の3点を重視しています。

  1. コンテンツの配信速度を爆速にしたい!
  2. アプリのアクセスに応じて柔軟にスケーリングしたい!
  3. 安全にバッチ処理、WebHook受信をしたい!

それぞれの要件を実現する方法について、1つずつざっくり解説していきます。

f:id:aoi_tsuno:20180502101240p:plain

Aidemyインフラの概観図(以下、模式図には便宜上Microsoft Azureによって提供されているサービスのロゴを用いていますが、他クラウドサービスでも同様のプロダクトが利用可能な場合があります)

1.「コンテンツの配信速度を爆速にしたい!」を実現する"CDN"(Content Delivery Network)

f:id:aoi_tsuno:20180502101317p:plain

CDNでは、世界各地に配置された全てのキャッシュサーバーに、IPアドレスに対応した静的コンテンツが保存される仕組みになっています。

f:id:aoi_tsuno:20180430183124p:plain

コンテンツデリバリネットワーク - Wikipedia

エンドユーザは、全てのキャッシュサーバーの中でもっとも近くにある(HOP数の少なくて済む)サーバーに保存されたコンテンツをダウンロードするため、非常にスピードの速いアクセスが可能となります。

また、複数台のキャッシュサーバーにより構成されているため、トラフィック分散や、単一のネットワークの不具合による遅延の軽減などのメリットもあります。

2.「アプリのアクセスに応じて柔軟にスケーリングしたい!」を実現する"Container Registry" + "Kubernetes"

f:id:aoi_tsuno:20180502101353p:plain

一般にWebサイトのアクセス頻度は、時期や時間帯によって大きく変化します。さらに、Aidemyでは機械学習のオンライン学習サービスを提供しているため、講座内でニューラルネットワーク等を用いたCPU負荷の大きいソースコードを実行する場面が多々あります。

かといってスペックの高いVM(仮想マシン)を何台も常時保有しているのはかなりの高額のコストがかかってしまいスタートアップにとって致命的です。したがって、ユーザのアクセス量に応じて随時マシン数を増減させる必要が生じます。

そこで、Container RegistryとKubernetesを組み合わせることにより、高速で柔軟な実行環境の展開と、そのデプロイの簡略化を図ることができます。

Container Registry

f:id:aoi_tsuno:20180502101429p:plain

Container Registryとは、Microsoft Azureなどにより提供されているDocker*1レジストリで、ローカルからアップロードされたDockerイメージ(ここでは、実行環境やソースコードをひとまとめにしたファイルと考えてもらえれば十分です!)を、サービスのクラウドストレージに保存することができます。保存されたイメージは権限で守られており、Virtual Network内の至るところからアクセスすることができます。次はKubernetesでこのContainer Registry上のイメージをスケーリングしていきます!

Kubenetes

f:id:aoi_tsuno:20180502121047p:plain*2

Kubernetesは「クーベネティス」と読み、一般に"k8s"と略されているようです。Kubernetesとは下図のようにある一つのノード(マスターノード)に指令を与えるだけで、複数の実行環境を高速に展開し、運用に必要な処理を自動化することができるオープンソースツールです。(図中の"RUN"とは、Aidemyの講座でソースコードを実行する環境のことをさしています。)

f:id:aoi_tsuno:20180428174827p:plain

Docker(コンテナ型仮想化)と Kubernetes についての簡単な紹介 – ゆびてく

KubernetesとContainer Registryを組み合わせることにより、マスターノードへの指令でクラウド上のDockerイメージを指定することで同一環境のコンテナをいくつも立ち上げることが可能になります!

Kubernetesを利用するメリットとしては、

  • 複数台のマシンを稼動させていても、1台だけを操作するように扱える
  • 実行しているコンテナの負荷や不具合に応じて、自動で新たなホストを立ち上げたり、削除したりすることができる(スケールアウト/ダウン)
  • アプリ稼働中、セッションを維持しながらバージョンアップすることができる(ロールアウト)

が挙げられます。

マスターノードに与える指令はyaml形式で記述されており、スケールアウト/ダウンの基準となるCPU負荷率なども簡単に指定可能です。

 さらに、Kubernetesを用いれば、Container Registryに保存したサービス(webフロント、バックエンドAPI)のコンテナイメージをまとめて一気にデプロイすることができるので、本番環境の運用で起こりうる人的ミスを最小限に抑えることもできます!

ubiteku.oinker.me

 

3.「安全にバッチ処理、WebHook受信をしたい!」を実現する"Azure Function App"

f:id:aoi_tsuno:20180502101545p:plain

特定の相手からのリクエスト受信や、定期的な処理を行いたいけど、そのために常時インスタンスを稼働させておくのはコストがかかってしまう…。そんな場合に手軽に活用できるのがFunction Appです!

Function Appはクラウドサービス上のエディタにベタ書きしたステートレスな関数を実行することのできるアプリケーションプラットフォームです。webhookにも対応可能で、フレキシブルに実行のスケジューリングが設定できるうえ、従量課金制なので、安心してサードパーティからのリクエスト(Aidemyではクレジットカード引き落とし情報など)を受け付けることができます。

例えば、名前入りのリクエストを受けて挨拶を返してくれる簡単な関数を次のようにNode.jsで実装してみます。

module.exports = (context, req) => {
  context.res = {
    status: 200,
    body: {
      message: 'Hello, ' + req.query.name + '!',
    }
  };
  context.done();
}

ソースコードをそのまま貼り付けるだけで、(画像はMicrosoft Azure Function Appにおける運用例)

f:id:aoi_tsuno:20180430232317p:plain

作った関数がどこからでも使えるようになります!(ここではRESTクライアントソフトのPostman*3を利用しています

f:id:aoi_tsuno:20180501203006p:plain

さらに、このように鍵や接続文字列をアプリケーション内で環境変数として指定することもできるので、安心して秘匿情報を利用することができます。

f:id:aoi_tsuno:20180430233342p:plain

サードパーティへのアクセス権をコードにもたせたいけど、秘密鍵情報はセキュリティ上ソースコード内に書きたくない…という場合にもってこいです!

このように、Function Appを利用すれば、安全に、そして安価にバッチ処理やサードパーティとの連携をおこなうことができます。

まとめ

ハックフェストでは、コンテナ化の概念や公開鍵認証など初歩的なことから教えていただけるので、専門的な相談はもちろん、「インフラに興味があるけど何から学べばいいかわからない…」という方にも絶好の機会だと思います!

 

Microsoft Japanの安納さん、窪田さんありがとうございました!(真ん中が安納さん)

f:id:aoi_tsuno:20180502225821j:plain

 

*1:コンテナ技術による軽量な仮想化プラットフォーム。

knowledge.sakura.ad.jp

ドットインストールのDocker入門もおすすめです。

https://dotinstall.com/lessons/basic_docker

*2:図式化のため、上図では複数のKubernetesクラスターが分散しているような形式をとっていますが、正確にはKubernetesは下図のように各アプリケーションを一つのクラスタ内で管理しています。

f:id:aoi_tsuno:20180427200605p:plain

Using kubectl to Create a Deployment | Kubernetes

*3:

www.getpostman.com