ロリポップ!マネージドクラウドのチームメンバーとして正式版リリースに参加できた #mclolipop

今日マネージドクラウドの正式版リリースがされました。

mc.lolipop.jp

前々から(使う側として)目をつけていたサービスの開発チームにまさかJOINできるとは思っていませんでした。

たった1ヶ月半で、何も知らないところから、技術面にもビジネス面にもいろいろ関わらせてもらい、新しい挑戦も さらに失敗まで 経験することができました(当然チームメンバーのリカバーがありました)。

本当に濃すぎる。

これからやりたいことももっと良くするためにやるべきこともたくさんあります。

マネージドクラウドも、今でも「使える」「楽ができる」良いサービスですが、アーキテクチャを知っている立場からすると、実はまだまだ追加で面白くできそうな要素があります。

自分ですら思うのですから他のメンバーはもっと思っているでしょう(逆に収束させるのが難しいくらいで困る)。

新しい技術だから夢が広がるのはしょうがない。

ところで

マネージドクラウドは従来のレンタルサーバとも従来のクラウドとも違います。

レンタルサーバーとクラウドのいいとこどり」

どんなサービスなのか「使う側」として知りたいとは思いませんか?

当然、マネージドクラウドを構成しているのは「技術」ですから得意な領域はありますし不得意な領域もあるかもしれません。

というわけで、AWSVPSをずっと使ってきた自分が「クラウドな言葉で」マネージドクラウドの説明に挑戦します(アウェーなのに機会をもらって本当に嬉しいです。宣伝とかではなく絶対に知りたいことを伝えられるように頑張ります)。

jaws-ug-kyushu.doorkeeper.jp

というわけで、ロリポップ!マネージドクラウド、リリースしました!

cgroupの状況を確認する便利コマンドは存在した

cgroupの状況を確認するのに以下のコマンドが使えることを知りました

systemd-cgtop

名前の通りcgroupごとにグルーピングしてtopコマンドみたいにCPU, Memory, Block IO usageを確認することができます

f:id:k1LoW:20180409225537p:plain

systemd-cgls

こちらもcgroupごとにグルーピングして表示してくれます

f:id:k1LoW:20180409225550p:plain

なぜ知ることができたのか

cgroupごとのCPU利用率とかカジュアルに知りたいなと思って @udzura のとてもわかりやすいエントリを見ながら、「必要そうだから作ってみるかなー」と思って思いついた名前が「cgtop」で、「あ、なんかありそう。よく考えたらむしろ存在しないほうがおかしい。」と思って「cgtop」でググったらありました。

参考URL

udzura.hatenablog.jp

gentoo.hatenablog.com

qiita.com


これで今日もいろいろ進みそう

mod_mrubyとngx_mrubyのRPMリポジトリをpackagecloudに作った

マネージドクラウドのチームにJOINして、1ヶ月たちました。

ツイートから周りからは「楽しそうですね」と勘違いされているようですが、アーキテクチャや技術スタックのキャッチアップに大変な毎日を送っています。楽しいです。

Webサーバに機能を追加するということ

ところで、広く知られていることですが、マネージドクラウドではngx_mrubyがかなり活用されています。

何をもって活用されていると言えるのかは要出典ですが、NGINXが単なるWebサーバではなく「別の機能を持った何か」に見えるくらいには使われています。

「Webサーバに機能を追加する」という感覚は一般的なWebアプリケーションの上で生きてきた自分としては新鮮で、「最近のフレームワークは例えばMiddlewareというような階層構造で機能を付与するものがあるが、その一部をさらにその外に移譲しても良いんだ」という面白さがありました。

思えば、AWSでサーバーレスアーキテクチャを構築する上でも、機能を

  • CloudFrontのLambda@Edgeに持たせるのか
  • API Gatewayに持たせるのか
  • HTTPリクエストから発火したAWS LambdaのFunctionに持たせるのか
    • さらにそのFunction内のmiddyで多層化されている
  • はたまたバックのDynamoDBのストリームからイベント発火したAWSLambdaに持たせるのか

と、機能を持たせる場所というのがシステム全体のアーキテクチャを考える上で重要で、できれば選択肢が多いほうがより構成の選択肢が増えるのは実感としてわかっていました。

「もしかして、これは、そこまで規模の大きくないWebアプリケーションを開発する上でも、アーキテクチャとして『Webサーバに機能を追加する』という選択肢を持っていたら強いのでは?」

と思って、PHPカンファレンス福岡2018に「プログラマブルWebサーバ -Webサーバに機能を追加してみよう-」というタイトルで応募しました。

そして、不採択でした。残念。

mod_mruby / ngx_mrubyというレイヤー

mod_mrubyやngx_mrubyというレイヤー、GMOペパボではMiddleware Configuration as Codeと呼ばれて活用されています。

なんだか新しい、とっつきづらいもののように聞こえるのですが、作者の @matsumotory から聞いてちょっとおもしろかったことがあります。

mod_mrubyのApacheへの組み込まれ方は、実はmod_phpと同じだそうです。

Apacheが実行する(主に)Webアプリケーション用のインタプリタとして使われることを目的としているのか、Apacheの処理のさまざまな箇所でフックやフィルタように動かす用のインタプリタとして使われることを目的としているのかの違いだけです。

「mod_phpと同じだ」とか、途端に親近感がわきます。

とはいえ自前ビルドは技術採用のハードルになる

mod_mrubyもngx_mrubyもApacheやNGINXに組み込みます。

そうすると、「Webサーバも自前ビルドなのか?」「そうでなくてもmod_mrubyやngx_mrubyも自前ビルドなのか?」となり、運用を考えると躊躇してしまいます。

自前ビルドより yumapt-get を使いたいです。よね?

そういったわけでRPMリポジトリを作ってみました。

作ったRPMリポジトリ

今回作ったRPMリポジトリの要件は以下です。

  • ターゲットはCentOS7とCentOS6
  • ApacheCentOS公式のRPMリポジトリhttpd、NGINXはNGINX公式のRPMリポジトリのnginxが使えること
    • かなり重要。今運用しているシステムの構成に追加採用できる可能性が飛躍的にあがる
  • 全自動でhttpd、nginx、mod_mruby、ngx_mrubyのリリースを検知し、その組み合わせのRPMをビルドし使えるようにすること
    • パッケージメンテナの負荷をゼロに。RPMリポジトリがなくならない限り更新されていきます。

そのために、mod_mrubyとngx_mrubyの以下の機能をあきらめています。

  • mrbgemの追加ビルド
  • ngx_mrubyのTCPロードバランシング機能

mrbgemについては、もう少し知見が溜まったら、ゴールデンAMIならぬ「ゴールデンビルド」を決めてリリースしようと思います。

ngx_mrubyのTCPロードバランシング機能については、現時点ではNGINX自体のビルドオプションを変える必要があるため、なかなか難しそうです。

それでも十分強力なので、それなりの意義があると思っています。

作ったRPMリポジトリは以下です。

packagecloud.io

packagecloud.io

使い方

よくある外部RPMリポジトリの利用と同様に、RPMリポジトリの登録とインストールの2STEPになります。

RPMリポジトリの登録

packagecloud の機能をフル活用しているので、

mod_mrubyの場合は

$ curl -s https://packagecloud.io/install/repositories/k1low/mod_mruby/script.rpm.sh | sudo bash

ngx_mrubyの場合は

$ curl -s https://packagecloud.io/install/repositories/k1low/nginx-module-mruby/script.rpm.sh | sudo bash

で終わりです。

インストール

mod_mrubyの場合は

$ sudo yum install mod_mruby

ngx_mrubyの場合は

$ sudo yum install nginx-module-mruby

で終わりです。

モジュールの有効化

Apacheの場合は、confに

LoadModule mruby_module modules/mod_mruby.so

NGINXの場合は、eventディレクティブの前に

load_module modules/ndk_http_module.so;
load_module modules/ngx_http_mruby_module.so;

と追記すれば有効化されます。あとは使うだけです。

簡単ですね!

作ったときのはなし

以下は特に読む必要はないはなしです

実際に動いているCIのスクリプトは以下のリポジトリになります。

github.com

github.com

RPMパッケージを作るだけなのにそれなりに大変でした。

CentOSのGitやRubyのバージョンが古くて辛い

Rubyのバージョンが古くてpackage_cloud.gemがインストールできなかったり、Gitが古くてCircleCIがまともに動かなかったり、全然本流とは違うところで躓くことに。

そこはTwitterでCircleCIマスターの @kunit から直球の解法を教えてもらって、なんなく解決できました。ありがとうございました!

フィードフォースの皆さんありがとうございます!

CircleCIのScheduled Workflowが最高

今回作ったRPMリポジトリの「全自動化」はCircleCIのこの機能を知っていたからなのですが、もう最高です。

circleci.com

ようはcronでビルドを定期実行してくれるという機能です。うまく .circleci/config.yml を書ければいろいろな用途に使える機能なのでオススメです。

モジュールの利用にもSELinuxのポリシー設定が必要

RPMリポジトリからモジュールをインストールするだけではダメで、そのモジュールに適切にSELinuxのポリシーを設定する必要があるということを知りました。

/var/log/audit/audit.log を見たり、audit2allow で必要ポリシーを見つけたり、 ls -Z で他のモジュールとポリシーを比較したり、少しはSELinuxと仲良くなれたかもしれません。

NGINXのダイナミックモジュールのロードにはApacheのモジュールよりも一手間以上が必要

ngx_mrubyのダイナミックモジュールについては、ほぼ以下の記事で完結しています。本当にお世話になりました。

medium.com

実際に自分で手を動かしてみると、本当に面倒でした。

Dockerのバグ?にあたる。そしてCircleCIでは治っていない

やろうとしていたことはmod_mrubyのRPMビルドのために centos/7 イメージでhttpd-develを入れようとしただけなのですが、依存関係にあるhttpdがインストールされるときにエラーになるというものでした。

これは実は既に解決された問題のようで、ホストOS側のUbuntuでのAUFSの問題だったようです。

普通なら「じゃあホストOSのUbuntuを最新にしようか」ということになるかと思いますが、CircleCIのホストOSをいじれるわけはなく、仕方なくhttpdソースコードを取ってくるという形に変更しました。


たった2つのRPMリポジトリを実現するためだけに、なかなか大変でした。

リポジトリのパッケージ管理者の方には頭が上がりません。

なお

このRPMリポジトリの成果の一部はGMOペパボ福岡の有志開発合宿で作成されたものです。

街のレコ屋という場所

※正確にはCDショップの話です。

※DJの人たちの話ではなくて、ただのリスナーの話です。

今の時代、音楽はインターネット上でいくらでも得ることができて、様々なプレイリストがあるし、あの手この手でレコメンドがされます。

ただ、自分はおそらく古い人間で、誰かが万人のために企画したプレイリストなんかよりDJが自分のスタイルを詰め込んで作ったMIXCDのほうが最高だと思うし、機械がするレコメンドよりも街のレコ屋の中の人のオススメのほうが信用できます。

ところで、自分はいつも「ここぞという仕事の頑張り時」に、いつものレコ屋に直接行ってCDを買う癖があります。

「なんで今CDを買うのか」というと「インターネットにない音がCDにあるから」であって、別にiTunesで音楽を買わないわけではないです(調べたら、一番最近に購入したデジタル音源は Nai Palm / Needle Paw でした)。

もしかしたら自分の音の趣味が偏っているからかもしれませんが、「インターネットにない音楽」というか「自分の好きな音の世界の最新」を求めるときにレコ屋に行って中の人に聞くのが最適解だと思っています。

何度かCDを購入していると、好みを覚えていてくれたりしてさらにいろんな音を教えてくれるので最高です。しかも、現場のいろいろな情報付きで。本当にときどきハズレもあったりしてそれも良いです。

「あ、○○の新譜が出たよ」「最近来てなかったけど、○○のCDあるよ」「○○知ってる?CD出したよ」って。

ちなみに、自分は福岡に住んでいますがいつもここに行きます。

TROOP RECORDS

街のレコ屋、いいですよ。

@troop_records でGET!!!聴いて気合をいれる

git cloneしているソースコードからGitHubやGH:EのWebページを開く

前にも書いたとおり、マネージドクラウドチームで開発に関わっているのですが、今までと違って

  • まだ全てを追いきれていない
  • ある程度の規模のアーキテクチャなので複数のリポジトリに分かれている
  • 多くのOSSを活用している(もしくはOSSを自分たちで作って活用している)
  • GitHubだけでなくGH:Eも使っている
  • 何から何までGH:Eの上に書く文化
  • Slack活用がすごい

という状況です。

そうすると

  • 実装について具体的なコードを指して質問したい
  • リポジトリをまたいだ実装の議論がある
  • 日々の検討内容や進行ログをコードを指して記録したい

ということが多くあります。

そのたびに、手元のEmacsではそのソースコードを開いているのに、GH:EやSlackで質問や会話をするためにGitHubやGH:Eのページを開くのがかなり面倒でした。

やりたいことはEmacs上のカーソルの位置から該当ソースコードのページを開くことです(行のハッシュ付きで)。

「確かそんな.elがあったような気がする」と思ったのですが、せっかくなので自分で久しぶりにEmacs Lispを書いていました

が、だいたいできたあとで調べたら、やはりもっと良さそうなのがあったのでそっちを使うことになりました。

github.com

自分は以下のような設定をしています。

(require 'git-link)

(defun git-link-gocode (hostname dirname filename branch commit start end)
  (format "https://%s/%s/+/%s/%s"
    hostname
    dirname
    (or branch commit)
    (concat filename
            (when start
              (format "#%s" start)))))

(with-eval-after-load 'git-link
  (custom-set-variables '(git-link-open-in-browser t))
  (add-to-list 'git-link-remote-alist
               '("ghe\\.example\\.com" git-link-github)) ;; GH:Eのホストも対象に
  (add-to-list 'git-link-remote-alist
               '("go\\.googlesource\\.com" git-link-gocode))) ;; go get で取得したgoのコードも表示できるように

これでカーソルやリージョンを見てブラウザでソースコードのURLを開いてくれます。

便利。

GMOペパボに入社していました

入社エントリ頑張ろうと思ったのですが、余裕がゼロなので、ロリポップ!マネージドクラウドのJOINエントリをもって入社エントリとさせていただきます。

note.mu

ちなみに今どんな感じなのか

というのは半分冗談で、入社したばかりなのにいろいろ触らせてもらっています。本当いろいろです。

GoとかTypeScriptとかChefとか(今日はmruby)そういう今まで触っていない新しい技術スタックもですが、中だから見える細かい設計とか大きなアーキテクチャとかが面白いし勉強になります。まだ全然追えていないですけど。

開発合宿とか

入社前から誘ってもらっていた開発合宿も楽しく参加できました。

Instagram post by 101000LAB • Mar 11, 2018 at 2:59am UTC

なぜか丘に登ったりもしていました。

社内TechMTGとか

ホスティング事業部で本格的なTechMTGがあったので「自己紹介したらいいじゃん」ということでLTをさせてもらったりとか(本発表はチームレビューとかあったりして本気)

今日も新しいことをします

まだ全然追いつけない。

落ち着いたらまた感想とか書いていきたいです。

「半分冗談」ということは、つまりそういうことですね。

ダーマの神殿に行った気持ちで頑張る

2月末で株式会社Fusicを退職します。現在有給消化中になります。

気づけば11年目に突入していた

長いように思えますが、特に不満なくやってきていつの間にか勤続2桁に突入していました。

これがどれくらい長いかというと

  • バージョン管理のツール(サービス)でいうと、svn -> SVK -> GitHub (Git)
  • PHPでいうと、(使ったもので)5.1 -> 5.2 -> 5.3 -> 5.4 -> 5.5 -> 5.6 -> 7.1
  • PHPフレームワークでいうと、HTMLとPHPが一体 -> オレオレ+Smarty -> CakePHP1.2 -> CakePHP2 -> CakePHP3
  • サーバでいうと、レンサバ+DCメイン -> VPSメイン -> AWSメイン
  • エディタはずっとEmacs

というくらい長いです。

11年間、いろいろ思い出はありますが多すぎるので割愛。

(どうしても知りたい方は社内情報共有サービスに社内向け退職エントリを書いているので、Fusicに入社したら見れます

なぜ辞めるのか

いろいろキッカケや理由はありますが、一番の理由は

エンジニアとしての成長を加速させたかったから

です。

(自分の)成長度が足りない

10年以上同じ場所に居座って今、社内外を見渡すといろいろなことに目がつきます。

  • 全く新しい技術スタックをもったエンジニアがJOINしてきた
  • もともと自分が一番と思っていた技術スタックに対して、他のメンバーが台頭してきた
  • 自分と同じ方向で技術スタックを伸ばそうとしているエンジニアがいなくなった。理由は技術要素が多様化してきたから
  • 自分のレベルがあがるにつれて社内外のエンジニアとの差が少しづつわかるようになってきた

など。

Fusicに技術を伸ばそうとするエンジニア(特に若い人達)が多くなったことは喜ばしいのですが、

それよりも自分のなかで強かったのは「このままの自分の成長度だと確実にエンジニアとして死んでいく」という思いです。

100年の人生をエンジニアとして生きたい

今の自分のエンジニアとしての特性は「日々の業務を繰り返して何かを思いつくエンジニア」だと自己分析しています。

それは、GitHubリポジトリや個人で作ったサービスを振り返ってみてもそんな感じです。

一方で、LIFE SHIFT という本にもあるように、これからは下手したら100年の人生設計をする必要があります。

LIFE SHIFT(ライフ・シフト)

LIFE SHIFT(ライフ・シフト)

よくセカンドキャリアなどと言いますが、今のところ自分はエンジニアというワンキャリア( by 大杉漣 )で生き続けたいと考えています。

そういった意味で、「100年の人生をエンジニアとして生きたい」という条件で、今のまま(今の日々の業務)を続けていたら「成長度がぜんぜん足りない」と感じていました。

結局どうすればいいのかわかりませんでしたが、いろいろ考えた末「環境を変える」という選択肢をとりました。

ダーマの神殿

というわけで、

pepabo.com

3月からGMOペパボ株式会社にエンジニアとしてお世話になります。

技術スタック的にも、本当にほぼレベル1からのスタートになると思っています。もうダーマの神殿に行って転職した気分です。

そして、周りは追いかける対象となるエンジニアばかりです。

「もう伸びしろしかない」

そう言っていないと精神的にやってられないです。自分で飛び込んだとはいえヤバい。

GMOペパボ株式会社の皆様どうぞよろしくお願いします。

(もし、自分にヒトとしてダメなところがありましたら、文句はこの人この人までお願いします。)

これから

生息地

今まで通り、福岡です。

サーバーレスおじさん業とか

サーバーレスアーキテクチャについて、正直まだ興味はつきないので、趣味でやっていきたいです。

むしろ「サーバーレスつくるおじさん業」になったりしそうでドキドキしています。

ex-fusic として

自分のエンジニアとしてのキャリアは今のところ全てFusicでできています。

これは、本当に、全てです。

PHPCakePHPAWSもawspecもサーバーレスも、全てです。PHPはFusicに入社してから覚えました。

ちなみにいうと、「Fusic 20の信条」のGoogle検索結果も自分のGistです

井の中の蛙だったのかどうなのか。

これからの活動が「Fusicのメンバーからも見られる」と考えると気が引き締まる思いです。

入社したら

余裕ができたら入社エントリも書きたいです。ただ、余裕なんてない気がしてならないです。

最後に謝辞というか

やりたい放題やらせてもらって約11年、本当にお世話になりました。ありがとうございました。

が、

ちょっと言いたいことが。

まだ退社日前なので社内Slackが見えるのですが、なんか自分がいるときより面白いこといろいろやっていませんか??

なんか悔しいので、次の職場でも絶対面白いことやってやる。

後はよろしくおねがいします