今、デベロッパー向けにこういうサービスあったらいいなーと思っているものがある。
その中でSSH接続を受け付けたいなと思ったから実現方法を考えた。
WordPressをホスティングしてvimで記事を編集できるようなものをイメージして欲しい。
ルール
・1人1Docker コンテナ
・コンテナを実行するEC2インスタンスを運営側がいつでも変更できるようにする
・サーバーの状態の保持は別問題
・HTTPも別問題
・ユーザー名は全ユーザーで1意、ホストは共通
サインアップしたユーザーにDockerコンテナを用意し、そこにSSH接続を受け付けるようなものを作りたい。
せっかくなので、1Dockerに複数のユーザーを用意できるようにしたかった。それができると「管理者」「編集者」「記者」等のロールを作れる。しかし、難易度が上がりそうなので今回は諦め。
コンテナを実行するEC2インスタンスを運営側がいつでも変更できるようにしたい。
特定のホスト名、ポート番号で待ち受け続けないといけないと運用がきつくなる。
例えばもっと安いEC2インスタンスが発表されたらこっそりコンテナを移動したい。
また、使われてないコンテナを勝手に落としておき、次にアクセスが来たときに空いているインスタンスで立ち上げる仕組みも入れられるようにしたい。
そのため、生EC2アドレスをユーザーに渡すのではなく、SSHプロキシのアドレスを渡してそこからEC2にブリッジする。
インスタンスを立ち上げなおしたときにユーザーが変更したファイルの保持をどうするかは、ネットワーク設計とは別問題なので今日は気にしない。それはアプリケーション設計の話だ。
大方 /var/hoge/fuga 以外を変更しても保存は保障しませんよといっておけばいいだろう。
HTTPでも受け入れられるようにしたいが、そっちはそっちで話がでかすぎるので別で考える。
ユーザー名は全ユーザーで一意にする。
さっきも書いたが本当はホストごとに名前空間を区切って
- admin@user1.some-service.com
- author@user1.some-service.com
- editor@user1.some-service.com
- junior-staff@user1.some-service.com
という風にロールわけをできるようにしたい。
しかし、後述のライブラリがまだHostに対応していないので諦めた。
とりあえず
- user1@some-service.com
- user2@some-service.com
というユーザー名体系にする。
実現方法
これはまだ試していなくて、こうすれば大丈夫だろうと僕が今想像していることである。
用意するもの
・ELB
・セキュリティゾーン
・EC2を3台以上
・内2台はSSHプロキシ
・もう一台はDockerのせるインスタンス(アプリケーションインスタンスと呼ぶ)
ユーザーが増えてきたらこのインスタンスを増やしていけば良い
・DockerImage
まず、ELBから2台のSSHプロキシサーバーに大してTCPロードバランスを設定
外向きのホスト名はssh.some-service.comで統一する。
https://github.com/tg123/sshpiper
アプリケーションインスタンスでDockerを起動
このとき、内向きのSSHポートは22とする。
外向きは可変にする。
docker -p 3333:22 等
これで準備は完了。
新しくユーザーがサインアップしたらどこかのアプリケーションインスタンスでDockerを起動する。
鍵ペアを生成し、Docker内に渡すと同時にSSHプロキシにそのインスタンスのホスト名、ポート名、鍵を設置。
ユーザーに秘密鍵を渡す。
これでできるんじゃないかな?