Arukas Cloudのヘン?な使い方 その1

arukas_github_docker_ssh_nginx

Sherpa製品開発本部のウメヅと申します。

Arukas Cloudとは

Arukas Cloudってご存知でしょうか。
Sakura Internetが提供するCaaS(Container as a Service)です。Sakuraを逆から読むとArukasなわけです。Docker ContainerをHostingしてくれ、on demandで使えます。もう少し詳しい説明やどう使うのか、につきましては、少し検索すれば他所に記事が色々あるのでそちらを参照して下さい。
…とここまで書きまして、実際使い方の記事を探したのですけれども、有料にしても制限が厳しい(data volume未対応等)こともあって、意外と皆さんまだまだ模索しているようです。

発心の阿波 〜開発/build用マシンとして〜

そんな私はArukasを「開発/build用マシン」として使おうと思いました。
といいますのも、とある自分のapplicationをJHipsterで開発していたのですが、JHipsterのmajor versionが上がり、違うマシン環境で開発したくなったからなのです。major versionが4系から5系になったことで、使っていたOAuth認証が無くなったり等色々変わったので、対象のapplicationが使っているJHipsterのversionも上げたかったのですけれども、単純にversionを上げると色々改修する必要が出ること、たまたま大学院時代の恩師から請け負っていたJHipster 4系利用の別productの開発に影響が出てしまうことから、全く別の環境/マシンで開発したかったのです。local machine上でdockerを使って別環境を用意するという手段も、HDD容量が逼迫していて無理でした。
そこで、このArukasのdockerを利用しようと企みました。

修行の土佐 〜Arukasで自分専用のssh machine〜

そのためにはまず、このArukas Cloudのdocker machineを自分だけがsshで入れるものにします。sshdのdocker imageなんてDocker Hub上にゴマンとありますから、その一つを利用します。しかし、多くのsshdのdocker imageでは、起動後、root loginすることになり、その起動したArukas Cloud上のmachineはworld accessibleなのでsecurity的に宜しくありません。すぐさま入ってroot loginを無効にし、sudoable userを作って自分専用にする必要があります。具体的にはsshd_configを書き換えてsshdをrestartすることになるわけですけれども、その時点でdocker containerは終わってしまっています。sshd server processで引き止めてdocker containerを起動しているのですから、終わってしまうのは当然です。

何かもっとこう、最初からsudoable userが作られてroot loginは禁止されていて、自分用のauthorized_keysが設定できて、というようなsshdの入ったdocker imageがないかなぁ、と色々物色していたところ、どれであったかは忘却の彼方となりましたが、github.comから自分の登録したkeyをADDしているDockerfileを見掛けました。

という感じですね。なるほど! と思いまして、それを参考に、「パンがなければお菓子を食べればいいじゃない」の精神から「無いものは作ってしまえばいいじゃない」という必要は発明の母ということで、Dockerfileを自作することにしました。

なれど、これはちょっと面倒です。「Docker Hubを使ってGitHubにあるDockerfileからimageを自動生成する」を参考に、

  1. これ用にGithub上のrepositoryを作成
  2. Docker Hubにもrepositoryを作り、上記Githubのrepositoryと連動(→ Github repositoryが更新されたらDocker Hub上のrepositoryの方にも自動的にrebuildがかかるようにする)
  3. Docker Hub上のimageがbuildされたら、それを使う設定にしてあるArukas上のアプリを更新

という流れにします。

Github上にrepositoryを作るのはいいのですが、Docker Hubに登録したり、Github repositoryをDocker Hubのrepositoryと連動させるのは初めてだったので新鮮でした。しかし、各段階でのdebugがしにくくまたそれぞれに時間もかかり、難儀しました。Docker Hubはbuildの際のlogが出るので、躓けば、local machine上のgit repositoryのDockerfileを変更してGithubにpushしてDocker Hubに取り込まれて自動的にbuildされるのを待って、buildがうまく行けば今度はArukas上のAppでそのdocker imageを利用して編集→適用、というcycleになるのですが、時間の掛かるものでした。また、Arukas Cloudではerror messageが出ないため、アプリが立ち上がらなかったりendpointが通じなかったり400 Bad Requestになったりすると、途方に暮れました。Docker Hubでのbuildは通るのにArukas Cloudで立ち上がらず、どうしようもなかった時には、ArukasのHelp Chatで聞いてみました。すると、翌営業日には中の人が応えてくれ、親切なことに「こうやったら動く」というPull Requestまで書いてくれました。それを元にdefault値等を少し改変し、以下のようなDockerfile及びentrypoint.shを作成しました。

Dockerfile

entrypoint.sh

baseは軽いAlpine Linuxを使います。今は結構packagesが充実しており、EmacsやらJavaから何から何まで揃ってしまうのに驚きました。取り敢えず最低限、sshd用のものとsudo、入ってから操作しやすいようにtmuxを入れます。中段では環境変数GITHUB_USERで指定されたuserを作成、Githubからkey fileを取得、~/.ssh/authorized_keysとして保存します。これで、このcontainerにはGITHUB_USERで指定されたuserのみ入ることが出来るようになります。

早速自分専用のcontainerに入り、my JHipster applicationをscpしてJava8やらGradleやらNode.jsやらgitやらを入れ、buildしてみたところ… resource不足でbuild processが完遂しませんでした。確かにJava系なのでbuildにresource使いますし、Arukasも無料分では最低のspec(0.1vCPU, 128MB RAM)しか使えませんから、ダメなのも仕方なく、文句を言える筋合いではありません。

しかし、折角ここまで作ったので、だからといって放擲しておくのも勿体無いものです。
ではどうするか。
「今宵はここまでに致しとうござりまする」。
…ちょっと古すぎますか。
「今宵はここらでよかろうかい」。
次回投稿に続きます。

アバター

梅津亮

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする