Chapter 02

初期設計とAWS上での実装

株式会社var(ヴァー)
株式会社var(ヴァー)
2021.09.30に更新

こちらのチャプターでは、初期設計とAWS上での実装について説明します。
後のチャプターでわかりますが、この実装は後に全てなくなります。

アンチパターンとしてご理解ください。

動的にコンテナを起動させるシステムを実装するので、まずは、Dockerに関する調査から始まりました。
Docker はデフォルトでは UNIXソケット を利用して操作を可能にしますが、 TCPソケット も利用できることがわかりました。よって、コンテナを起動するためのサーバーを立て、そこにコンテナの起動や終了のリクエストを出すことで遠隔からコンテナ操作を可能にすることを考えました。

構成図は以下の通りです。

つまり、以下の3つの機構が必要です。

  1. Webアプリケーション機構
  2. Dokcerコンテナを起動・停止するAPI(docker-manager)
  3. Dockerコンテナを動作させるサーバー群 (コンテナサーバー)

ユーザーからのアクセスを通常のWebアプリケーションで受け、その後コンテナオーケストレーションシステムの下位互換のような API を実装し、API経由で コンテナが立ち上がるサーバー(以後、コンテナサーバー) 上でDockerコンテナを起動する構成を考えました。

docker-manager の役割は、docker-compose コマンドとほぼ同じで、コンテナ起動の設定ファイルを読み込み、それに応じたユーザごとの専用コンテナを作ることです。しかし、docker-compose はAPIとして用意されているわけではないので、自分達で書く必要がありました。

ユーザーは コンテナサーバーGlobal IP を利用して各コンテナにアクセスすることを想定していました。そのため、ユーザごとに踏み台コンテナを作成し、ユーザごとに別々のポートを介してコンテナにアクセスさせようと考えました。

当時、この場合はユーザは SSHクライアント を使う必要があるため、現在のウェブブラウザからのアクセスではなく、ユーザーのTerminalやコマンドプロンプトからのアクセスを想定していました。
イメージは、下図です。至ってシンプルな構成です。

ということで、早速、Pythonを利用してオリジナルの docker-manager を作成しました。

Pythonを利用した理由としては、以下の二つです。

  • 自分等がPythonになれていたという超絶安易な理由
  • Dockerのクライアントライブラリが便利そうという希望的観測

ちなみに当時の我々は、人に誇れるほどのWebやAPIの開発経験はなく、大学の研究のためにPythonで少しプログラムを書いたり、CTFを解くために必要なプログラムをかける程度の能力でした。そこで、REST API なるものをググって、いい感じに実装をはじめました。(いい感じってなんだよ。)

重量級フレームワークである必要はなかったので、 Flask を選定しました。